不对称差异

时间:2017-10-12 20:15:13

标签: git git-diff

我的git仓库中有两个分支,AB,共有一个祖先C。从CA的提交可能包含从CB的提交的压缩合并或其他重写历史记录。我怎么能确定这个?有没有办法用git diff做到?

一般而言,我想知道从CA的提交是否包含从CB的提交中的所有文字更改。 git diff A B并不能完全符合我的要求,因为它还会报告从CA的提交中的所有更改,这些更改在提交中 CB。我只想要提交从CB的提交中的差异,这些提交不在CA的提交中。我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

编辑(每个问题编辑):我认为没有一种完全可靠的方法可以做到这一点。从根本上说,问题是,如果某些更改从C更改为A 重叠某些更改从C更改为B,则会撤消或覆盖或修改CB之间的差异 - 一般不可能说出为什么会出现这种情况。

也就是说,我们给出了这样一个不同的提交图:

       a1--a2--...--a_i_max-minus-1--A
      /
...--C
      \
       b0--...--b_j_max-minus-1--B

i = j i≠j 没有约束,即这里的不同长度并不意味着暗示一个或另一个)。这里标记为A的提交实际上只是最终的A i ,类似于B。您想要发现C-vs-B是否包含在任何C-vs-A i 中,或者甚至A k -vs-A l for some k<升。你可以详尽地测试,看看这是否真实,但这样做会很昂贵,而且也会错过任何“逻辑真实”的情况。"但序列的最终提交与C-vs-B并不完全相同,可能是因为它被修改以解决合并冲突。

详尽的测试可能尽可能接近。最好是你可以强制执行一个工作流要求,即在A i 系列提交中有一个提交消息或提交注释附加到squash合并:那么你只需要枚举它们和检查每个说明我是压缩C vs B 的结果。

(原始答案如下)

这个问题并不是很好 - 至少在Git-land中没有 - 因为A"中没有"变化。如果A是分支名称,则它命名一个特定的提交。要查找更改,您必须将两个提交命名为git diff。对于分支名称B也是如此:您必须选择一些早期的提交才能将快照(分支上的提示)B转换为更改集(相对于某些先前的提交) )。

一般来说,当人们提出这个问题时,他们会特别考虑第三个问题:

          o--o--A   <-- BranchA
         /
...--o--*
         \
          o--o--B   <-- BranchB

此处标记为*的第三个提交是两个分支&#34;加入&#34;,即合并基础的地方。

如果提交*不是您打算用作生成此非对称差异的(单个)第三点的提交,则此答案的其余部分均不适用。但如果,找到它的方法是进行合并,然后将合并的结果与你关心的任何分支提示进行比较。

合并将采用所有更改的联合(从*A,从*B)并将它们放入合并提交中

$ git checkout --detach BranchA # doesn't matter which one we use
$ git merge BranchB

结果(如果没有合并冲突):

          o--o--A   <-- BranchA
         /       \
...--o--*         M   <-- HEAD (detached)
         \       /
          o--o--B   <-- BranchB

现在,您可以通过比较(差异)*A来了解B - vs - BM开头的内容:< / p>

$ git diff HEAD^2 HEAD    # or git diff BranchB HEAD

此处显示的任何内容都是* - vs - A差异所带来的更改,这些更改也不是由* - vs - B差异提供的。< / p>

同样,将合并提交与提交A进行比较将显示* - vs - B差异所带来的更改,这些更改尚未包含在*中 - vs- A差异:

$ git diff HEAD^1 HEAD

使用git show -m,您可以同时看到两个不同的差异,因为这是-mgit show的处理。