git diff的三点符号很奇怪

时间:2014-02-05 01:49:41

标签: git

假设我有以下分支结构:

            E -- F (topic)
           /
A -- B -- C -- D (master)

我尝试了以下内容:

git diff master..topic

git diff master...topic

根据gitrevisions文档,双点表示法应该包含(在这种情况下)topic分支中的修订。

我可视化的方式是,当您使用master..topic表示法时,请考虑从master移动到topic,就像在棋盘游戏中移动棋盘一样。当您移动到每个节点(提交)时,您只包括涉及向前移动片段的提交。这里的前进是topic的尖端,这意味着我们包括提交E和F.

在这种情况下,三点应该包括两个分支中的提交。所以这将是提交F,E和D.

我期望上面的FIRST git diff向我显示提交E和F,但它显示我E,F,D(根据上述规则应该是三点)。 SECOND git diff显示我提交E和F时,我希望它能告诉我E,F,G。为什么这些表现完全相反?我理解git diff文档在示例部分明确指出三点符号表现如预期,但我想当你看看git log如何工作以及git版本文档中的描述时, git diff似乎不一致,并且不遵循正常模式。

2 个答案:

答案 0 :(得分:2)

对于git diff,您应该查看git diff documentation而不是修订规范文档。

git diff [options] blob blob
    This form is to view the differences between the raw contents
    of two blob objects.
git diff [--options] commit..commit [--] [path...]
    This is synonymous to the previous form. If  on one side
    is omitted, it will have the same effect as using HEAD instead.

当你调用git diff master..topic时,它应该分别得到master和topic指向的提交的原始内容之间的原始差异的结果。因此git正确地显示了(E,F)和(D)之间的内容差异。


git diff master...topic的简单解释是topic上发生的所有更改,因为它分支master忽略后者的变化(即{{1}的差异从两者的合并基础开始),在这种情况下,所示的差异将是(E,F)而没有(D)。

答案 1 :(得分:0)

[编辑以修复大脑-o]

双点和三点符号具有git rev-list的含义(以及使用它的所有命令,其中有相当一部分),但 for {{ 1}}。

作为一个特例hack,当你运行git diff并使用双点表示法时,它只是将左手名称提交的提交与右手名称命名的提交区分开来。所以git diff实际上只是git diff x..y。同时,git diff x y是一个不同的特例,它以git diff x...yx的合并为基点:它意味着y

简而言之,你是对的:git diff $(git merge-base x y) y不符合正常模式。 (有一个很好的借口,因为它是差异成对完成,而不是通过一系列提交。但是git知道如何为合并提交做组合差异,所以它不是很好借口。:-))