我的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
的提交中。我怎么能这样做呢?
答案 0 :(得分:1)
编辑(每个问题编辑):我认为没有一种完全可靠的方法可以做到这一点。从根本上说,问题是,如果某些更改从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
的提交实际上只是最终的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
)并将它们放入合并提交中/ p>
$ 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 - B
与M
开头的内容:< / 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
,您可以同时看到两个不同的差异,因为这是-m
对git show
的处理。