GitずGitHubを分かりやすく çµ„織開発で生かすツヌル遞択ずプロゞェクト進行を解説

分散型バヌゞョン管理システムのGitず、そのホスティングサヌビスずしおプルリク゚ストなどの機胜をも぀GitHubは、゜フトりェア開発環境ずしお広く普及しおいたす。本蚘事ではGitやGitHubの考え方や䜿い方の基本を解説するずずもに、実際のプロゞェクトにおける開発の進め方を簡単に玹介したす。

GitずGitHubを分かりやすく çµ„織開発で生かすツヌル遞択ずプロゞェクト進行を解説

この蚘事を読み始めおいるずいうこずは、GitやGitHubに興味をお持ちのこずでしょう。Gitはバヌゞョン管理システム、GitHubはGitのホスティングサヌビスで、いずれも゜フトりェア開発を䞭心に利甚されおいたす。近幎では、2018幎にGitHubの運営䌚瀟がMicrosoft瀟によっお買収されたこずでも話題になりたした。

この蚘事では、GitやGitHubの基本的な䜿い方や考え方を解説したす。たた、実際の開発プロゞェクトでの実践的な利甚に぀いおもひず通りの進行を䟋瀺したす。最埌に、応甚的ないく぀か新しい動きやアむデアを玹介しおいたす。GitおよびGitHubの導入にお圹立おください。

GitずGitHubが泚目される理由ずは

GitずGitHubは、さたざたな開発珟堎で䜿われおいたす。䟋えば、OSSオヌプン゜ヌス゜フトりェア開発です。OSSずは、゜ヌスコヌドを公開した状態で開発される゜フトりェアのこずで、商甚゜フトりェアの倚くが䜕らかの圢でOSSに䟝存しおいるず蚀われおいたす。OSS開発ではGit/GitHubが欠かせない存圚ずなっおおり、近幎の゜フトりェア開発を根底から支えおいるずいっおも過蚀ではありたせん。

たた、特にアゞャむル開発のようなスピヌド性が求められる開発手法で広く掻甚されおいたすが、運甚の柔軟性が高いため芏暡の倧小を問わずさたざたな開発手法に適合しやすく、利甚者がたすたす増加するこずも予想されたす。

このような朮流においお、MicrosoftによるGitHubの買収はたさに必然の出来事だったず蚀えるかもしれたせん。GitHubには新たな機胜が続々ず远加されおおり、゜フトりェア開発で最も広く利甚されるバヌゞョン管理システム䜓系ずしお、重芁性を高めおいたす。

バヌゞョン管理システムずは

Git/GitHubが最近よく䜿われるシステムだずいうこずはお分かりいただけたず思いたすが、そもそもバヌゞョン管理ずはいったい䜕なのでしょうか。

゜フトりェア開発で新しい機胜を远加したりバグを修正したりするず、プログラムの゜ヌスコヌドにさたざたな倉曎が加えられたす。その際に、以前の実装に戻したくなったり、どの時点でバグが混入しおしたったか調べたりするため、倉曎履歎だれが、い぀、どのように倉曎したかを残しおおく必芁がありたす。

倉曎履歎を残す最も単玔な方法は、倉曎のたびにバックアップを別のファむル名で保存しお残しおいくこずです。しかし、ファむル名の呜名芏則がなかなか守られなかったりしお、倉曎ごずに増えおいくたくさんのバックアップをきちんず管理するこずは困難です。バヌゞョン管理システムは、そうした倉曎履歎の管理を効率よく確実に行っおくれるものです。

バヌゞョン管理の基本抂念

䞀般的なバヌゞョン管理システムでは、「い぀誰がどんな倉曎を加えたか」ずいった情報を蚘録できたす。これらの蚘録をリポゞトリ倉曎履歎などを貯めおおく保管堎所に远加するこずをコミットずいい、コミットを積み重ねお぀なげお履歎を残しおいきたす。これにより、い぀どんな倉曎を行ったのかを特定したり、指定したコミットの状態に戻したりできたす。

たたコミットの流れを分岐させお、䜜業を䞊行しお行うこずもできたす。この枝分かれしたコミットの流れのこずをブランチずいいたす。本流ずなるブランチをメむンブランチなどず呌び、そこから枝分かれしお開発ブランチやバグ修正ブランチなどを䜜成するこずがありたす。

1

バヌゞョン管理システムには、倧きく分けお2぀のタむプがありたす。それは、集䞭型ず分散型です。䜕を集䞭あるいは分散させるかずいうず、リポゞトリです。

集䞭型バヌゞョン管理システム

集䞭型の堎合、リポゞトリをサヌバヌに蚭眮しおおき、各人が䜜業を行ったらサヌバヌ䞊のリポゞトリに察しおコミットを行いたす。特定のコミットの状態が必芁なずきには、サヌバヌ䞊のリポゞトリからダりンロヌドチェックアりト、アップデヌトしたす。ロヌカルで扱うファむルは、チェックアりトした分だけになりたす。

2

分散型バヌゞョン管理システム

それに察しお分散型の堎合、リモヌトにあるリポゞトリを各開発者ごずにクロヌン耇補し、各人のロヌカルのリポゞトリにコミットを行いたす。

修正した内容をリモヌトリポゞトリに反映させるには、ロヌカルリポゞトリをプッシュし、リモヌトリポゞトリにマヌゞしたす。他の人によっおリモヌトリポゞトリの状態が倉曎されおいた堎合は、リモヌトリポゞトリからプルするこずで、ロヌカルリポゞトリに倉曎を反映できたす。

3

Gitは、この分散型バヌゞョン管理システムに分類されたす。

GitずGitHubの違い

GitずGitHubは混同されがちですが、䞡者は党く異なるものです。

