Pat*_*otz 380 git git-diff git-log
一些Git命令采用提交范围,一个有效语法是用两个点分隔两个提交名称..,另一个语法使用三个点....
两者有什么不同?
小智 600
当你使用像..和和的提交范围...时git log,它们之间的区别在于,对于分支A和B,
git log A..B
Run Code Online (Sandbox Code Playgroud)
将告诉你B所拥有的A所提交的所有提交,而
git log A...B
Run Code Online (Sandbox Code Playgroud)
会告诉你这两个 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
Run Code Online (Sandbox Code Playgroud)
在上面的输出中,您将看到属于的提交master带有前缀<,而属于的提交origin/master带有前缀>.
有一天,我可能会对提交范围的工作方式添加自己的解释git diff,但是现在,您可能想要查看Git diff commit中双点".."和三点"..."之间有什么区别?范围是多少?.
Pie*_*ter 230
这取决于您使用的是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文档中:
Run Code Online (Sandbox Code Playgroud)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情况下,它与a相同git diff A B,只是对B进行差异A.在这种log情况下,它显示了B中但不是A中的所有提交.
TTT*_*TTT 34
我认为关于两个点与三个点的最大混淆来源是因为与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.
Run Code Online (Sandbox Code Playgroud)
Ale*_*nen 16
这有点令人困惑 = 所以这里是这个流程的实际情况
A---B---C topic
/
D---E---F---G main
Run Code Online (Sandbox Code Playgroud)
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 (主题) C * 6b1eb5a B * d65c129 A |
主题 D E A B C |
主 D E F G |
在主题和主要中,但不在 两者中 |
| 2 | git log --oneline --graph main...topic * 9411a8b (HEAD -> main) G * 3a567aa F * aad429f (主题) C * 6b1eb5a B * d65c129 A |
主题 D E A B C |
主 D E F G |
与上面相同 |
| 3 | git log --oneline --graph topic..main * 9411a8b (HEAD -> main) G * 3a567aa F |
主题 D E A B C |
主 D E F G |
在主要内容中,但不在主题中 |
| 4 | git log --oneline --graph main..topic * aad429f(主题)C * 6b1eb5a B * d65c129 A |
主题 D E A B C |
主 D E F G |
在主题中,但不在主要内容中 |
Git Diff 行为
| 1 | git diff 主题..main D E -A -B -C +F +G |
主题 D E A B C |
主 D E F G |
与主题相比,主要内容 和非主要内容 |
| 2 | git diff main..topic D E -F -G +A +B +C |
主题 D E A B C |
主 D E F G |
与 主要内容相比,主题中的内容和主题之外的内容 |
| 3 | git diff main...topic D E (你可能会在这里得到换行符) +A +B +C |
主题 D E A B C |
主 D E F G |
在主题中,但不在主要内容中 |
| 4 | git diff 主题...主要 D E +F +G |
主题 D E A B C |
主 D E F G |
在主要内容中,但不在主题中 |