コンフリクトの解消
複数人での変更が衝突するマージコンフリクトが起きる仕組みと、安全に解消する手順を学ぶ
コンフリクトが起きる仕組み
Gitは通常、共通の祖先コミットを基準に2つの変更を自動で統合する3-way mergeという方式を使います。 しかし、2つのブランチが同じファイルの同じ箇所を 異なる内容に変更していた場合、どちらを採用すべきかGitには判断できません。 このときにマージコンフリクトが発生します。
共通の祖先:
const TAX_RATE = 0.08
自分のブランチでの変更:
const TAX_RATE = 0.10
相手のブランチでの変更:
const TAX_RATE = 0.10 // ただし端数処理のコメント付き
→ 同じ行に対する変更内容が異なるため、Gitは自動統合できずコンフリクトになるコンフリクトマーカーの読み方
コンフリクトが起きると、該当ファイルに次のようなマーカーが挿入されます。
<<<<<<< HEAD
const TAX_RATE = 0.10 // 自分のブランチの変更内容
=======
const TAX_RATE = 0.10 // 相手のブランチの変更内容(端数処理のコメント付き)
>>>>>>> feature/update-tax-comment- •
<<<<<<< HEADから=======まで: 自分側(現在のブランチ)の内容 - •
=======から>>>>>>>まで: 取り込もうとしている相手側の内容
安全な解消手順
両方の変更内容を理解する
単純にどちらかを消すのではなく、それぞれの変更の意図を確認する
マーカーを削除し、統合後のコードを書く
<<<<<<< ・=======・>>>>>>> の記号自体も必ず削除する
解消後に必ずテストを再実行する
見た目上マーカーが消えていても、統合結果が意図通り動くとは限らない
解消した変更をコミットする
マージコミットまたはrebase継続によって、解消結果を記録する
ポイント
コンフリクト解消はコードを書き換える作業そのものです。 解消後にテストを実行せずコミットしてしまうと、マーカーの消し忘れや意図しないロジックの混在に 気づけないまま統合されてしまうことがあります。
rebaseとmerge、コンフリクトの起きやすさ
git mergeとgit rebaseは どちらもブランチを統合する手段ですが、コンフリクトへの向き合い方が異なります。
merge
複数のコミット分の差分をまとめて1回のコンフリクト解消で統合できる
rebase
コミットを1つずつ積み直すため、コンフリクトがコミットごとに複数回発生することがある
そもそもコンフリクトを減らす最善の予防策は、ブランチの寿命を短くし、mainの変更をこまめに取り込むことです。 差分が小さいうちに統合するほど、コンフリクトの発生頻度も規模も小さくなります。
ポイント
- • コンフリクトは、同じ箇所への異なる変更をGitが自動統合できない場合に発生する
- • コンフリクトマーカーは自分側と相手側の内容を区切って表示する
- • 両方の変更意図を理解した上で統合後のコードを書き、マーカーは必ず削除する
- • 解消後は必ずテストを再実行してから、統合結果をコミットする
- • ブランチの寿命を短くしこまめに同期することが、コンフリクトの最善の予防策
確認クイズ
1 / 3マージコンフリクトが発生する典型的な状況はどれか?