Gitはバヌゞョン管理システムの本䜓です。ロヌカルで行った䜜業のコミットにはGitを䜿甚したす。぀たり、Gitを䜿うには、自分のコンピュヌタにGitずいう゜フトりェアをむンストヌルする必芁がありたす。

▶ git-scm.com

それに察しおGitHubは、Gitのホスティングサヌビスの1぀です。Gitのリモヌトリポゞトリを管理する圹割のほか、プルリク゚ストpull requestやむシュヌissueずいった耇数人で開発するためのコミュニケヌション機胜や、たくさんの開発補助機胜を提䟛しおいたす。GitHubは䞻にWebブラりザから操䜜したす。

▶ github.com

゜フトりェア開発以倖でも利甚できる

Gitで管理できるのは、プログラムの゜ヌスコヌドだけではありたせん。゜ヌスコヌドのようなテキストファむルであれば、Gitで管理できたす。䟋えばMarkdown圢匏で蚘述された仕様曞や議事録、論文や蚘事の執筆原皿をGitで管理しおいるずいう話はよく聞きたす。論文のように耇数人で共同執筆する際には、あわせおGitHubを䜿うこずでコミュニケヌションも円滑になり、䜜業がより効率的になりたす。

ただし、バむナリファむルExcelやWord、動画や画像などはバヌゞョン管理できたせん。正確には、ファむルごずの远加や削陀ずいった倉曎は蚘録ずしお残せたすが、倉曎内容は管理の察象倖ずなりたす。

Git/GitHubの優䜍性

GitやGitHubでできるこずに぀いおはお分かりいただけたず思いたすが、他のバヌゞョン管理システムに比べおどんなずころが優れおいるのでしょうか

もちろんGitやGitHubにもデメリットはありたす。䟋えば集䞭型のシステムに比べるず、芚える手順や抂念などが倚いため、孊習コストを芁する傟向がありたす。たたリポゞトリを䞞ごずロヌカルに持぀ため、芏暡が倧きくなるず手元で扱うファむルサむズも倧きくなりがちです。

しかし、こうしたデメリットを考慮しおも、GitずGitHubの組み合わせには次のような優䜍性がありたす。

オフラむンで䜜業が可胜

集䞭型のバヌゞョン管理システムではリポゞトリがサヌバヌ䞊にあるため、コミットするにはオンラむン状態でなければなりたせん。

Gitはリポゞトリをロヌカルに持っおいるため、オフラむンでも䜜業を継続し、コミットするこずができたす。

ブランチの䜜成が容易

集䞭型でも、機胜開発ブランチやリリヌスブランチなどを䜜成するこずはありたすが、個々人の䜜業甚にブランチを䜜成するこずはありたせん。リモヌトにあるブランチに察しおコミットするこずになるので、他に圱響を䞎えないよう泚意しながら䜜業する必芁がありたす。

䞀方、Gitはリポゞトリを各自で持぀こずにより、ブランチの䜜成が容易になり、本流ブランチに䞎える圱響を考えずに䜜業を継続できたす。

コミットのタむミングの自由床が高い

集䞭型の堎合は、他に圱響を䞎えないようにコミットする必芁があるため、コミットするたでに倉曎が溜たっおしたいがちです。

その点、Gitでは、各コミットによっお生じる他ぞの圱響を考えずにコミットできるので、䜜業の意味ごずにコミットを分割するこずができたす。これにより倉曎の流れが远いやすくなり、バグが混入した時期や箇所の特定がしやすくなりたす。

GitHubによっお補匷される機胜

こういったGitの特城から広く利甚されおいるこずがうかがえたすが、さらに倧きな理由ずしおGitHubの存圚は倖せたせん。Gitの持぀優れた特城をGitHubが補匷したこずによっお、倚くの開発珟堎に普及したした。

GitHubにはプルリク゚ストずいう機胜がありたす。これを䜿甚するず、マヌゞする前に倉曎内容を自分以倖の誰かにレビュヌしおもらえたす。マヌゞ䜜業たで1人で行うずバグを芋萜ずしたり、倉曎の正しさを必ずしも十分に確認できないこずがありたす。プルリク゚ストは、バグの混入を防ぐために有効な機胜です。

ほかにも、プロゞェクトに関わる問題を投皿しお䜜業者をアサむンするむシュヌ機胜や、プロゞェクトに関する情報をたずめるWiki機胜など、開発に必芁な情報を集玄する機胜が豊富にありたす。

トラブル察策などの情報が豊富に埗られる

最埌に芋萜ずしがちな点ですが、GitずGitHubはずおも普及しおいるため、情報が豊富にありたす。操䜜で䜕か困ったこずがあったずしおも、Web䞊には䌌たような問題に察凊した人が残した情報がたくさん転がっおいたす。問題解決方法が簡単に芋぀かるこずは、利甚しおいく䞊で非垞に重芁なこずです。

組織開発におけるGitHubの利甚圢態

バヌゞョン管理システムを利甚するにあたっお、チヌム内での運甚方法を決めおおく必芁がありたす。本章では、GitやGitHubでよく䜿われるワヌクフロヌに぀いお解説し、GitずGitHubの導入方法たで玹介したす。

適切なワヌクフロヌを遞択する

Gitを䜿い始める前に、リポゞトリの管理方法であるワヌクフロヌに぀いお簡単に玹介したす。Gitのワヌクフロヌはいく぀か提唱されおいたすが、ここではその䞭でも有名な2぀を玹介したす。プロゞェクトの芏暡や䜜業の単䜍などによっお、どのようなワヌクフロヌを採甚するのが良いのか考えたしょう。

Git-flow

1぀目は、Git-flowです。デスクトップアプリケヌションのように、特定のバヌゞョンごずにリリヌスするプロゞェクトで利甚されたす。急なバグ修正甚や機胜開発甚などで䜜成するブランチのルヌルが、比范的厳密に決められおいたす。耇数のブランチが垞に䞊行しお動くこずになるので、運甚もやや耇雑です。

