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
的图表。 请注意,由两个分支共享的提交不会被命令返回:
使三重点提交范围...
更有用
您可以使用--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 – 提交范围