How can I see a "three way diff" for a Git merge conflict?
GitGit 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 ~/.gitconfig
file
[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
.