由于我已经创建了这些图像,我认为可能值得在另一个答案中使用它们,尽管..
(dot-dot) 和(dot-dot-dot) 之间差异的描述与manojlds 的答案...
基本相同。
该命令git diff
通常¹仅向您显示提交图中恰好两个点之间的树状态之间的差异。中的..
和...
符号git diff
具有以下含义:
# Left side in the illustration below:
git diff foo..bar
git diff foo bar # same thing as above
# Right side in the illustration below:
git diff foo...bar
git diff $(git merge-base foo bar) bar # same thing as above

换句话说,与 ;git diff foo..bar
完全相同git diff foo bar
。两者都会向您展示两个分支的尖端之间的差异foo
和bar
。另一方面,git diff foo...bar
将向您展示两个分支的“合并基础”与bar
. “合并基础”通常是这两个分支之间共同的最后一次提交,因此该命令将向您显示您的工作bar
引入的更改,同时忽略同时完成的所有内容foo
。
这就是你需要知道的关于..
和中的...
符号的全部内容git diff
。然而...
......这里的一个常见混淆来源是,..
当...
在命令中使用时意味着微妙的不同事物,例如git log
期望一组提交作为一个或多个参数。(这些命令最终都git rev-list
用于从它们的参数中解析提交列表。)
..
和...
for的含义git log
可以用图形表示如下:

因此,git rev-list foo..bar
向您显示 branchbar
上不在 branch 上的所有内容foo
。另一方面,向您显示其中一个或git rev-list foo...bar
中的所有提交,但不是两个。第三张图只是显示,如果您列出两个分支,您将获得其中一个或两个分支中的提交。foo
bar
好吧,无论如何,我觉得这有点令人困惑,而且我认为提交图有帮助:)
¹我只说“通常”,因为例如,在解决合并冲突时,git diff
会向您展示三向合并。