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

一些Git命令需要提交范围,一个有效的语法是用两个点分隔两个提交名称,另一个语法使用三个点...

两者有什么区别?

这取决于你是否使用log命令或diff命令。 在log情况下,它在man git-rev-parse文档中:

要排除提交可达的提交,使用前缀^符号。 例如^ r1 r2表示提交从r2可达,但不包括从r1可达的。

这套操作经常出现,以至于有一个简写。 当你有两个提交r1和r2(根据上面指定修订版中的语法命名)时,你可以要求可以从r2到达的提交,不包括那些可以从r1通过“^ r1 r2”到达的提交,它可以被写为“r1..r2”。

类似的符号“r1 … r2”被称为r1和r2的对称差,并被定义为“r1 r2 – not $(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 AB) B". You can omit any one of <commit>, which has the same effect as using HEAD instead. 

这有点模糊。 基本上,这意味着它只显示与另一个分支相比在该分支中的差异:它会查找最后一次提交的第一个committish,然后将第二个committish与第二个committish区分开来。 与这个分支相比,这是一个很简单的方法,可以看到在这个分支做了哪些变化,而没有注意到这个分支的变化。

..是比较简单的:在git-diff情况下,它和git diff AB ,只是将A和B区分开来。在log情况下,它显示了所有在B中但不在A中的提交。

使用提交范围与Git日志

当你使用提交范围,如.....git log ,他们之间的区别是,对于分支机构A和B,

 git log A..B 

会告诉你所有的B提交的A没有的提交

 git log A...B 

会告诉你A和B都没有的提交,以及B没有A的提交,换句话说, 它会过滤出A和B共享的所有提交,因此只显示他们共享的提交

与维恩图和提交树的可视化

这里是git log A..B的可视化表示。 分支B包含的不在A中的提交是由提交范围返回的,在维恩图中以红色突出显示,在提交树中以蓝色圆圈显示:

“git log A..B”图树1

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

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

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

您可以使用--left-right选项来显示哪些提交属于哪个分支,从而使日志命令更有用:

 $ 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中的双点“..”和三点“…”之间的区别是什么差异提交范围? 。

也可以看看

  • Pro Git第6.1节Git工具 – 修订select – 提交范围