使用三向差异差异

Ben*_*ohn 3 git

另一个SO问题显示了如何配置git为使用三向差异进行合并冲突.

是否可以将此三种样式设置为标准差异操作的默认样式?如果我在存在共同根(不仅仅是其中一个版本)的版本之间请求差异,那么来自共同根的更改将显示在差异中.

kos*_*tix 7

我担心答案是否定的.

对此的ratonale是,无论你如何在调用时指定参数git diff,它总是只考虑两个实体(blob或树(大多数时候从引用它们的提交中推断)).换句话说,这是设计:git diff考虑单独的对象,不进行任何历史遍历.引用git diff手册页:

有关拼写方法的更完整列表<commit>,请参阅中的"指定修订"部分gitrevisions(7).但是,"diff"是关于比较两个端点, 而不是范围,而范围符号(" <commit>..<commit>"和" <commit>...<commit>")并不表示在"指定范围"部分中定义的范围gitrevisions(7).

另一方面,使用合适的外壳,您应该能够自己做这件事.说,给定两次提交,rev1并且rev2,您可以使用

git-diff3() {
  local rev1="$1" rev2="$2"
  diff3 <(git show "$rev1") \
        <(git show $(git merge-base "$rev1" "$rev2")) \
        <(git show "$rev2")
}
Run Code Online (Sandbox Code Playgroud)

在了解<(...)(例如bash)的shell中.

这个功能需要按摩才能使它更有用/更不易碎,但我希望你能得到这个想法.