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..bargit diff foo bar 完全相同;两者都会向您展示foobar 两个分支的提示之间的区别。另一方面,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...devgit diff $(git merge-base master dev) dev 是一回事。【参考方案4】:

.. vs ...diff vs log

的综合版本

【讨论】:

如果它没有那么多不同的颜色和设置操作与../... 的东西混在一起就好了。例如,在log A...B 中,不清楚该命令是返回交集(图表的白色部分)还是 A-B 联合的其余部分(绿色)。没有任何设置的操作数并且只有一种颜色会更重要。 这个真的应该是diff A..Blog 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 点的日志给出了更改日志(提交消息)在两个转速下降到分歧点。 对于difflogA BA..BA...B 之间的这种区别是否有助记符?它有什么意义,或者它在逻辑上是如何解释的?对于log,我认为它比diff 要容易一些,但是对于所有六种情况,很难自然地想出它。【参考方案5】:
git diff foo master

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

git diff foo..master

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

git diff foo...master

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

所以前两个命令是相同的,最后一个只是在差异历史中显示更广泛的视图

【讨论】:

以上是关于Git diff 提交范围中的双点“..”和三点“...”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

git篇之log

Linux中的双点(..)和单点(.)是啥?

Ruby Restclient 不同的双点或 astrophobe 并且顺序很重要

如何提交两个分支的“git diff”?

gitlog和diff区别

获取合并提交的git diff输出结果