2017-10-12 44 views
2

我有两个分支在我的git回购,AB有一个共同的祖先C。从CA的提交可能包含从CB的提交的压缩合并或其他重写历史记录。我怎样才能确定这一点?有没有办法与git diff做到这一点?不对称差异

总体而言,我想知道,如果从提交到C包含A在提交从CB所有文字修改。 git diff A B并不完全做我想做的,因为它也将报告在提交从CA这是在承诺不会CB所有的变化是什么。我只希望差异在CB的提交中发生变化,它们不在从CA的提交中。我怎么去解决这个问题?

回答

1

编辑(每个问题编辑):我不认为有一个完全可靠的方法来做到这一点。从根本上讲,问题是,如果从CA一些变化重叠CB一些变化-would撤消或覆盖或修改CB - 它的不可能之间的差异一般要知道为什么是这样的话。

也就是说,我们给出一个发散提交图所示:

 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,你可以因为这是-mgit show所做的一样。

+0

感谢您的深入解释。我需要仔细阅读它才能消化所有内容,并确定这是否符合我的要求。要根据您的示例对我的问题进行重新说明,我想知道*到to的变化是否出现在*到B中。我不在乎可能在*到B中引入的其他更改。 –

+0

在这种情况下,您可能会检查merge-vs-B是否为空。 – torek

+0

我仍在试图为此找到更好的解决方案。我已经修改了我的OP,希望能够更清楚我所寻找的内容。如果你有时间,请看看。 –