假设我有以下分支结构:
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
似乎不一致,并且不遵循正常模式。
答案 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...y
和x
的合并为基点:它意味着y
。
简而言之,你是对的:git diff $(git merge-base x y) y
不符合正常模式。 (有一个很好的借口,因为它是差异成对完成,而不是通过一系列提交。但是git知道如何为合并提交做组合差异,所以它不是很好借口。:-))