ブランチとマージ
【前置き】Gitのデータの持ち方
Gitでは、変更差分ではなくスナップショットでデータを管理する。
リポジトリの中で、の3つのファイルでデータを保管している。
・圧縮ファイル…ファイルの中身を圧縮したもの。(git addにより作成される)
・ツリーファイル…git addした時のスナップショットを記録する。ファイルの中身と、圧縮ファイル名をマッピングする。
・コミットファイル…ツリーファイル、作成者、日付、コミットメッセージ、親コミットが記録される。
ツリーファイルでスナップショットを記録し、コミットファイルでツリーファイルを指定していることで、コミットはスナップショットを記録していることになる。
まとめると…
Gitではコミットでスナップショットを記録
して、コミットのparent(親コミット情報)でコミットを時系列順に辿れる
ようにしている。
ブランチとは
並行して複数機能の開発をするための仕組み。
ブランチを使って分岐して開発をすることで、他のメンバーの行なった変更が、自分の開発には影響を与えないで済む。
ブランチの仕組み
- ブランチ:コミットファイルを指し示すポインタ(コミットIDを記録したポインタ)
- HEAD:現在自分が作業しているブランチを指し示すポインタ
- masterブランチ:Gitのデフォルトのブランチ名
コミットを行うと、ブランチが指し示すコミットファイルが最新のコミットファイルに変わる。
branch (ブランチを確認・新規追加・変更・削除する)
//今あるブランチの一覧を表示する
$ git branch
//リモートリポジトリも含め、今あるブランチの一覧を表示する
$ git branch -a
//ブランチを新規追加する(ブランチの切り替えは行わない)
$ git branch ブランチ名
//今いるブランチを変更する
$ git branch -m ブランチ名
//ブランチを削除する(masterにマージされていない変更が残っている場合は削除しない)
$ git branch -d ブランチ名
//ブランチを強制削除する
$ git branch -D ブランチ名
checkout (ブランチを切り替える)
//既存のブランチへ切り替える
$ git checkout 既存のブランチ名
//ブランチを新規作成して切り替える
$ git checkout -b 新ブランチ名
merge (変更を統合する)
他の人の変更内容を、自分のブランチに取り込む。
$ git merge ブランチ名 (ローカルブランチの場合)
$ git merge リモート名/ブランチ名 (リモートブランチを参照する場合)
例
$ git merge origin/master
//リモートリポジトリ「origin」のmasuterブランチの内容を、自分の作業中のブランチに統合する
mergeには3種類ある
・Fast foward:早送りになるマージ
ブランチが枝分かれしていなかったときは、ブランチのポインタを前に進めるだけ。
・Auto Merge:基本的なマージ
ブランチが枝分かれしているときは、作業中のブランチをベースに、mergeしたブランチの変更分を取り込んだ内容をスナップショットとして、マージコミットという新しいコミットが作成される。(parentを2つ持つことになる)
・Conflict
同じファイルの同じ行に対して、複数人が異なる編集をおこなった場合。
コンフリクトを解決する
コンフリクトが発生したファイルのコンフリクト箇所には、以下のように表示される。
<<<<<<< HEAD (現在の変更)
あいうえお
=======
かきくけこ
>>>>>>> feature (入力側の変更)
//HEAD:現在の自分の作業ブランチの内容
//feature:mergeしてきたブランチの内容
コンフリクト解消手順
- 最終的に残したい内容へ、ファイルの内容を書き換える。
- << == >>の記述を削除する。
コンフリクトを起こさないために
- 複数人で同じファイルを変更しない
- pullやmergeする前に、変更中の状態をなくしておく。(commitやstashをした上でpullやmergeを行う)
- pullする際は、pullするブランチに移動してからpullを実行する。
ブランチの利用方法の基本
masterブランチでは開発せず、リリース専用のブランチとする。
開発はトピックブランチを作成して進める。
→こうすることで、masterブランチを常に最新の状態に、リリースしている状態と同じに保つことができる。