使用三向差异差异

时间:2015-10-30 16:24:14

标签: git

另一个S.O. question显示如何配置git以使用三向差异进行合并冲突。

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

1 个答案:

答案 0 :(得分:7)

我担心答案是否定的。

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

  

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

另一方面,使用合适的外壳,你应该能够自己做那件事。比方说,如果有两个提交,rev1rev2,您可以使用

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

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

这个功能需要按摩才能使它更有用/更不易碎,但我希望你明白这一点。