Answers:
这取决于您使用的是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中的所有提交
..
,并...
精确地交换日志和DIFF:log A..B
从合并基础到B的变化是什么diff A...B
呢
git diff
。
A...B
== A..B + B..A
?
git log
绝对是这样
当您使用..
和一样的提交范围...
时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
。请注意,两个分支共享的提交不会由以下命令返回:
...
更有用...
通过使用--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 commit中双点“ ..”和三点“ ...”之间的区别是什么?范围?。