コンフリクトを解消する為の助けを得る

git が自動的にマージできた全ての変更は既に索引ファイルに 追加されています。そして git-diff(1) はコンフリクトだけを 表示します。そうするには通常の構文を使用します:

$ git diff
diff --cc file.txt
index 802992c,2b60207..0000000
--- a/file.txt
+++ b/file.txt
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD:file.txt
 +Hello world
++=======
+ Goodbye
++>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt

このコンフリクトを解決した後、コミットされる予定の内容は 通常と違って2つの親を持っていることを思い出してください;一方は HEAD、つまり現在のブランチの先端;もう一方はもうひとつのブランチの先端で MERGE_HEAD に格納されています。

マージしている間、索引は各ファイルの3つのバージョンを持っています。 この3つはそれぞれファイルの異なる3つの "ファイルステージ" を表現しています:

$ git show :1:file.txt  # 両方のブランチの共通祖先のファイル
$ git show :2:file.txt  # HEAD にあるバージョン
$ git show :3:file.txt  # MERGE_HEAD にあるバージョン

コンフリクトが起こっている箇所を表示するために git-diff(1)を実行すると、 コンフリクトが起こったマージ結果の間の 三方向の差分(three-way diff)が表示されます。 差分にはステージ2と3双方からきたコンテンツ が混ざった状態で含まれています。 (言い換えるとハンクのマージ結果が ステージ2だけからなされる場合その部分ではコンフリクトは起こらず 表示されません。ステージ3についても同じです)

上記の差分は file.txt の作業ツリーのバージョンとステージ2とステージ3の バージョン間の差分を表示します。その為、各行の先頭に1つの "+" または "-" が 付けられるかわりに、2つの列が使用されます:1つ目は 1つ目の親と作業ディレクトリコピーの間の差分を表すのに利用され、 2つ目は2つ目の親と作業ディレクトリコピーの間の差分を表示するのに利用されます。 (このフォーマットの詳細は git-diff-files(1) の "COMBINED DIFF FORMAT" の 節を参照してください)

コンフリクトを通常と同じ方法で解決した後、(indexの更新前に) diff を 実行すると次のように表示されます:

$ git diff
diff --cc file.txt
index 802992c,2b60207..0000000
--- a/file.txt
+++ b/file.txt
@@@ -1,1 -1,1 +1,1 @@@
- Hello world
 -Goodbye
++Goodbye world

これは、解決済みのバージョンが 一つ目の親から "Hello world" を削除し、 2つ目の親から "Goodbye" を削除し、 両方の親に存在しない "Goodbye world" を追加したことを表しています。

他の特別な diff オプションを使用すると、これら任意のステージと 作業ディレクトリとの差分を表示することができます。

$ git diff -1 file.txt          # ステージ1との diff
$ git diff --base file.txt      # 上記と同じ
$ git diff -2 file.txt          # ステージ2との diff
$ git diff --ours file.txt      # 上記と同じ
$ git diff -3 file.txt          # ステージ3との diff
$ git diff --theirs file.txt    # 上記と同じ

git-log(1)gitk(1) コマンドもまた merge の手助けをしてくれます。

$ git log --merge
$ gitk --merge

これらは、HEAD または MERGE_HEAD にだけ存在する全てのコミットを表示し、 マージされていないファイルを表示します。

linkgit:git-mergetool を利用することもできます。これを利用すると Emacs や kdiff3 のような外部ツールを使用してマージを行うことができます。

ファイルのコンフリクトを解決した後には、索引を更新してください:

$ git add file.txt

すると、そのファイルの各ステージは "崩壊" され、 git diff はもはや (デフォルトでは) そのファイルに対する差分を表示しません。