编辑(每个问题编辑):我不认为有一个完全可靠的方法来做到这一点。从根本上讲,问题是,如果从C
到A
一些变化重叠从C
到B
一些变化-would撤消或覆盖或修改C
和B
- 它的不可能之间的差异一般要知道为什么是这样的话。
也就是说,我们给出一个发散提交图所示:
a1--a2--...--a_i_max-minus-1--A
/
...--C
\
b0--...--b_j_max-minus-1--B
(没有约束,要么我= j的或我≠j时,即这里的不同长度是并不意味着暗示其中之一)。这里标记为A
的提交实际上仅仅是最终的A i,并且类似地对于B
。要发现C-VS-B是否包含在任何C-VS-A 我,甚至ķ -vs-A升的一些ķ<升。你可以详尽地测试以确定这是否是真实的,但是这样做会很昂贵,并且也会错过任何“逻辑正确”的情况,但最终提交的序列与C-vs-B并不完全相同,可能是因为它是修改以解决合并冲突。
详尽的测试可能会尽可能地接近您所能得到的。如果您可以强制执行工作流程要求,那么系统提交中会有一个提交消息或提交说明附加到壁球合并:那么您只需要枚举它们并检查每个注释说我是挤压C vs B的结果。
(原来的答复如下)
的问题没有得到很好的形成,至少在Git中,陆,因为没有这样的事情“在A
的变化”不是。如果A
是分支名称,则它命名一个特定的提交。要找到更改您必须命名为两个提交和git diff
他们。这同样适用于分支名称B
:为了将快照(分支上的提示提交)B
转变为更改集(就某些较早的提交而言),您必须选择一些较早的提交。
一般来说,人们问这个的时候,他们有一个特定的第三个承诺事项:
o--o--A <-- BranchA
/
...--o--*
\
o--o--B <-- BranchB
这第三个承诺,标志着*
这里,就是两个分支“联合起来”,又名地方合并基地。
如果提交*
不是您打算用作生成此不对称差异的(单个)第三点的提交,则此答案的其余部分均不适用。但如果它是,找到它的方法是进行合并,然后将合并结果与您关心的任何分支提示进行比较。
合并将采取的所有更改的工会(从*
到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
通过比较(版本比较)B
VS M
:
$ git diff HEAD^2 HEAD # or git diff BranchB HEAD
凡是显示了这里有贡献的航班吗*
差异A
改变了未还贡献了*
航班吗B
差异。
同样,比较合并提交对提交A
将呈现变化贡献的航班吗*
DIFF B
是不是已经在*
航班吗A
DIFF:
$ git diff HEAD^1 HEAD
使用git show -m
,你可以因为这是-m
与git show
所做的一样。
感谢您的深入解释。我需要仔细阅读它才能消化所有内容,并确定这是否符合我的要求。要根据您的示例对我的问题进行重新说明,我想知道*到to的变化是否出现在*到B中。我不在乎可能在*到B中引入的其他更改。 –
在这种情况下,您可能会检查merge-vs-B是否为空。 – torek
我仍在试图为此找到更好的解决方案。我已经修改了我的OP,希望能够更清楚我所寻找的内容。如果你有时间,请看看。 –