第5章. Merge、Pull、コンフリクト
Merge は、別々に作業していたブランチをもう一度ひとつの道にまとめる動きです。
Pull は、1 回で 2 つのことを行う動きです。 つまり Pull = Fetch + Merge です。
コンフリクト は、複数の人が同じ部分を異なる内容に修正してしまい、Gitがどちらを残すべきか自動的に決定できないときに発生します。
第4章の続き: Fetch の次は?
第4章で見た流れのように、まず Fetch によって origin/main が最新化されます。 このとき自分の作業位置(HEAD)はふつう main にそのままあります。
その次の段階が Merge です。つまり main に origin/main を取り込みます。 この Merge の段階で同じ行を別々に直していた場合、コンフリクトが起こることがあります。
図 5-1. ブランチ Merge
feature で作業した内容を main にまとめると、Merge Commit が生まれます。
図 5-2. Pull シナリオ A: 自分のローカル変更がない場合
Fetch で origin/main だけが先へ進み、そのあと Pull すると main もすぐ同じ位置へ移動します。
この場合は別の Merge Commit はできません。(これを "fast-forward" と呼びます)
図 5-3. Pull シナリオ B: 自分のローカル変更がある場合
自分の main にも Commit があるなら、Pull の途中で Merge の段階が必要になります。
origin/main はそのまま表示され、Fetch で受け取ったリモート変更は origin/main の分岐として見えます。
同じ行を別々に直していれば、コンフリクトを解決したあと Merge Commit で締めます。
コンフリクトが起きたときの基本手順
- 何が違うのかを行単位で確認する。
- チームの基準に合う最終文を選ぶ。
- 選んだ内容で整理してからもう一度 Commit する。
- 作業者が理解できる短い説明を残す。
ここまで理解できたら、次の章では「この Merge の流れをチームのレビュー手順(PR)として運用するとどうなるか」を続けて見ていけます。