マージコンフリクト
別名: コンフリクト / merge conflict / 競合 / conflict
統合する 2 つの変更が同じファイルの同じ箇所を別々に書き換えていて、Git がどちらを残すか自動で決められずに処理を止めた状態。
マーカーを手で解消して git add するまで先へ進めない。
公開:
定義
マージコンフリクト(merge conflict) は、統合しようとした 2 つの変更が同じファイルの同じ箇所を別々に書き換えていて、Git がどちらを残すべきか自動で決められない状態を指す。
Git は統合を途中で止め、該当箇所にコンフリクトマーカーを書き込んで人の判断を待つ。
詳細
片側だけが変えた箇所や、両側が同じ内容に変えた箇所は自動で統合される。
止まるのは、両側が同じ範囲を異なる内容に変えたときと、一方がファイルを編集し他方が同じファイルを削除したときである。
ファイルには <<<<<<< から ======= までに自分側、>>>>>>> までに相手側の内容が並ぶ。merge.conflictStyle を diff3 や zdiff3 にすると共通祖先の内容も表示され、どちらが何を変えたのか判断しやすくなる。
merge だけでなく rebase・cherry-pick・revert・stash pop でも同じ形で発生する。
よくある誤解
- マーカーを消せば解消したことになる: ならない。
編集後にgit addで解消済みとして登録し、git commitやgit rebase --continueで処理を再開して初めて先へ進む。 - コンフリクトが出ると変更が失われる: 失われない。
merge の途中ならgit merge --abortで統合前の状態へ戻すこともできる。
ただし開始前にコミットしていない変更があった場合は、元どおりに戻せないことがある。
関連
解消の手順は Git merge でコンフリクトが解決できない にまとめている。
履歴を付け替える rebase の途中で止まった場合は Git rebase でコンフリクトが解消できない を参照する。