如何查看Git合并冲突的“三方差异”?

88
假设我在Git分支master上并执行了git merge featurebranch。在foo.html中存在冲突。
打开foo.html时,我会看到冲突区域显示了master和featurebranch上的内容。但是我无法确定在master上进行了什么更改,以与featurebranch产生冲突;我只知道master现在的状态。
我想查看每个分支应用的差异(diff)。
或者,为获取相同的信息,我可以查看:
- master现在的版本 - featurebranch现在的版本 - 它们共同祖先的版本
我该如何查看这些信息?
2个回答

127

git-merge(1)中得知,

可以通过将"merge.conflictstyle"配置变量设置为"diff3"来使用另一种替代样式。

除了使用 <<<<<<<, =======>>>>>>> 标记外,它还使用另一个后跟原始文本的 ||||||| 标记。...有时您可以通过查看原始文件来得出更好的解决方案。

可以通过下面的方式启用:

git config --global merge.conflictstyle diff3

或者直接在~/.gitconfig文件中修改

[merge]
  conflictstyle = diff3

8
太棒了!谢谢!与此同时,我已经发现了“git mergetool”,它(对我而言)会打开带有多个窗口的“vimdiff”,显示类似的信息,但我更喜欢你的方法。 - Nathan Long
2
@NathanLong:顺便说一句,当使用kdiff3时,mergetool确实很不错。 - Hasturkun

11
许多GUI差异/合并工具都有3或4路合并视图。我强烈推荐使用Beyond Compare解决合并冲突。另一个(好的)工具是DiffMerge
您可以设置一个自定义mergetool,以与git mergetool命令一起使用。这是我的.gitconfig配置,用于在我的Windows机器上使用msysgit上的Beyond Compare(Pro版)和DiffMerge:
[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\""

您可以在官方Linux内核Git文档中的git config中了解更多有关各种差异/合并工具配置的信息。


1
+1 给Beyond Compare!我已经使用专业版多年了,非常喜欢它。他们的支持也非常出色。 - TrueWill
3
如果有人对我的回答投了反对票,我会非常感激能够得到一个解释。考虑到我提供了一些流行的外部比较和合并工具(http://www.codinghorror.com/blog/2005/11/in-praise-of-beyond-compare.html)在Windows上msysgit安装的工作配置,我认为我的回答提供了很大的价值。 - user456814
4
对于来到这里并且一直在想为什么上述配置不能用于三向合并的其他人,请检查您是否拥有Beyond Compare的专业版许可证,而不是标准版许可证(不支持三向合并)。请注意不要改变原始意思。 - nivekastoreth
1
感谢@nivekastoreth。无论我做了什么,它都为我执行了双向合并。我被标准版与专业版页面所困惑,并错误地认为标准版包括三方文件合并,但不包括目录。升级到专业版并按照说明立即解决了问题。 - Tyler Collier
3
我觉得这个答案只是在推广 Beyond Compare,顺便说一句,它并不是很好。 - amdev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接