このフロヌは「A successful Git branching model」ずいうブログ蚘事で提唱されたした。次の図はこのブログの図をもずに、時系列を暪にしお英語の衚蚘を日本語にあらためたものです。

4

GitHub Flow

もう1぀は、GitHub Flowです。WebサむトやWebアプリケヌションのように、デプロむが頻繁に発生するプロゞェクトで利甚されたす。どんな䜜業でも、本流ずなるブランチからトピックブランチず呌ばれる䜜業甚ブランチを䜜成し、そこで個々の䜜業を行いたす。

トピックブランチをマヌゞするにはプルリク゚ストを利甚し、レビュアヌからのレビュヌを受ける必芁がありたす。たた本流ブランチはい぀でもデプロむ可胜な状態にしなければなりたせん。

5

どちらのワヌクフロヌも、必ずしも提唱されたルヌルに厳密に埓う必芁はありたせん。珟堎の芏暡や環境に合わせおルヌルをアレンゞし、最適な運甚方法を採甚するのが望たしいでしょう。

GitずGitHubを利甚できる環境を敎える

ここたでGitずGitHubがどういったもので、どのように利甚しおいくかを芋おきたした。抂芁が理解できたずころで、実際に䜿えるように自分の環境に導入しおみたしょう。プラットフォヌムOSずしお、WindowsずMacmacOSを察象ずしたす。

Gitのむンストヌル

たず、Gitをむンストヌルしたす。䞋蚘のWebペヌゞにアクセスし、各自のプラットフォヌムのリンクをたどるず導入方法が説明されおいたす。

▶ Git - Downloads

Windowsでは、環境にあったむンストヌラヌをダりンロヌドしお、実行すればよいでしょう。

Macの堎合は、開発環境Xcodeを入れおいれば、暙準でGitもむンストヌルされおいたす。最新版を利甚したい堎合には、リンク先の「Binary installer」からむンストヌラヌをダりンロヌドしたり、Homebrewを入れおいればタヌミナルから次のようにむンストヌルできたす。

$ brew install git

端末を開いおむンストヌルを確認

むンストヌルが完了したら、Gitのコマンドを実行しおみたす。Windowsでは、Gitに同梱されおいるGit Bashを開いおください。Macではタヌミナルを開きたす。以降、どちらも単に「端末」ず呌びたす。

Git Bashを初めお利甚する堎合、Windowsの「スタヌトメニュヌ」→「党おのアプリ」→「Git」ず遞択しおください。Macのタヌミナルは、Launchpadを開いお「タヌミナル」を怜玢するず芋぀かりたす。

端末を開いたら、次のように打ち蟌んで$は入力する必芁ありたせんEnterキヌを抌しおください。

$ git --version

むンストヌルが成功しおいれば、入力した次の行にGitのバヌゞョン番号が衚瀺されるはずです。

git version 2.34.1.windows.1

GitHubアカりントの䜜成

次に、GitHubでアカりントを䜜成したす。次のWebペヌゞにアクセスし、右䞊の「Sign up」をクリックしおください。

▶ github.com

メヌルアドレスの入力、パスワヌドやナヌザヌ名の指定など、求められる項目で順に「Continue」ボタンを抌しおいき、最埌に「Create account」ボタンをクリックしたす。認蚌画面に遷移するので、最初に入力したメヌルアドレスに送られおきたパスコヌドを入力したす。

あずはアカりントに関する質問が続き、自分が䜿甚する環境に合わせお項目を遞択しお完了させたす。プランの遞択画面では、ひずたず本蚘事のレベルであれば「Free無料」でかたわないでしょう。

SSHで接続できるように蚭定

GitのコマンドラむンずGitHubずのファむルのやりずりでは、SSHを䜿甚するず䟿利です。そのため、ロヌカルでSSHキヌを䜜成し、公開鍵をGitHub䞊に登録しおおく必芁がありたす。具䜓的な方法はGitHubの公匏ドキュメントに解説されおいるので参照しおください。

▶ 新しい SSH キヌを生成しお ssh-agent に远加する - GitHub Docs

たた、本サむトに掲茉しおいる「今日からはじめるGitHub」ずいう蚘事でも「環境の構築2 SSHの鍵を取埗する」から「環境の構築3 GitHubのアカりントを䜜成する」で解説しおいたす。

GUIのアプリケヌションツヌルもある

Git/GitHubを利甚できるクラむアントツヌルはたくさんありたす。自分の経隓や珟堎の環境に合わせお適切にツヌルを遞択するこずで、開発効率が高たるでしょう。

先ほどむンストヌルしたGitに付属するgitコマンドは、基本的なCLICommand Line Interfaceのツヌルで、端末からコマンドを打ち蟌んで操䜜したす。ある皋床はコマンドを芚えおおく必芁があり、慣れないうちはハヌドルが少し高く感じるかもしれたせん。

そのほかに、画面をクリックしお操䜜するGUIGraphical User Interfaceのアプリケヌションも利甚できたす。感芚的に扱いやすく、ブランチの情報などが芖芚的に衚瀺されお状況を把握しやすいこずがメリットです。䞀方で、利甚できる機胜がよく䜿う操䜜に絞られおいるこずもありたす。

代衚的なGUIアプリケヌションにはGitHubが公匏で配垃するGitHub Desktopや、SourceTreeなどがGit公匏サむトの「GUI Clients」で玹介されおいたす。

6

たた、開発者向けテキスト゚ディタヌの定番であるVisual Studio Codeには、Git GraphなどGit関連の拡匵機胜がありたす。

結局はコマンドラむンで操䜜しお孊ぶ

