以下命令之间有什么区别:
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>
但对我来说还不是很清楚。
发布于 2011-08-31 19:39:27
因为我已经创建了这些图像,所以我认为在另一个答案中使用它们可能是值得的,尽管对..
(点)和...
(点-点)之间的区别的描述基本上与中的相同。
命令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
从它们的参数中解析提交列表。)
..
和...
对于git log
的含义可以用图形表示,如下所示:
因此,git rev-list foo..bar
向您显示分支bar
上的所有内容,而分支foo
上没有这些内容。另一方面,git rev-list foo...bar
向您展示了foo
或bar
中的所有提交,但不是两者都有。第三个图只是显示,如果您列出两个分支,您将获得其中一个或两个分支中的提交。
不管怎么说,我发现这一切都有点令人困惑,我认为提交图有助于:)
»我只说“典型”,因为在解决合并冲突时,例如,git diff
将向您显示一个三向合并。
发布于 2017-09-21 21:32:11
我的合并版本.. vs ...与diff vs log
发布于 2011-08-31 10:52:20
git diff foo master
在foo和master的顶级(头)提交之间存在差异。
git diff foo..master
是做同样事情的另一种方式。
git diff foo...master
从foo和master的共同祖先(git merge-base foo master
)到master的tip不同。换句话说,仅显示主分支自其与foo的共同祖先以来引入的更改。
来自GitHub的This example解释了何时使用这两种方法:
例如,如果你创建了一个‘
’分支并将一个函数添加到一个文件中,然后返回到你的‘主’分支并从自述文件中删除一行,然后运行如下代码:
$ git diff主开发
它将告诉您从第一个文件中添加了一个函数,并在自述文件中添加了一行。为什么?因为在分支上,README仍然有原始行,但在‘master’上您已经删除了它-所以直接比较快照看起来像是‘dev’添加了它。
你真正想要比较的是,自从你的分支分叉后,“dev”发生了什么变化。要做到这一点,Git有一个很好的小速记:
$ git diff master...dev
https://stackoverflow.com/questions/7251477
复制相似问题