以下命令之间有什么区别?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
The diff manual谈论它:
Comparing branches
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- Changes between the tips of the topic and the master branches.
- Same as above.
- Changes that occurred on the master branch since when the topic branch was started off it.
但我不是很清楚。
最佳答案
由于我已经创建了这些图像,所以我认为可能值得在另一个答案中使用它们,尽管 ..
(点-点)和 ...
(dot-dot-dot) 本质上与 manojlds's answer 中的相同.
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
将向您显示两个分支的“merge 基础”和 bar
的提示之间的区别。 “merge 基础”通常是这两个分支之间的最后一个共同提交,因此此命令将向您显示您在 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 中的所有提交
,但不是两者。第三张图仅显示如果您列出两个分支,您将获得其中一个或两个分支中的提交。
好吧,无论如何,我发现这一切都有点令人困惑,而且我认为提交图表会有所帮助:)
¹ 我只说“通常”,因为在解决 merge 冲突时,例如,git diff
将向您显示三向 merge 。
关于git - Git diff 提交范围中的双点 ".."和三点 "..."有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7251477/