How can I see a "three way diff" for a Git merge conflict?

Git

Git Problem Overview


Suppose I'm on Git branch master and I git merge featurebranch. There is a conflict in foo.html.

When I open foo.html, I see, in the area of the conflict, what master has and what featurebranch has. But I can't really tell what change was made on master that conflicted with featurebranch; I only know what master has now.

I'd like to see the diff that each one applied.

Or, to get the same information, I could see:

  • The version master has now
  • The version featurebranch has now
  • The version their common ancestor had

How can I see this?

Git Solutions


Solution 1 - Git

From git-merge(1),

> An alternative style can be used by setting the "merge.conflictstyle" configuration variable to "diff3". > > In addition to the <<<<<<<, =======, and >>>>>>> markers, it uses another ||||||| marker that is followed by the original text. ... You can sometimes come up with a better resolution by viewing the original.

This can be enabled using

git config --global merge.conflictstyle diff3

or right in ~/.gitconfigfile

[merge]
  conflictstyle = diff3

Solution 2 - Git

A lot of GUI diff/merge tools have a 3 or 4 way merge view. I highly recommend Beyond Compare for resolving merge conflicts. Another (okay) tool is DiffMerge.

You can set up a custom mergetool to use with the git mergetool command. This is my .gitconfig configuration for Beyond Compare (Pro edition) and DiffMerge on my Windows machine using msysgit:

[merge]
	tool = bc3
[diff]
	tool = bc3
[difftool "dm"]
	cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[difftool "bc3"]
	cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""
[mergetool "bc3"]
	cmd = "\"c:/program files (x86)/beyond compare 3/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""

You can read more about various diff/merge tool configurations in the official Linux Kernel Git documentation for git config.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNathan LongView Question on Stackoverflow
Solution 1 - GitRazerMView Answer on Stackoverflow
Solution 2 - Gituser456814View Answer on Stackoverflow