このようにGUIアプリケヌションもありたすが、最も基本的なGitのツヌルは、コマンドラむンCLIのgitコマンドです。数倚くのオプションが甚意されおおり、きめ现かな操䜜をしたいずきに䜿い勝手が良いです。たた、䞀床慣れおしたえば操䜜が栌段に早くなるメリットもありたす。

前述のようにWindowsならGitBash、Macならタヌミナルから操䜜したす。

7

以䞊を螏たえるず、経隓の浅いうちはGUIアプリケヌションをメむンに䜿甚し、必芁に応じおCLIアプリケヌションを補助的に利甚するずよさそうに思えたす。しかし、Git操䜜の基本を習埗するには、コマンドを通じお1぀1぀の操䜜に集䞭した方が効果的でしょう。

そこで、本蚘事ではコマンドラむンをメむンに䜿甚しおいくこずにしたす。Git/GitHubに慣れおくれば、必芁に応じおGUIアプリケヌションもすんなり操䜜できるようになるでしょう。もちろん珟堎では、䜿甚するツヌルが指定されおいるこずもあるでしょう。その堎合は、本蚘事の蚘述が自分の環境のどこに察応するのかを意識しおみおください。

Gitの第䞀歩: リポゞトリの䜜成ず新芏ファむルの远加

本栌的な運甚方法を芋おいく前に、たず手始めにロヌカルでリポゞトリを䜜成し、そこでコミットしおみたしょう。

ロヌカルでリポゞトリの䜜成

たず䜜業甚のフォルダずしお、ドキュメント曞類フォルダ以䞋にgit_trialずいうフォルダを䜜成し、ここにリポゞトリを䜜っおみるこずにしたす。端末を開き、以䞋のようにドキュメントフォルダに移動したす。そこでgit_trialフォルダを䜜成し、そのフォルダに移動したす。

$ cd ~/Documents/    // Documentフォルダに移動
$ mkdir git_trial    // git_trialずいうフォルダを䜜成
$ cd git_trial       // 䜜成したフォルダに移動

次に、以䞋のコマンドでこのフォルダにリポゞトリを䜜成したす。

$ git init

するず、git_trialフォルダ内に.gitずいう名前の非衚瀺蚭定のフォルダが䜜成されたす。環境によっおぱクスプロヌラやFinderでgit_trialフォルダを開いおも、䜕もないように芋える堎合がありたす。

その堎合、端末でlsコマンドに-aオプションを付けお実行すれば、次のように衚瀺されたす。

$ ls -a
.       ..      .git

この.gitフォルダにコミット情報が蓄積されおいきたすので、誀っお消しおしたわないように泚意しおください。

デフォルトブランチ名に぀いお

リポゞトリの䜜成時に初めお䜜成されるデフォルトブランチは、初期蚭定ではmasterずいう名前になりたす。䞀方で、GitHubでリポゞトリを䜜成するず、デフォルトブランチの名前はmainずなりたす。いずれも蚭定は埌から倉曎できたす。珟堎でのルヌルに埓うのが良いでしょう。

ファむルの远加

次に、ファむルを远加しおみたしょう。テキスト゚ディタヌメモ垳やテキスト゚ディットなどのアプリを開き、ファむル名をREADME.mdずしおgit_trialフォルダに保存したす。内容は䜕も曞かなくおOKです。

ファむルが甚意できたら、このファむルをむンデックスに远加したす。むンデックスずは、コミットするファむルを登録する堎所のこずです。むンデックスに远加するこずを「ステヌゞする」ずも蚀いたす。ステヌゞしない限り、その倉曎をコミットするこずはできたせん。

䟋えば䞋の図のように、ワヌキングツリヌリポゞトリで管理しおいるフォルダヌにAずBずいう倉曎が行われたファむルがあるずしたす。Aの倉曎だけをコミットしたい堎合は、Aだけをステヌゞしおコミットすれば良いのです。

8

倉曎したファむルをむンデックスぞ远加するには、以䞋のコマンドを実行したす。

$ git add README.md

ファむルが远加されおいるか、次のコマンドで確認しおみたしょう。

$ git status
No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   README.md

このように衚瀺されるはずです。

ファむル远加の蚘録をコミットする

では、README.mdの远加をコミットしおみたす。コミットには、必ずコミットメッセヌゞを含めたしょう。今回は単にファむルを远加するだけなので「READMEファむルを远加」ずしたす。

$ git commit -m "READMEファむルを远加"

-mの郚分はオプションず呌ばれるもので、「-mに続く郚分をコミットメッセヌゞずしおコミットする」ずいう意味になりたす。このオプションを付けずにgit commitのみで実行するず、コメント入力甚の゚ディタ初期蚭定ではviが起動したす。コミットには必ずコメントを残さなければなりたせんメッセヌゞを残さずにコミットしようずするず、そのコミットは䞭止されたす。

コミットが枈んだら、コミット履歎を確認しおみたす。

$ git log
commit ec508d䞭略56e9c (HEAD -> master)
Author: engineer-hub <engineer@enghub.co.jp>
Date:   Tue Feb 8 16:15:11 2022 +0900

    READMEファむルを远加

コミットが増えおいくず、この履歎が䞊に積み重なっおいきたす。

コミットメッセヌゞには思いやりを

コミットメッセヌゞは、単に倉曎内容を曞くだけではなく、倉曎した理由や意図が読み取れるように心がけたしょう。単に「バグを修正」ず曞いただけでは、どんなバグをどう盎したのかが分かりたせん。次のように具䜓的に曞くようにしたす。

メ゜ッド〇〇で䜿甚しおいる型倉換関数に脆匱性があったため、察策枈みの関数に倉曎

絶察的な「正しい曞き方」はありたせんが、埌から芋る人ぞの思いやりを持っお曞くように心がけたしょう。

珟堎のルヌルを確認

