双点“.."还有三个点"…"在Git提交范围内?

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

两者之间有什么区别?

90919 次浏览

这取决于您使用的是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 A B) B". You can omit any one of <commit>, which
has the same effect as using HEAD instead.

这有点模糊。基本上,这意味着它只显示该分支与另一个分支的差异:它寻找与你给它的第一个提交的最后一个共同提交,然后将第二个提交与该提交进行差异。这是一种简单的方法,可以查看与这个分支相比,那个分支中发生了哪些变化,而不需要只注意到这个分支中的变化。

..有点简单:在git-diff的情况下,它与git diff A B相同,只是将a与B区别开来。在log的情况下,它显示了所有在B中但不在a中的提交。

使用Git日志的提交范围

当你使用.....git log这样的提交范围时,它们之间的区别是,对于分支A和B,

git log A..B

将显示你所有B有而A没有的提交,而

git log A...B

将会显示< em > < / em > A有而B没有的提交,以及B有而A没有的提交,换句话说,它将过滤掉A和B共享的所有提交,因此只显示它们都共享的提交

维恩图可视化提交的树木

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

 树1

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

树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差异的提交范围

有一天,我可能会对提交范围如何使用git diff添加自己的解释,但现在,您可能想查看双点“.."还有三个点"…"在Git diff提交范围?

另请参阅

这有点让人困惑=所以这里是这个流程的实际情况

      A---B---C topic
/
D---E---F---G master

https://github.com/alexcpn/gitdiffs/pull/2/commits # EYZ0 < / p >

Git日志行为

1 >Git日志-一行-图形主题…main
* 3a567aa F
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 在topic和main中,但在
中都没有
2 Git日志- online -graph main…topic
* 9411a8b (HEAD ->main) G
* 3a567aa F
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 同上
3. Git日志-一行-图形主题..main
* 3a567aa
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 在主旨上,但在主题上没有
4 Git日志- online -graph main..topic
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 在主题上,而不在主旨上

Git差异行为

1 Git diff主题..main
D
E
a
-B
-C
+F
+G
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 什么在主
什么不在主比较
主题
2 Git差异主要..主题E D < br > < br > < br > - f < br > - g一个< br > < br > + + B < br > < br > + C 主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 主题中的内容

main相比,主题中没有什么
3. Git差异主要…topic
D
E(你可能在这里得到换行符)
+A
+B
+C
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 在主题上,而不在主旨上
4 git diff topic…main
D
E
+F
+G
主题E D < br > < br > < br > < br > < br > B C 主要< br > D F E < br > < br > < br > G 在主旨上,但在主题上没有

我认为两个点和三个点最大的混淆来源是因为当与git diff一起使用时,它是有点相反,而与git log一起使用时。

请参阅其他答案、实际文档或大量关于确切的细节的博客文章,但我发现这些简单的陈述可以很好地传达正确的的想法:

git log  A..B   # Show me commits only on B.
git log  A...B  # Show me commits only on A or only on B.
git diff A..B   # Show me changes only on A or only on B.
git diff A...B  # Show me changes only on B.