Gitのしくみがわかりにくい - Gitのソースコード編集ワークフロー
Gitでソースコードを編集する基本的な操作の流れを紹介します。
チームで編集する場合、一人で複数の作業を並行して編集する場合
チームで編集する場合は複数の作業が競合しないようにする必要があることや、リリース物となるマスタの品質管理が必要になるため、プルリクエストという仕組みを利用します。
バージョン管理システムはチーム開発での利用が前提ですので、プルリクエストを利用するスタイルが一般的です。
1. リポジトリの複製
サーバーにあるリモートGitリポジトリをローカルに複製します。
最初はローカルには何もリポジトリがないためローカルにリポジトリを複製します。
リポジトリの複製(クローン)により、ローカルにリポジトリが作成されます。Subversion や CVSではチェックアウトと同様の操作になります。SubversionやCVSではファイルがサーバーから送信されてきて配置される仕組みですが、Gitではローカルにもリポジトリが作成され、ローカルのリポジトリに対してコミットなどの操作ができる仕組みになっています。
2. ブランチの作成
自分の編集作業により、バグの作りこみをリリース版に含めてしまい、プロダクトの安定性を損なわないようにするため、あるいは他のメンバーの編集作業と競合することを防ぐために「ブランチ」を作成します。
ブランチを作成しないとリリース版を管理するmasterへのコミットとなり、全体への影響が出てしまいます。例として、作成したブランチの名称を [ブランチ1] とします。
3. 編集作業
ファイルを編集したり、ファイルを追加したりします。
4.ローカルGitリポジトリ(ブランチ)へのコミット
ローカルのGitリポジトリに編集内容をコミットします。コミット先は先ほど作成したブランチ(ブランチ1)になります。
作業が複数に分かれる場合はローカルリポジトリへのコミットを複数回に分けても大丈夫です。
5.リモートのGitリポジトリ(ブランチ)へのプッシュ
ローカルGitリポジトリで編集した内容をリモートのGitリポジトリに反映します。この作業を「プッシュ」と呼びます。
編集を開始する際にブランチを作成していますので、リモートのGitリポジトリのブランチに対してプッシュします。
プッシュが成功すると、リモートのリポジトリにブランチが作成され、ローカルリポジトリのコミットもリモートのリポジトリのブランチに反映されます。
初回のプッシュまでは、追跡ブランチがない状態ですが、ブランチのプッシュが一度されるとリモートリポジトリにブランチ(ブランチ1)が作成され、ローカルにブランチ1の追跡ブランチが作成され、リモートリポジトリの変更を追跡できる状態になります。
6.編集作業の続き
必要に応じて、ローカルGitリポジトリへのコミットとリモートGitリポジトリへのプッシュを繰り返します。
7.プルリクエスト
予定した編集がすべて完了しましたら、ブランチで変更している内容をマスタに反映する必要があります。
ブランチをマスタにマージする作業を実施しますが、マスタへのマージはプロダクトマネージャーなど限られたメンバしか実施できない場合もあり、自分ではできない場合もあります。
Gitではブランチをマスターにマージする依頼をする必要があります。Gitリポジトリでのブランチのマージの依頼を「プルリクエスト」と呼びます。
プルリクエストを出し、先ほど作成したブランチをマスタにマージしてもらいます。
8.マージ
プルリクエストを受け取ったリポジトリの管理者(プロダクトマネージャーなど)は変更内容を確認して、OKであればプルリクエストを承認して、マスタにマージします。
プルリクエストが完了しマージできたら、ブランチは不要となりますので、ブランチは削除します。
また、マージの方法にはいくつかの種類があります。マージの種類は
こちらの記事を参照してください。
マージが実行されると、マージコミットには2つの親ができます。
ブランチを作成した時点のコミットIDを1003、プルリクエストでマージした最新のコミットのIDを1008とすると、
マージコミットには親1IDとして1008が、親2IDには1003が設定されます。複数の親がある場合は"親1"のルートがメインの変更履歴のルートになります。
9.編集完了
プルリクエストが承認されマスタにマージされたことで、編集作業は完了します。
リモートリポジトリからプルしてローカルリポジトリを最新の状態に更新します。
一人で編集する場合
一人で編集する場合は競合が少ないため、直接masterにコミットしていく運用方法もあります。
1.リポジトリの複製
サーバーにあるリモートGitリポジトリをローカルに複製します。
最初はローカルには何もリポジトリがないためローカルにリポジトリを複製します。
リポジトリの複製(クローン)により、ローカルにリポジトリが作成されます。Subversion や CVSではチェックアウトと同様の操作になります。SubversionやCVSではファイルがサーバーから送信されてきて配置される仕組みですが、Gitではローカルにもリポジトリが作成され、ローカルのリポジトリに対してコミットなどの操作ができる仕組みになっています。
2.編集作業
ローカルリポジトリのファイルを編集したり、ファイルを追加したりします。チームで作業する場合はブランチを作成しますが、
一人でシングルタスクで編集作業する場合は、編集作業が競合しないためブランチを作成せず、マスタのファイルを直接編集しても問題ないです。
3.ローカルGitリポジトリ(マスタ)へのコミット
ローカルのGitリポジトリに編集内容をコミットします。ローカルのリポジトリに対してコミットされるため、この段階ではサーバー側のリポジトリには変更はありません。
4.編集作業の続き
必要に応じて、ローカルGitリポジトリへのコミットを繰り返します。ローカルのリポジトリにコミットする操作のみです。サーバー側のリポジトリには変更はまだありません。
5.リモートのGitリポジトリ(マスタ)へのプッシュ
ローカルGitリポジトリで編集した内容をリモートのGitリポジトリに反映します。この作業を「プッシュ」と呼びます。
編集作業はローカルリポジトリのマスタでしていますので、リモートのGitリポジトリのマスタに対してプッシュします。
6.編集完了
マスタにプッシュされたことで、編集作業は完了します。
一人で作業する場合はプルリクエストを利用しない運用にすることもできます。
7.別のマシンで変更された内容を反映する
この後、別のマシンで編集作業をしてマスタのリポジトリが更新されたとします。
リモートリポジトリのほうがローカルリポジトリよりも新しくなっているため、
ローカルリポジトリの内容を更新する必要があります。リモートリポジトリの内容でローカルリポジトリを更新する作業を「プル」と呼びます。
(Subversionでのアップデートに相当します。)
プルによりローカルリポジトリの内容を最新の状態に更新できます。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。