Git diff 提交范围中的双点“..”和三点“...”有啥区别? [复制]
Posted
技术标签:
【中文标题】Git diff 提交范围中的双点“..”和三点“...”有啥区别? [复制]【英文标题】:What are the differences between double-dot ".." and triple-dot "..." in Git diff commit ranges? [duplicate]Git diff 提交范围中的双点“..”和三点“...”有什么区别? [复制] 【发布时间】:2011-11-07 06:22:21 【问题描述】:以下命令有什么区别?:
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>
主题提示与主分支之间的变化。 同上。 自主题分支启动后主分支上发生的更改。
但我并不完全清楚。
【问题讨论】:
【参考方案1】:由于我已经创建了这些图像,我认为在另一个答案中使用它们可能是值得的,尽管 ..
(dot-dot) 和 ...
(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
将向您展示两个分支的“合并基础”与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
将向您显示三向合并。
【讨论】:
我喜欢你的图表。 I came up with my own a while ago too。我对我自己的git diff
图表有一些想法,我稍后会制作。
有人注意到了吗? ..
和...
的效果在git diff
中感觉颠倒(与git rev-list
相比)!
你让我知道“这就是你需要知道的全部 [...]。但是...”。 :-) Git 充满了这样的东西,类似的符号和术语在不同的上下文中意味着不同的东西;感谢您如此清楚地澄清这一点。
感谢您提及 rev-list。我在寻找一种通过 rev-parse 做 rev-list 的方法时遇到了这个问题。
@foxiris 当^
出现在提交提交之前,它的意思是“不是”。所以git rev-list bar ^foo
的意思是“bar 中的所有内容,foo
中的所有内容除外”【参考方案2】:
顶图相当于底图树
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
【讨论】:
【参考方案3】:git diff foo master
foo 和 master 的顶部(头)提交之间的差异。
git diff foo..master
做同样事情的另一种方式。
git diff foo...master
从 foo 和 master 的共同祖先 (git merge-base foo master
) 到 master 的尖端的差异。换句话说,仅显示 master 分支自其与 foo 的共同祖先以来引入的更改。
来自 GitHub 的This example 解释了何时使用这两者:
例如,如果您创建一个“dev”分支并将一个函数添加到 文件,然后回到你的“master”分支并从 README,然后运行如下内容:
$ git diff master dev
它会告诉你从第一个文件中添加了一个函数,并且 行已添加到自述文件中。为什么?因为在分支上,README 仍然有原始行,但是在“master”上,您已将其删除-所以 直接比较快照看起来像'dev'添加了它。
您真正想要比较的是自从您的 分支分叉。为此,Git 有一个不错的速记:
$ git diff master...dev
【讨论】:
git diff foo...master 分支引入的更改,因为它是与 foo 的共同祖先 @manojlds 好的,所以不同的问题,如果您在开发分支并提交您的更改(函数)并将更改推送到远程开发分支,这是否意味着可见的更改只是函数还是函数和自述文件? 如果我没记错的话,GitHub 的 pull request diff 使用了三点。对吗? GitHub 示例页面的链接断开。 我从来不知道存在 3 点 (...
) 版本。我一直使用git diff $(git merge-base master dev) dev
而不是git diff master...dev
,但它们似乎是等价的。所以,对于任何想知道的人来说,显然git diff master...dev
与git diff $(git merge-base master dev) dev
是一回事。【参考方案4】:
.. vs ... 与 diff vs log
的综合版本【讨论】:
如果它没有那么多不同的颜色和设置操作与..
/...
的东西混在一起就好了。例如,在log A...B
中,不清楚该命令是返回交集(图表的白色部分)还是 A-B 联合的其余部分(绿色)。没有任何设置的操作数并且只有一种颜色会更重要。
这个真的应该是diff A..B
log A...B
,也就是真的diff用2个点,对应log用3(!)点?还是图片有错别字。看看这些点是如何用颜色编码的,在我看来,图像中有一个错字。左下角:log A...B
应该是log A..B
,对(?)。而 log 就在右边应该是 ...
而不是 ..
。
您好 DolphinDream,感谢您提供的数据。我在这里用作参考:gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
@KajMagnus 实际上红色/蓝色仅用于区分 2 点和 3 点(无论与 diff 或 log 一起使用)。图是正确的。在第一列中,带有 2 点的 diff 的结果类似于带有 3 点的日志(因此开始使用整个目的图)。带有 2 点的 diff 给出了两个转速中的代码更改到分歧点(由提交周围的绿色气泡和 van 图的绿色部分说明),而带有 3 点的日志给出了更改日志(提交消息)在两个转速下降到分歧点。
对于diff
和log
的A B
、A..B
和A...B
之间的这种区别是否有助记符?它有什么意义,或者它在逻辑上是如何解释的?对于log
,我认为它比diff
要容易一些,但是对于所有六种情况,很难自然地想出它。【参考方案5】:
git diff foo master
将显示该时间点主题和主分支之间的差异
git diff foo..master
这也将显示该时间点主题和主分支之间的差异
git diff foo...master
这将显示主题从分支创建时和之后的所有差异
所以前两个命令是相同的,最后一个只是在差异历史中显示更广泛的视图
【讨论】:
以上是关于Git diff 提交范围中的双点“..”和三点“...”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章