Git diff提交范围中的双点“ ..”和三点“ ...”之间有什么区别?


188

以下命令之间有什么区别?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

diff手册对此进行了讨论:

比较分支

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. 在主题提示和主分支之间切换。
  2. 同上。
  3. 自从主题分支启动以来,在master分支上发生的更改。

但对我来说还不是很清楚。


尽管问题不是重复的,但此答案以图形方式显示..和的含义以及...git diff的不同含义git log
马克·朗伊尔

Answers:


333

由于我已经创建了这些图像,因此我认为可能值得在其他答案中使用它们,尽管对..(dot-dot)和...(dot-dot-dot)之间差异的描述与manojlds的答案基本相同。

该命令git diff通常¹仅向您显示提交图中恰好两点之间树的状态之间的差异。中的.....符号git diff具有以下含义:

说明为git diff指定提交的不同方式

换句话说,git diff foo..bargit diff foo bar; 完全相同。两者都将告诉你两个分支的末端之间的差异foobar。另一方面,git diff foo...bar将显示两个分支的“合并基础”与的尖端之间的区别bar。“合并基础”通常是这两个分支之间的最后一个共同提交,因此此命令将向您显示您所做的工作bar已进行的更改,同时忽略了同时进行的所有操作foo

您只需要了解中的.....符号git diff。然而...


...此处常见的混乱根源是,当在命令中使用时..,它们的...意思是细微不同,例如git log期望一组提交作为一个或多个参数。(这些命令最终都git rev-list用于从其参数中解析提交列表。)

的含义.....用于git log可以用图形表示为如下:

指定git log提交范围的不同方式的说明

因此,git rev-list foo..bar向您显示分支bar上没有的所有内容foo。另一方面,git rev-list foo...bar向您显示foo 或中的 所有提交bar,但不同时包含两者。第三张图仅显示,如果您列出两个分支,则将获得其中一个或两个中的提交。

好吧,无论如何,我发现一切都令人困惑,并且我认为提交图图很有帮助:)

¹我只会说“通常”,因为例如在解决合并冲突时,git diff将显示三向合并。


1
我喜欢你的图表。我也有一段时间想出自己的想法。我对自己的git diff图表有一些想法,以后再做。

34
有人注意到了吗?的效果.....感觉颠倒git diff(比git rev-list)!
罗伯特·西默

2
您在“这就是您所需要知道的全部内容。但是...”。:-) Git充满了这样的事物,其中相似的符号和术语在不同的上下文中表示不同的事物;感谢您很好地澄清了这一点。
ShreevatsaR 2015年

感谢您提及转速表。我在寻找一种通过rev-parse做rev-list的方法时遇到了这个问题。
疯狂物理学家2016年

“换句话说,git diff foo..bar与完全相同git diff foo bar;两者都将向您显示foo和bar这两个分支的技巧之间的区别。” “两个分支的尖端之间的差异”到底是什么意思?
Asad Moosvi '17

60

我的综合版本.. VS ...差异 VS 日志

Diff vs Log&.. vs ..


3
如果它没有太多不同的颜色并将设置操作与../ ...东西混合在一起,那将是非常好的。例如,log A...B不清楚命令是返回交集(图的白色部分)还是返回AB联合的其余部分(绿色)。如果没有任何设置的操作数并且只有一种颜色,那就更好了。
xealits

1
如果这真的是diff A..B< - > log A...B,就是确确实实DIFF与2个点,对应于记录有3个点(!)?或者图像中有错字。看点如何用颜色编码,在我看来图像中有错别字。左下角:log A...B应该为log A..B,右(?)。并且日志...不应该在右边..
KajMagnus

1
嗨,DolphinDream,谢谢你的身影。我用它作为参考这里:gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
悦豪林

1
@KajMagnus实际上红色/蓝色仅用于区分2点和3点(无论与diff或log一起使用)。该图是正确的。在第一列中,具有2点的diff的结果类似于具有3点的对数的结果(因此,整个目的图从此开始)。带2点的diff给出了两个转速中的代码更改,直至下降到发散点(由提交周围的绿色气泡和van图的绿色部分表示),而带3点的log给出了更改日志(提交消息)两者都下降到分歧点。
DolphinDream,

28

git diff foo master foo和master的顶部(头部)提交之间的差异。

git diff foo..master 做同样事情的另一种方式。

git diff foo...master 与祖先不同git merge-base foo master foo和master)到master的尖端。换句话说,仅显示master分支自其与foo共同祖先以来引入的更改。

GitHub上的示例说明了何时使用两者:

例如,如果您创建一个'dev'分支并将功能添加到文件中,然后返回到'master'分支并从README中删除一行,然后运行以下命令:

$ git diff master dev

它会告诉您从第一个文件添加了一个函数,并且在README中添加了一行。为什么?因为在分支上,README仍然具有原始行,但是在“ master”上您已将其删除-因此直接比较快照看起来像是“ dev”添加了它。

您真正想比较的是自分支机构分歧以来“开发”已发生的变化。为此,Git有一个不错的速记:

$ git diff master...dev

2
git diff foo ... master更改,因为master分支是foo的共同祖先,所以引入了master分支
0fnt 2014年

@manojlds好的,那么是一个不同的问题,如果您在dev分支并提交更改(函数)并将更改推送到远程dev分支,这是否意味着可见的更改只是该函数还是该函数以及自述文件?
大卫,

如果我没记错的话,GitHub的pull request diff使用三点。那正确吗?
Shaun Luttin

指向GitHub示例页面的链接断开。
K.-Michael Aye

6
git diff foo master

将显示该时间点主题和主分支之间的差异

git diff foo..master

这还将显示该时间点主题和主分支之间的差异

git diff foo...master

这将显示从分支创建主题时与之后创建主题之间的所有差异。

所以前两个命令是相同的,最后一个只是在diff历史中显示了更宽的视图


1

git日志树

顶部图片等同于底部图树

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

一张图片值一千个字,两者之间的区别.. ... ^如下所示。

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.