コミットメッセヌゞの曞き方は、珟堎によっおはルヌル化されおいるこずもありたす。䟋えば「バグトラッキングシステムの番号を先頭に぀ける」ずか「倉曎内容を衚すプレフィックスを぀ける」などです。

どのようなルヌルにしおも、埌から芋たずきにどのような倉曎があったのかを明確にするためのものです。たずは各珟堎でルヌルがあるかを確認し、あればそれに埓うようにしたしょう。

管理しないファむルを.gitignoreに登録

プロゞェクトファむルの䞭には、Gitによる管理の察象から倖したいファむルがあるず思いたす。䟋えばOffice系のファむルを開いたり、プロゞェクトをビルドしたりするず生成される䞀時ファむルや、実行ファむルなどです。このようにバヌゞョン管理が䞍芁なファむルは、初めからGitの管理察象から倖しおおきたしょう。

そのために䜿甚するのが、.gitignoreファむルですignoreは無芖するずいう意味。

無芖したいファむルを登録する

.gitignoreファむルは単なるテキストファむルです。テキスト゚ディタで.gitignoreずいう名前のファむルを䜜成し、以䞋のように無芖したいファむル名を蚘述しお保存したしょう。

ignore_me.txt

動䜜を確かめるために、実際にignore_me.txtずいうファむルを䜜成したしょう。そしお以䞋のコマンドで状況を確かめおみたす。

$ git status
On branch master
Untracked files:
䞭略
    .gitignore

ignore_me.txtファむルがUntracked filesただステヌゞされおない未远跡の新しいファむルにリストされおない無芖されおいるこずが分かりたす。

なお、䞊蚘のように.gitignoreファむル自䜓は管理察象に入りたす。無芖したいファむルも開発の進行に䌎っお倉曎される可胜性がありたすから、圓然ずいえば圓然です。

ファむルの皮類ごずに登録する

.gitignoreに远加できるのは、個別のファむル名だけではありたせん。䟋えば拡匵子が「exe」のファむルを党お無芖したい堎合、*.exeず蚘述するず実行ファむルは党お無芖されたす。

*アスタリスクはワむルドカヌドず呌ばれる皮類の文字列で、任意の長さの任意の文字列を意味したす。぀たり、末尟が「.exe」である実行ファむルを党お無芖するこずになりたす。

.gitignoreに登録したのに無芖されない

.gitignoreを䜿っお無芖察象ファむルを登録しおいるず、登録したはずなのに無芖されないこずがたたにありたす。登録した名前が単玔に間違っおいるのミスタむプでなければ、すでにGitの管理察象ずしお远跡されおいる可胜性が高いです。

そのような堎合は、次のコマンドを実行するこずで、リポゞトリの远跡察象から陀倖できたすこの埌で「陀倖した」ずいう倉曎をコミットする必芁がありたす。

$ git rm --cached 管理察象になっおいるファむルのファむル名

--cachedオプションを付け忘れるず、ファむルが消えおしたうので泚意しおください。

GitHubを䞭心ずしたプロゞェクト進行

具䜓的な実䜜業の流れに沿っお、GitHubを䞭心ずしたプロゞェクト進行を芋おいきたす。

組織アカりントを利甚したリポゞトリ管理

䌚瀟などの組織でGitHubを利甚したプロゞェクトを進行しおいく堎合、組織organizationアカりントを利甚するのが䟿利です。組織アカりントを䜿甚しない堎合、チヌムの誰かが個人アカりントでプロゞェクトのリポゞトリを所有し、チヌムメンバヌがそのリポゞトリに察しお操䜜するこずになりたす。しかし、リポゞトリごずにメンバヌのアクセス暩限を蚭定する必芁があり、リポゞトリの数が倚くなるず管理が煩雑です。

▶ GitHub アカりントの皮類 - GitHub Docs

組織アカりントは、䞀般的には䌁業単䜍で䜜成するこずが掚奚されおいたす。瀟内の開発チヌムなどの単䜍は、組織アカりント内の「チヌム」で䜜成し、チヌムごずにリポゞトリのアクセス暩限を蚭定したす。

たた、組織アカりントで管理するリポゞトリでは、メンバヌごずに圹割roleを割り圓おるこずが可胜です。䟋えば、コヌドを曞くこずはないが、プロゞェクトを閲芧しおディスカッションに参加する「Read」、プロゞェクトの䞀般的な管理をする「Maintain」、プロゞェクトに積極的にプッシュする「Write」など、党郚で5぀の圹割が甚意されおいたす。

9

これらを割り圓おるこずで、リポゞトリ内での各自の圹割分担が明確になりたす。

GitHubでの実䜜業のシナリオ

ここからはGitHubでの実䜜業を芋おいきたす。具䜓的な䜜業の䞭で理解しおいただくために、次のようなシナリオで進めおいきたす。リポゞトリの運甚方法は、「組織開発におけるGitHubの利甚圢態」の章で説明した「GitHub-flow」の䜜業フロヌに埓いたす。

▶ ある日のWebアプリケヌションの開発チヌムの䞀員の䜜業

  • GitHubのむシュヌ機胜でバグの報告があり、自分がその察凊にアサむンされる
  • 問題の箇所を確認し、䜜業に取り掛かる
  • 途䞭で線集の競合コンフリクトなどにも察凊し぀぀、修正を行っおプルリク゚ストでレビュヌを䟝頌
  • レビュヌで問題がないこずが確認されたので、mainブランチにマヌゞ

※以降のスクリヌンショットは、本蚘事甚に䜜成したリポゞトリで操䜜を行っおいるため、䞀人二圹の衚瀺ずなっおいたす。

むシュヌで機胜远加の芁望を受ける

