由于我已经创建了这些图像,因此我认为可能值得在其他答案中使用它们,尽管对..
(dot-dot)和...
(dot-dot-dot)之间差异的描述与manojlds的答案基本相同。
该命令git diff
通常¹仅向您显示提交图中恰好两点之间树的状态之间的差异。中的..
和...
符号git diff
具有以下含义:
换句话说,git diff foo..bar
与git diff foo bar
; 完全相同。两者都将告诉你两个分支的末端之间的差异foo
和bar
。另一方面,git diff foo...bar
将显示两个分支的“合并基础”与的尖端之间的区别bar
。“合并基础”通常是这两个分支之间的最后一个共同提交,因此此命令将向您显示您所做的工作bar
已进行的更改,同时忽略了同时进行的所有操作foo
。
您只需要了解中的..
和...
符号git diff
。然而...
...此处常见的混乱根源是,当在命令中使用时..
,它们的...
意思是细微不同,例如git log
期望一组提交作为一个或多个参数。(这些命令最终都git rev-list
用于从其参数中解析提交列表。)
的含义..
和...
用于git log
可以用图形表示为如下:
因此,git rev-list foo..bar
向您显示分支bar
上没有的所有内容foo
。另一方面,git rev-list foo...bar
向您显示foo
或中的 所有提交bar
,但不同时包含两者。第三张图仅显示,如果您列出两个分支,则将获得其中一个或两个中的提交。
好吧,无论如何,我发现一切都令人困惑,并且我认为提交图图很有帮助:)
¹我只会说“通常”,因为例如在解决合并冲突时,git diff
将显示三向合并。
..
和的含义以及...
中git diff
的不同含义git log
。