Git 不对称差分

Git 不对称差分,git,git-diff,Git,Git Diff,我的git回购中有两个分支,A和B,它们有一个共同的祖先C。从C到A的提交可能包含从C到B的提交的压缩合并或重写历史。我如何确定这一点?有没有办法用git diff实现这一点 一般来说,我想知道从C到A的提交是否包含从C到B的提交中的所有文本更改git diff A B并不能完全满足我的要求,因为它还将报告从C到A的提交中的所有更改,这些更改在从C到B的提交中不是。我只想要从C到B的提交更改的差异,这些更改不在从C到A的提交中。我该怎么做呢?编辑(按问题编辑):我认为没有一种完全可靠的方法可以做

我的git回购中有两个分支,
A
B
,它们有一个共同的祖先
C
。从
C
A
的提交可能包含从
C
B
的提交的压缩合并或重写历史。我如何确定这一点?有没有办法用git diff实现这一点

一般来说,我想知道从
C
A
的提交是否包含从
C
B
的提交中的所有文本更改
git diff A B
并不能完全满足我的要求,因为它还将报告从
C
A
的提交中的所有更改,这些更改在从
C
B
的提交中不是。我只想要从
C
B
的提交更改的差异,这些更改不在从
C
A
的提交中。我该怎么做呢?

编辑(按问题编辑):我认为没有一种完全可靠的方法可以做到这一点。从根本上说,问题在于,如果从
C
A
的一些更改与从
C
B
的一些更改重叠,那么将撤销、覆盖或修改
C
B
之间的差异-一般来说,无法说明为什么会出现这种情况

也就是说,我们得到了一个发散的提交图,如下所示:

       a1--a2--...--a_i_max-minus-1--A
      /
...--C
      \
       b0--...--b_j_max-minus-1--B
(没有i=j或i的约束≠ j、 即,此处不同的长度并不意味着一个或另一个)。在这里,标记为
A
的提交实际上只是最终Ai,对于
B
也是如此。你想知道C-vs-B是否包含在任何C-vs-Ai中,或者甚至在某些k 详尽的测试可能是你能得到的最接近的。如果您可以强制执行一个工作流要求,即在Ai提交系列中有一个提交消息或提交注释附加到挤压合并:那么您只需要枚举它们并检查每个注释,说明我是挤压C和挤压B的结果

(原答覆如下)


这个问题不是很好,至少在Git的土地上不是这样,因为没有“A中的变化”这样的东西。如果
A
是一个分支名称,它将命名一个特定的提交。要查找更改,必须命名两个提交,并
git diff
它们。分支名称
B
:必须选择一些早期提交,才能将快照(分支上的提示提交)
B
转换为更改集(相对于一些早期提交)

一般来说,当人们问这个问题时,他们心里有一个特别的第三个承诺:

          o--o--A   <-- BranchA
         /
...--o--*
         \
          o--o--B   <-- BranchB
结果(如果没有合并冲突):

此处显示的任何内容都是由
*
-vs-
A
diff引起的更改,这些更改不是由
*
-vs-
B
diff引起的

同样,将合并提交与提交
A
进行比较将显示
*
-vs-
B
diff中尚未出现的
*
-vs-
A
diff所造成的更改:

$ git diff HEAD^1 HEAD

使用
git show-m
,您可以同时将两者视为两个独立的差异,因为
-m
就是通过
git show

实现的,感谢您的深入解释。我需要通读几遍来消化它,并确定它是否符合我的要求。为了根据您的示例改写我的问题,我想知道从*-To-A的更改是否出现在*-To-B中。我不关心可能在*-To-B中引入的其他更改。在这种情况下,您可以检查merge-vs-B是否为空。我仍在尝试找到更好的解决方案。我已经修改了我的OP,希望能更清楚地知道我在寻找什么。如果你有时间,请看一看。
          o--o--A   <-- BranchA
         /       \
...--o--*         M   <-- HEAD (detached)
         \       /
          o--o--B   <-- BranchB
$ git diff HEAD^2 HEAD    # or git diff BranchB HEAD
$ git diff HEAD^1 HEAD