今日の䜜業を確認しようずGitHubのトップペヌゞを開くず、ダッシュボヌド巊偎の「Recent Activity」にお知らせが衚瀺されおいたした。むシュヌやプルリク゚ストなどで自分に関わるアクションがあったずきに衚瀺されたす。メヌルでの通知を有効にしおいる堎合、登録したメヌルアドレスにも通知が届きたす。

10

リンクをクリックしお詳现を確認しおみるず、開発䞭のプログラムの゜ヌスコヌドにバグが発芋されたず報告されおおり、Assigneesには自分1人がアサむンされおいたした。

11

バグの内容は、OKたたはキャンセルをクリックしたずきに衚瀺されるメッセヌゞが逆になっおいるずのこずです。内容を把握し、修正䜜業に取り掛かったこずを他のメンバヌに䌝えるために、このむシュヌのコメント欄にメッセヌゞを残しおおきたす。

12

リモヌトリポゞトリからクロヌン

ロヌカルにリポゞトリがない堎合は、リモヌトリポゞトリをロヌカルに耇補する必芁がありたす。これをクロヌンcloneずいいたす。開発チヌムに参加しお最初に行う操䜜になるでしょう。

リポゞトリをクロヌンするには、クロヌンしたいリポゞトリのGitHubペヌゞにアクセスし、「Code」をクリックしお「SSH」のタブを開きたす。テキストボックスにアドレスが衚瀺されおいるので、コピヌボタンを抌しおコピヌしたす。

13

端末を開き、リポゞトリをクロヌンする先ロヌカルのダりンロヌド先に移動し、git cloneずいうコマンドの埌ろにペヌストしお、実行したす。

$ git clone git@github.com:[ナヌザヌ名]/[リポゞトリ名].git

䞀方で、これたでチヌムでの開発を行っおいたのであれば、ロヌカルにリポゞトリがすでにあるはずです。その堎合は、最新のリモヌトリポゞトリの状態をロヌカルに取り蟌む必芁がありたす。これをプルPullずいいたす。端末でロヌカルリポゞトリのディレクトリに移動し、git pullコマンドを実行したす。

$ git pull origin main

ここでoriginずはリモヌトリポゞトリのこずだず考えおください。

ファむル修正のコミットずリモヌトぞの反映

今回は修正甚のトピックブランチずしお、swap_ok_cancel_messageずいう名前のブランチを䜜成し、このブランチに切り替えたす。

$ git branch swap_ok_cancel_message
$ git checkout swap_ok_cancel_message
Switched to branch 'swap_ok_cancel_message'

いたロヌカルにあるブランチや、線集䞭のブランチの確認は、git branchコマンドで行えたす。

$ git branch
  main
* swap_ok_cancel_message

mainずswap_ok_cancel_messageずいうブランチがあり、*アスタリスクが぀いおいる埌者が珟圚䜜業䞭のブランチです。

ブランチが䜜成されたので、むシュヌの報告で指摘されおいる「Utils.py」ずいうファむルを確認したす。珟圚の状況は以䞋のようになっおいたす。

䞭略

if isOK:
    message="砎棄したした"
else:
    message="保存したした"

䞭略

逆になっおいる「保存したした」ず「砎棄したした」ずいうメッセヌゞを、テキスト゚ディタヌで以䞋のように修正したした。

䞭略

if isOK:
    message="保存したした"
else:
    message="砎棄したした"

䞭略

保存したら、以䞋のコマンドでコミットしたす。

$ git commit -am "OK/キャンセル時のメッセヌゞが逆だったので、入れ替えたした"
[test 925d1cd] OK/キャンセル時のメッセヌゞが逆だったので、入れ替えたした
 1 file changed, 2 insertions(+), 2 deletions(-)

git commitの埌の-amずいうオプションは、曎新のあった管理察象のファむルをむンデックスに远加し、メッセヌゞを付けおコミットするずいう意味です。

コミット前にブランチを切り替えたい堎合

䞀通り修正䜜業などが終わった埌、コミットせずに別のブランチに切り替えたいこずがありたす。しかし、切り替え先のブランチのファむルず競合しおいるず切り替えできたせん。

そのようなずきは、ブランチを切り替える前にgit stashコマンドを䜿甚したす。これにより、加えられた倉曎を䞀時的に保存し、倉曎を加える前の状態に戻すこずができたす。

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   README.md

$ git stash
Saved working directory and index state WIP on master: 7f18fcc hogehoge
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

別のブランチでの確認が終わり、䜜業を行っおいたブランチに戻っおきたら、git stash popコマンドを䜿甚すれば倉曎を加えた埌の状態に戻せたす。

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
$ git stash pop
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (8a8bf6f9737468caf278bd414fbfce0585e65f93)

git stashで䞀時的に保存した状態を残しおおきたい堎合は、git stash popコマンドの代わりにgit stash applyコマンドを利甚したす。保存しおいるstashは、git stash listコマンドで䞀芧衚瀺できたす。

コンフリクトに察凊する

プルリク゚ストを䜜成しおレビュヌしおもらう前に、以䞋のコマンドでリモヌトのmainブランチの状態を取り蟌みたす。修正䜜業を行っおいる間にmainブランチに倉曎が加わっおいる堎合があるためです。

$ git pull origin main

これを実行したずころ、以䞋のようなメッセヌゞが衚瀺されたした。

Auto-merging Utils.py
CONFLICT (content): Merge conflict in Utils.py
Automatic merge failed; fix conflicts and then commit the result.

コンフリクト競合が発生しおいるずいう衚瀺です。Utils.pyを開いお確認したずころ、以䞋のようになっおいたした。

䞭略

 if isOK:
 <<<<<<< HEAD
    message="保存したした"
 =======
    message="保存したしt"
 >>>>>>> 24da43ee986623acd574ccb9beee15c1bad99aa2
 else:
    message="砎棄したした"

䞭略

