Git diff提交范围中双点“..”和三点“...”之间有什么区别?

时间:2011-08-31 00:53:26

标签: git diff git-diff

以下命令之间有什么区别?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

The diff manual谈论它:

  

比较分支

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
     
      
  1. 主题提示与主分支之间的更改。
  2.   
  3. 与上述相同。
  4.   
  5. 自主题分支启动以来主分支上发生的更改。
  6.   

但对我来说并不完全清楚。

5 个答案:

答案 0 :(得分:266)

由于我已经创建了这些图像,我认为在另一个答案中使用它们可能是值得的,尽管描述..(点 - 点)和...之间的区别(dot-dot-dot)与manojlds's answer中的基本相同。

命令git diff通常只显示提交图中两个点之间树状态之间的差异。 ..中的...git diff符号具有以下含义:

An illustration of the different ways of specifying commits for git diff

换句话说,git diff foo..bargit diff foo bar完全相同;两者都会显示两个分支foobar的提示之间的差异。另一方面,git diff foo...bar将显示两个分支的“合并基础”与bar的提示之间的差异。 “合并基础”通常是这两个分支之间的最后一次提交,因此该命令将向您显示bar上的工作所引入的更改,同时忽略foo上已完成的所有操作与此同时。

您需要了解..中的...git diff符号。然而...


......这里常见的混淆源是.....git log等命令中使用时,意味着一组提交为一个或者更多的论点。 (这些命令最终都使用git rev-list来解析其参数中的提交列表。)

..的{​​{1}}和...的含义可以通过图形显示如下:

An illustration of the different ways of specifying ranges of commits for git log

因此,git log向您显示分支git rev-list foo..bar上不在分支bar上的所有内容。另一方面,foo会向您显示git rev-list foo...bar foo中的所有提交,但不是。第三个图表只显示如果列出两个分支,则会获得其中一个或两个分支的提交。

好吧,无论如何,我发现这有点令人困惑,我认为提交图表有助于:)

¹我只说“通常”,因为在解决合并冲突时,bar会显示三向合并。

答案 1 :(得分:34)

.. ... 的合并版本差异日志

Diff vs Log & .. vs ..

答案 2 :(得分:26)

git diff foo master foo和master的顶部(头部)提交之间存在差异。

git diff foo..master另一种做同样事情的方式。

git diff foo...master将foo和master的共同祖先(git merge-base foo master)与master的提示区分开来。换句话说,仅显示master分支自foo的共同祖先以来引入的更改。

来自GitHub的

This example解释了何时使用这两个:

  

例如,如果您创建一个'dev'分支并向a添加一个函数   文件,然后返回到'master'分支并从中删除一行   自述文件,然后运行这样的东西:

$ git diff master dev
     

它会告诉你从第一个文件和a添加了一个函数   line已添加到README中。为什么?因为在分支上,自述文件   仍然有原始的行,但在“主人”你已经删除它 - 所以   直接比较快照看起来像'dev'添加它。

     

你真正想要比较的是'dev'自你以来的变化   分支分歧。要做到这一点,Git有一个很好的简写:

$ git diff master...dev

答案 3 :(得分:6)

git diff foo master

将显示该时间点主题和主分支之间的差异

git diff foo..master

这也将显示该时间点主题和主分支之间的差异

git diff foo...master

这将显示主题从分支到

之后的所有差异

所以前两个命令是相同的,最后一个命令只显示差异历史中的更宽视图

答案 4 :(得分:1)

git log tree

顶部的图片等同于底部的图树

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

一张图片值一千个字,.. ... ^之间的区别如下所示。

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1