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


Answers:


251

这取决于您使用的是log命令还是diff命令。在这种log情况下,它在man git-rev-parse文档中:

为了从提交中排除可到达的提交,使用前缀^表示法。例如^ r1 r2表示可从r2到达的提交,但不包括可从r1到达的提交。

这种设置操作经常出现,以至于它有一个简写形式。当您有两个提交r1和r2(根据上面的“指定版本”中所述的语法命名)时,您可以要求从r2可以访问的提交,而不是通过“ ^ r1 r2”从r1可以访问的提交,并且可以写为“ r1..r2”。

类似的符号“ r1 ... r2”被称为r1和r2的对称差,并且定义为“ r1 r2-不是$(git merge-base --all r1 r2)”。这是可从r1或r2之一访问的提交集合,但不能从两者都访问。

从根本上讲,这意味着您将获得两个分支中任何一个的所有提交,但不能同时获得这两个分支中的所有提交。

在这种diff情况下,它在man git-diff文档中:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

这有点模糊。基本上,这意味着它仅显示该分支与另一个分支的不同之处:它使用您给它的第一个commitish查找最后一个公共提交,然后将第二个commitish与该差异进行比较。与该分支相比,这是一种查看该分支所做的更改的简便方法,而无需仅注意该分支的更改。

..稍微简单:在git-diff情况下,这是相同的git diff A B,只是一个diff文件对B.在log情况下,它表明在B,而不是在A中的所有提交


31
这是很可笑的是如何的意义..,并...精确地交换日志和DIFF:log A..B从合并基础到B的变化是什么diff A...B
phiresky

1
@phiresky是的,那真的是很差的可用性。我建议不要将点符号用于git diff
Wisbucky

2
这是否等于A...B== A..B + B..A
丹农

2
@Danon git log绝对是这样
maoizm

659

在Git日志中使用提交范围

当您使用..和一样的提交范围...git log,它们之间的区别在于,对于分支A和B,

git log A..B

将向您显示B具有A没有的所有提交,而

git log A...B

会告诉你这两个 A有B没有的提交和,以及提交该B已经是一个不具备,或者换句话说,它会过滤掉所有提交的是A和B份额,因此只显示他们共享的提交

使用维恩图和提交树进行可视化

这是的视觉表示git log A..B。分支范围B所包含的提交(在A中不存在)是由提交范围返回的,并在Venn图中以红色突出显示,并在提交树中以蓝色圈出:

 “ git log A..B”图树1

这些是的图表git log A...B。请注意,两个分支共享的提交不会由以下命令返回:

 “ git log A ... B”图树2

使三点提交范围...更有用

...通过使用--left-right显示哪些提交属于哪个分支的选项,可以使三点提交范围在log命令中更加有用:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

在上面的输出中,您将看到属于的提交以master前缀<,而属于的提交以origin/master前缀>

在Git Diff中使用提交范围

有一天,我可能会添加自己的解释,说明提交范围如何使用git diff,但是现在,您可能想了解一下Git diff commit中双点“ ..”和三点“ ...”之间的区别是什么?范围?

也可以看看


35
该答案实际上以简洁的文字,示例和图片解释了区别。我喜欢它比仅引用不清楚文档的当前投票最高的答案好得多。(tl; dr感谢这个答案,我实际上理解了区别。)
aerique

4
@Cupcake可以在git diff中添加...的含义吗?
Marius 2014年

1
@Marius实际上,既然您提出了它,我将继续在我的答案中链接到另一个问题,以供将来像您这样的读者使用。

2
这实际上不是相反吗?dig diff a..b是ALL diff,或与git diff a b基本相同。而git dif a ... b是仅从b分支以来才进行过b的更改。
wejrowski16年

2
至少对于git log。对于git diff来说,情况可能会发生逆转:stackoverflow.com/questions/7251477/…–
本杰明·阿特金
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.