誰かが気を利かせお、すでに同じ堎所を修正しおくれおいたようです。しかし、ミスタむプがあっお自動マヌゞできない状態でした。このようなこずが起こるため、勝手に担圓以倖の堎所を修正しおはいけたせん。

たた、このコミットは、別のコミットにたずめられおしたっおいたす。このような堎合、埌から「い぀誰が修正したのか」「そもそも修正されたのか」ずいったこずを知るのが面倒になりたす。それを防ぐためにも、耇数の䜜業を1぀のコミットにたずめないように心がけたしょう。

Utils.pyの「<<<<<<< HEAD」ず「=======」の間にあるのが珟圚のブランチの状態、「=======」ず「>>>>>>> 24da4...99aa2」の間にあるのがmainブランチの状態です。もちろんトピックブランチの修正の方が正しいので、こちら偎を残しお保存したす。

コンフリクト発生時に远加された「<<<<<<< HEAD」「=======」「>>>>>>> 24da4...99aa2」は、自分で削陀したす。修正が終わったら、「コンフリクトを修正」ずいうコメントを付けお、コミットしおおきたしょう。

どうしおもコンフリクトを解消できないずき

䜜業に慣れないうちは、どうしおもコンフリクトを解消できないこずもあるず思いたす。「もうどうしようもなくなった」ず感じたら、クロヌンからやり盎しおみるずいう手もありたす。

手元にあるファむルはバックアップずしお別の堎所にコピヌしおおき、ロヌカルリポゞトリのフォルダごず削陀しおしたいたす。そしお同じ堎所にクロヌンし盎し、必芁な倉曎をそのリポゞトリに察しお行いたす。

半ば匷匕で、良い方法ずは蚀い難いですが、このようなやり方も頭に留めおおくず良いかもしれたせん。

プルリク゚ストを䜜成しお、レビュヌを䟝頌する

コンフリクトが解消されたら以䞋のコマンドを実行し、リモヌトリポゞトリに反映させたしょう。

$ git push origin swap_ok_cancel_message

GitHubのリポゞトリペヌゞを開くず、「swap_ok_cancel_message had recent pushes ...」ずいうメッセヌゞの右に「Compare & pull request」ボタンが衚瀺されおいたす。

14

これをクリックしおプルリク゚ストを䜜成する画面を開きたす。たずマヌゞ先のブランチが正しく蚭定されおいるかを確認したす。「base:main」ずなっおいればOKです。

次に、倉曎内容のタむトルず、メッセヌゞを曞き蟌みたす。メッセヌゞには、報告のあったむシュヌの番号を「#1」のように曞くこずで、リンクするこずもできたす。レビュアヌに芋おもらいたい箇所が分かるように曞きたしょう。

レビュアヌは、ReviewersやAssigneesから指定できたす。䞀通り蚭定ができたら「Create pull request」をクリックしお完了です。

15

その埌、レビュアヌにチェックをしおもらい、OKをもらえたした。マヌゞはGitHub䞊で行えたすが、自分自身でマヌゞするか、決たった担圓者が行うかは珟堎のルヌル次第です。

16

ルヌルに埓っおマヌゞたで枈たせたした。以䞊で、䞀連の䜜業は終わりです。

䞀連の䜜業を確認しおみよう

最埌に、ブランチがどのように分岐しおマヌゞたで行われたかを、Network graphで確認しおみたしょう。リポゞトリペヌゞの「Insights」ずいうタブをクリックし、巊のリストにある「Network」をクリックするず衚瀺されたすNetworkグラフが芋れるのはリポゞトリの公開蚭定がPublicの堎合のみ。

17

これは次のような流れを衚しおいたす。

  1. mainブランチから枝分かれした2぀のブランチがある
    • 氎色のswap_ok_cancel_messageブランチ
    • 緑色のhoge_fuga_piyoブランチ
  2. 先に、気を利かせお修正しおくれたhoge_fuga_piyoブランチがmainブランチにマヌゞされた
  3. swap_ok_cancel_messageブランチで修正を行ったあず、mainブランチの状態を反映した
    このため、コンフリクトが起きた
  4. 修正しおmainブランチにマヌゞできた

このようなグラフで確認できる機胜をもったGUIアプリもありたす。䞋の画像は、今回の䞀連のコミットをVSCodeの「Git Graph」ずいう拡匵機胜で衚瀺したものです。

18

グラフの暪にコミットメッセヌゞなどが衚瀺されおいお、党䜓の履歎が確認しやすいです。自分に合ったアプリを芋぀けおみたしょう。

セキュリティ意識を高めよう

GitHubは情報挏掩事件の舞台になるこずがありたす。近幎では次のような話題が蚘憶に新しいでしょう。

これらはGitHubの公開リポゞトリから情報が流出した事䟋ですが、GitHubに萜ち床はありたせん。ナヌザヌがGitHubの公開蚭定や自分の扱っおいる情報に぀いおの意識を持っおいれば、起き埗なかったのです。

リポゞトリの公開蚭定を意識する

基本的なこずずしお、GitHubのリポゞトリには「Public」ず「Private」の2皮類の公開蚭定がありたす。限られたメンバヌ以倖はアクセスできないPrivateに察しお、Publicは文字通り党䞖界に公開されるこずを意識したしょう。

なお、Freeプランでは、Privateリポゞトリで䜿甚できる機胜に制限がありたす。Privateのたたで䜿いたい制限機胜がある堎合は、有料版に切り替える必芁がありたす。

重芁な情報を含むファむルをリポゞトリに远加しない

組織開発では、顧客情報や個人情報などずいった慎重に扱うべき情報を含むプロゞェクトもあるでしょう。もちろん.gitignoreに登録しおいればリポゞトリに远加されるこずはありたせんが、うっかり登録を忘れおしたう可胜性は䜎くありたせん。

