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

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

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

差异手册谈到它:

比较分支机构

 $ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3> 
  1. 主题提示和主分支之间的变化。
  2. 同上。
  3. 从主题分支启动时发生在主分支上的更改。

但我不完全清楚。

由于我已经创build了这些图像,我认为这可能是值得在另一个答案中使用它们,虽然描述的区别.. (点 – 点)和... (点 – 点)基本上是相同的就像manojlds的回答一样 。

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

说明提交git diff的不同方法

换句话说, git diff foo..bargit diff foo bar完全一样; 都会告诉你两个分支foobar的技巧之间的区别。 另一方面, git diff foo...bar将显示两个分支的“合并基”和bar的尖端之间的区别。 “合并基础”通常是这两个分支之间最后一个共同的提交,所以这个命令会告诉你你的工作已经引入的变化,同时忽略了同时在foo上做的所有事情。

这就是所有你需要知道的.....git diff符号。 然而…


…这里混淆的一个常见的来源是.....意味着在git log等命令中使用的细微差别,这些命令需要一组提交作为一个或多个参数。 (这些命令最终都使用git rev-list从它们的参数中parsing提交列表。)

git log.....的含义可以用graphics显示如下:

说明为git日志指定提交范围的不同方法

所以, git rev-list foo..bar显示了分支bar上不是在分支foo 。 另一方面, git rev-list foo...bar显示所有在foo bar的提交,但不是两者 。 第三个图表显示如果你列出了两个分支,你会得到它们中的一个或两个的提交。

那么,我发现,所有有点混乱,无论如何,我认为提交图表帮助:)

¹我只会说“典型”,因为在解决合并冲突时,例如, git diff会向您显示三向合并。

git diff foo master foo和master的顶端(头)提交之间的git diff foo master

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

git diff foo...mastergit diff foo...master的共同祖先( git merge-base foo master )到master的尖端的git diff foo...master 。 换句话说,只显示主分支自从它与主人共同的祖先以来所引入的变化。

这个来自GitHub的例子解释了何时使用这两个:

例如,如果你创build了一个'dev'分支并为一个文件添加一个函数,然后回到你的'master'分支并从README中删除一行,然后运行如下所示:

 $ git diff master dev 

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

你真正想比较的是自你的分支分歧以来,“开发”已经发生了什么变化。 要做到这一点,Git有一个很好的简写:

 $ git diff master...dev 

我的综合版本的VS 差异日志

差异vs日志&..

 git diff foo master 

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

 git diff foo..master 

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

 git diff foo...master 

这将显示从分支到分支之后的所有主题

所以前两个命令是相同的,最后一个只是在diff历史中显示更广泛的视图