以下命令有什么区别?:
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> 主题提示和主分支之间的变化。 和上面一样。 自主题分支启动后,主分支上发生的更改。
比较分支
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
但对我来说并不完全清楚。
由于我已经创建了这些图像,我认为可能值得在另一个答案中使用它们,尽管..(dot-dot) 和(dot-dot-dot) 之间差异的描述...基本相同。
..
...
该命令git diff通常¹仅向您显示提交图中恰好两个点之间的树状态之间的差异。中的..和...符号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 foo..bar
git diff foo bar
foo
bar
git diff foo...bar
这就是你需要知道的关于..和中的...符号的全部内容git diff。然而…
......这里的一个常见混淆来源是,..当...在命令中使用时意味着微妙的不同事物,例如git log期望一组提交作为一个或多个参数。(这些命令最终都git rev-list用于从它们的参数中解析提交列表。)
git log
git rev-list
..和...for的含义git log可以用图形表示如下:
因此,git rev-list foo..bar向您显示 branchbar上不在 branch 上的所有内容foo。另一方面,向您显示其中一个或git rev-list foo...bar中的所有提交,但不是两个。第三张图只是显示,如果您列出两个分支,您将获得其中一个或两个分支中的提交。foo bar
git rev-list foo..bar
git rev-list foo...bar
好吧,无论如何,我觉得这有点令人困惑,而且我认为提交图有帮助:)
¹ 我只说“通常”,因为例如,在解决合并冲突时,git diff会向您展示三向合并。