Git 不对称差分
我的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的提交中。我该怎么做呢?编辑(按问题编辑):我认为没有一种完全可靠的方法可以做
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这个问题不是很好,至少在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