以下命令之间有什么区别?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
The diff manual谈论它:
比较分支
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- 主题提示与主分支之间的更改。
- 与上述相同。
- 自主题分支启动以来主分支上发生的更改。
醇>
但对我来说并不完全清楚。
答案 0 :(得分:266)
由于我已经创建了这些图像,我认为在另一个答案中使用它们可能是值得的,尽管描述..
(点 - 点)和...
之间的区别(dot-dot-dot)与manojlds's answer中的基本相同。
命令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
来解析其参数中的提交列表。)
..
的{{1}}和...
的含义可以通过图形显示如下:
因此,git log
向您显示分支git rev-list foo..bar
上不在分支bar
上的所有内容。另一方面,foo
会向您显示git rev-list foo...bar
或 foo
中的所有提交,但不是。第三个图表只显示如果列出两个分支,则会获得其中一个或两个分支的提交。
好吧,无论如何,我发现这有点令人困惑,我认为提交图表有助于:)
¹我只说“通常”,因为在解决合并冲突时,bar
会显示三向合并。
答案 1 :(得分:34)
答案 2 :(得分:26)
git diff foo master
foo和master的顶部(头部)提交之间存在差异。
git diff foo..master
另一种做同样事情的方式。
git diff foo...master
将foo和master的共同祖先(git merge-base foo master
)与master的提示区分开来。换句话说,仅显示master分支自foo的共同祖先以来引入的更改。
This example解释了何时使用这两个:
例如,如果您创建一个'dev'分支并向a添加一个函数 文件,然后返回到'master'分支并从中删除一行 自述文件,然后运行这样的东西:
$ git diff master dev
它会告诉你从第一个文件和a添加了一个函数 line已添加到README中。为什么?因为在分支上,自述文件 仍然有原始的行,但在“主人”你已经删除它 - 所以 直接比较快照看起来像'dev'添加它。
你真正想要比较的是'dev'自你以来的变化 分支分歧。要做到这一点,Git有一个很好的简写:
$ git diff master...dev
答案 3 :(得分:6)
git diff foo master
将显示该时间点主题和主分支之间的差异
git diff foo..master
这也将显示该时间点主题和主分支之间的差异
git diff foo...master
这将显示主题从分支到
之后的所有差异所以前两个命令是相同的,最后一个命令只显示差异历史中的更宽视图
答案 4 :(得分:1)