`git diff topic1 topic2 ^ master`和`git diff topic1..topic2 ^ master`有什么区别?

时间:2016-07-29 00:52:38

标签: git

我正在尝试比较在两个不同的提交中从master分叉的两个不同分支上所做的更改。因此,我不希望看到两个分支之间对master进行的更改。

我尝试了git diff topic1 topic2 ^mastergit diff topic1..topic2 ^master,但我发现我得到了不同的结果 - 特别是一组不同的已更改文件 - 尽管文档指出了git diff a bgit diff a..b是一样的。 (https://www.git-scm.com/docs/git-diff#_examples

这两个命令有什么区别,我可以信任哪一个?或者,我只是做错了吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

git diff的修订解析代码过于宽松,然后用多个参数做错了。在某些情况下,如果你给它提供两个以上的提交ID并且至少其中一个被否定(正如你所做的那样),它会错误地解释它的参数。特别是,它最终处理(positive-ref,positive-ref,negative-ref)三元组,好像它是三点语法。

几个星期前,我提交了a Git fix specifically for this,其中(照例)已被忽略(叹息)。即使有了这个修复,你也无法得到你想要的东西。除了组合差异的更特殊的情况 - 它仍然不是你想要的 - 你只能让Git比较最多两个现有的树已经存储在存储库:

  

我正在尝试比较在两个不同的提交中从master分叉的两个不同分支上所做的更改。因此,我不希望看到两个分支之间对master进行的更改。

换句话说,你有一个类似的提交图:

          a--a--A      <-- feature-A
         /
...--o--*--o--o-...    <-- master
               \
                b--B   <-- feature-B

并且您希望将feature-A的提示最多提交(即提交A - 与您将获得的内容进行比较如果您进行了两次专门提交在feature-B上(提交bB)并将其应用于我标记为*的提交,即feature-Amaster分支的点{1}}。

可以很容易让Git比较提交A的树与提交B的树。这是git diff feature-A feature-Bgit diff feature-A..feature-B所做的事情。但这不是你想要的。

要在提交A的树和(当前假设的)树B'之间获得差异,您必须创建一个临时分支, 1 ,然后挑选两个feature-B - 仅提交到*

          a--a--A      <-- feature-A
         /
...--o--*--o--o-...    <-- master
         \     \
          \     b--B   <-- feature-B
           \
            b'-B'      <-- temporary branch

现在你真的有一个提交B',如果你“拿走”两个中间master提交你得到的树,而现在你可以比较A的树对这个新提交的树。

1 技术上可以在没有临时分支的情况下完成所有这些操作,方法是在工作树中构造假设树B',而不使用git cherry-pick -n进行提交,而不是使用git cherry-pick作为临时分支上的一系列提交。但是Git中的提交,包括临时分支上的临时提交,足够快且足够便宜,这对你来说并不多 - 如果一些挑选步骤需要解决合并冲突,它只会使一切变得更加困难。