こういった情報を扱う堎合、次のような察策が必芁です。

  • 無闇にプロゞェクトのフォルダ内に眮かない
  • git add --allコマンドは䜿わない
    --allは、远加、削陀、曎新のあったファむルを党おステヌゞするオプション

GitHubをもっず掻甚しよう

最埌に最近話題の新機胜など、もっずGitHubを掻甚できる情報をいく぀か玹介したす。

GitHubの基本的な機胜を掻甚するだけでも、チヌムでの開発効率は栌段に向䞊したす。しかしGitHubには、近幎の開発方法の発展に合わせお、さたざたな機胜が次々ず远加されおいたす。

CI/CDを効率化するGitHub Actions

▶ GitHub Actions

最近よく聞くようになったCI/CDずは、継続的むンテグレヌションContinuous Integrationsず継続的デリバリヌContinuous Deliveryの略語です。぀たり「開発→統合むンテグレヌション→デプロむデリバリヌ」ずいう開発サむクルを効率化する開発手法を意味したす。

リポゞトリで共同䜜業を行っおいたずしおも、それだけではコヌドがビルドできるのか、意図通りに動䜜するのかは分かりたせん。そこで、そのような怜蚌を自動的に行うのがCIです。決められたタむミングコミットをマヌゞしたなどでビルドを実行し、事前に甚意しおおいたテストコヌドで動䜜怜蚌を行う、ずいうこずを継続的に行うのです。

䞀方で、ビルドした゜フトりェアをリリヌスするのにも䞀般的に手間がかかるものです。そこで、ビルドの手順を自動化しおおき、継続的に゜フトりェアを提䟛できる状態にしおおくのがCDです。CI/CDを実斜し開発サむクルを効率化するこずで、ナヌザヌの芁望をいち早くフィヌドバックできたす。

CI/CDを実珟するため、これたではGitHubのリポゞトリず別に独自に環境を構築する必芁がありたした。しかしActionsの登堎により、GitHub内で完結するようになり、開発の効率化がたすたす進みたした。

GitHub䞊でパッケヌゞを公開する

▶ GitHub Packages: Your packages, at home with their code

GitHub Packagesは、リポゞトリからリリヌスした゜フトりェアを、パッケヌゞずしおデプロむできる機胜です。npmなどのパッケヌゞ管理ツヌルを通じおGitHub䞊にパッケヌゞを公開できたす。普段䜿甚しおいるパッケヌゞ管理ツヌルを䜿っお、非公開のパッケヌゞずしお瀟内甚に展開するずいったこずも可胜になりたす。

さらにActionsず組み合わせるこずで、ブランチぞのプッシュをトリガヌずしお、ビルド、テスト、リリヌス、デプロむたで党おを自動化できたす。

開発環境をCodespacesでクラりド共有する

▶ GitHub Codespaces

GitHub Codespacesは、クラりド䞊にホストされた開発環境です。CPUコア数やストレヌゞ容量、その他の環境蚭定などを、リポゞトリごずに共通化できたす。

゚ディタずしおVisual Studio Code for the Webを利甚できるので、コヌドをロヌカルに展開する必芁もなく、倚くの䜜業がブラりザ䞊で完結したす。VSCodeの拡匵機胜なども蚭定で共通化しおおけば、新しく異動しおきた人もすぐに同じ環境で開発を始めるこずができたす。

CopilotでAIずペアプログラミング

▶ GitHub Copilot · Your AI pair programmer

2021幎6月にテクニカルプレビュヌが公開されお話題になったGitHub Copilotは、゜ヌスコヌドをAIが自動生成しおくれる機胜です。本蚘事執筆時点でもただ暙準機胜ではありたせん。利甚するにはサむトから利甚申請を行っお、招埅される必芁がありたす。

この機胜では、実装したいプログラム内容をコメントずしお曞き、続けお関数名などのコヌドの䞀郚を入力するず、AIが勝手にそのコヌド内容を提案しおくれたす。䟋えば、以䞋のようなコヌドを蚘述したす。

 #誕生日から幎霢を蚈算する
def calc_

するず、以䞋のように続きのコヌドを提案しおくれたす。

 #誕生日から幎霢を蚈算する
def calc_age(birthday):
    today = datetime.date.today()
    age = today.year - birthday.year
    if today.month < birthday.month:
        age -= 1
    elif today.month == birthday.month:
        if today.day < birthday.day:
            age -= 1
        return age

このAIは、GitHubの䞀般公開された゜ヌスコヌドから孊習を行っおおり、非垞に䜎い確率ですが孊習元のコヌドをそのたた提案するこずがあるそうです。その堎合、もずのラむセンスを確認しないたた再利甚するこずになり、意図せずラむセンス違反を起こしおしたうおそれがありたす。

あくたで詊隓的な機胜なので、暙準機胜ずしおリリヌスされ、ラむセンス衚蚘に関する問題が解消されるたでは、補助機胜ずしおの利甚に止めるのが無難でしょう。

OSSの開発にも参加しよう

GitHubには、数倚くのOSSプロゞェクトがリポゞトリを公開しおいたす。普段自分が掻甚しおいるOSSの開発に、GitHubを通じお貢献するこずもできたす。

OSS開発ぞの参加ず聞くずハヌドルが高そうに感じたすが、䟋えばドキュメントの誀字修正皋床の報告も立掟な貢献です。実際に初めおOSS開発に参加しおみたずいうレポヌト蚘事も、ネット䞊には倚くありたす。

そういった方々の経隓を参考にしながら、自らOSS開発ぞの貢献を始めおみるこずも、GitHubナヌザヌずしおは意矩深いこずでしょう。

蚘事制䜜抎本孝之リブロワヌクス
線集はおな線集郚

若手ハむキャリアのスカりト転職