一些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中不存在的提交是提交范围返回的提交,并在维恩图中以红色突出显示,并在提交树中以蓝色圈出:
这些是图表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 commit中双点".."和三点"..."之间有什么区别?范围是多少?.
ProGit§6.1Git工具 - 修订选择 - 提交范围
这取决于您使用的是log
命令还是diff
命令.在这种log
情况下,它在man git-rev-parse
文档中:
要排除从提交可到达的提交,使用前缀^表示法.例如,^ r1 r2表示可以从r2到达的提交,但不包括从r1可到达的提交.
此设置操作经常出现,因此有一个简写.如果你有两个提交r1和r2(根据上面的SPECIFYING REVISIONS中解释的语法命名),你可以要求从r2可以访问的提交,不包括那些可以通过"^ r1 r2"从r1到达的提交,它可以写成"r1..r2".
类似的符号"r1 ... r2"被称为r1和r2的对称差,并被定义为"r1 r2 - not $(git merge-base --all r1 r2)".它是一组提交,可以从r1或r2中的任何一个访问,但不能从两者中访问.
这基本上意味着你将获得两个分支中的任何一个的所有提交,但不是两个分支.
在这种diff
情况下,它在man git-diff
文档中:
git diff [--options]... [--] [ ...] This form is to view the changes on the branch containing and up to the second , starting at a common ancestor of both . "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B". You can omit any one of , which has the same effect as using HEAD instead.
哪个有点模糊.基本上它意味着它只显示该分支与另一个分支相比的差异:它在你给它的第一个提交中查找最后一个常见提交,然后将第二个提交差异化.与此分支相比,这是一种简单的方法,可以查看该分支中的更改,而不会仅注意到此分支中的更改.
这..
有点简单:在这种git-diff
情况下,它与a相同git diff A B
,只是对B进行差异A.在这种log
情况下,它显示了B中但不是A中的所有提交.