Git運用 レッスン4

コンフリクトの解消

複数人での変更が衝突するマージコンフリクトが起きる仕組みと、安全に解消する手順を学ぶ

コンフリクトが起きる仕組み

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 から ======= まで: 自分側(現在のブランチ)の内容
  • ======= から >>>>>>> まで: 取り込もうとしている相手側の内容

安全な解消手順

1

両方の変更内容を理解する

単純にどちらかを消すのではなく、それぞれの変更の意図を確認する

2

マーカーを削除し、統合後のコードを書く

<<<<<<< ・=======・>>>>>>> の記号自体も必ず削除する

3

解消後に必ずテストを再実行する

見た目上マーカーが消えていても、統合結果が意図通り動くとは限らない

4

解消した変更をコミットする

マージコミットまたはrebase継続によって、解消結果を記録する

ポイント

コンフリクト解消はコードを書き換える作業そのものです。 解消後にテストを実行せずコミットしてしまうと、マーカーの消し忘れや意図しないロジックの混在に 気づけないまま統合されてしまうことがあります。

rebaseとmerge、コンフリクトの起きやすさ

git mergegit rebaseは どちらもブランチを統合する手段ですが、コンフリクトへの向き合い方が異なります。

merge

複数のコミット分の差分をまとめて1回のコンフリクト解消で統合できる

rebase

コミットを1つずつ積み直すため、コンフリクトがコミットごとに複数回発生することがある

そもそもコンフリクトを減らす最善の予防策は、ブランチの寿命を短くし、mainの変更をこまめに取り込むことです。 差分が小さいうちに統合するほど、コンフリクトの発生頻度も規模も小さくなります。

ポイント

  • • コンフリクトは、同じ箇所への異なる変更をGitが自動統合できない場合に発生する
  • • コンフリクトマーカーは自分側と相手側の内容を区切って表示する
  • • 両方の変更意図を理解した上で統合後のコードを書き、マーカーは必ず削除する
  • • 解消後は必ずテストを再実行してから、統合結果をコミットする
  • • ブランチの寿命を短くしこまめに同期することが、コンフリクトの最善の予防策

確認クイズ

1 / 3

マージコンフリクトが発生する典型的な状況はどれか?