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

两者之间有什么区别?


当前回答

使用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中不存在的提交是由提交范围返回的,在维恩图中用红色突出显示,在提交树中用蓝色圈出:

 

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

 

做三点提交范围…更有用的

你可以让三点提交范围…在log命令中使用——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提交范围中双点“..”和三点“…”之间的区别是什么?

另请参阅

Pro Git§6.1 Git工具-修订选择-提交范围

其他回答

这取决于您使用的是log命令还是diff命令。在日志的情况下,它在man git-rev-parse文档中:

To exclude commits reachable from a commit, a prefix ^ notation is used. E.g. ^r1 r2 means commits reachable from r2 but exclude the ones reachable from r1. This set operation appears so often that there is a shorthand for it. When you have two commits r1 and r2 (named according to the syntax explained in SPECIFYING REVISIONS above), you can ask for commits that are reachable from r2 excluding those that are reachable from r1 by "^r1 r2" and it can be written as "r1..r2". A similar notation "r1...r2" is called symmetric difference of r1 and r2 and is defined as "r1 r2 --not $(git merge-base --all r1 r2)". It is the set of commits that are reachable from either one of r1 or r2 but not from both.

这基本上意味着您将获得两个分支中的任何一个中的所有提交,但不能同时获得两个分支中的所有提交。

在diff情况下,它在man git-diff文档中:

Git diff[——options] <commit>…<commit>[——][<path>…] 此表单用于查看包含和到的分支上的更改 第二个<commit>,从两者的共同祖先开始 <提交>。“git diff A…B”相当于“git diff” $(git-merge-base A B) B"。您可以省略<commit>中的任何一个 与使用HEAD有相同的效果。

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

. .有点简单:在git-diff情况下,它与git diff a B相同,只是将a与B区别。在日志情况下,它显示了所有在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中不存在的提交是由提交范围返回的,在维恩图中用红色突出显示,在提交树中用蓝色圈出:

 

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

 

做三点提交范围…更有用的

你可以让三点提交范围…在log命令中使用——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提交范围中双点“..”和三点“…”之间的区别是什么?

另请参阅

Pro Git§6.1 Git工具-修订选择-提交范围

我认为两点和三点最大的混淆来源是因为当与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.

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

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

https://github.com/alexcpn/gitdiffs/pull/2/commits https://github.com/alexcpn/gitdiffs/pull/1/commits

Git日志行为

1 > git log --oneline --graph topic...main
* 9411a8b (HEAD -> main) G
* 3a567aa F
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
topic
D
E
A
B
C
main
D
E
F
G
In topic and main, but not in
both
2 git log --oneline --graph main...topic
* 9411a8b (HEAD -> main) G
* 3a567aa F
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
topic
D
E
A
B
C
main
D
E
F
G
Same as above
3 git log --oneline --graph topic..main
* 9411a8b (HEAD -> main) G
* 3a567aa F
topic
D
E
A
B
C
main
D
E
F
G
In main,but not in topic
4 git log --oneline --graph main..topic
* aad429f (topic) C
* 6b1eb5a B
* d65c129 A
topic
D
E
A
B
C
main
D
E
F
G
In topic, but not in main

Git差异行为

1 git diff topic..main
D
E
-A
-B
-C
+F
+G
topic
D
E
A
B
C
main
D
E
F
G
what's in main
whats not in main compared
to topic
2 git diff main..topic
D
E
-F
-G
+A
+B

+C
topic
D
E
A
B
C
main
D
E
F
G
whats in topic
whats not in topic compared to
main
3 git diff main...topic
D
E (you may get newline here)
+A
+B
+C
topic
D
E
A
B
C
main
D
E
F
G
In topic,but not in main
4 git diff topic...main
D
E
+F
+G
topic
D
E
A
B
C
main
D
E
F
G
In main, but not in topic