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.
这有点模糊。基本上这意味着它只显示了该分支与另一个分支的差异:它会寻找最后一个与你给它的第一个committish相同的commit,然后将第二个committish与之进行比较。这是一个很容易的方法,可以看到那个分支与这个分支相比有什么变化,而不必只注意这个分支的变化。 ..稍微简单一些:在git-diff的情况下,它与git diff A B相同,只是将A与B进行了比较。在log的情况下,它显示了所有在B中但不在A中的提交。
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.
5条答案
按热度按时间kknvjkwl1#
'...'语法是“从公共祖先开始的两个分支之间的差异”的简写。从official Git book:
相当于:
2sbarzqh2#
在Git日志中使用提交范围
当你使用
..
和git log
这样的提交范围时,它们之间的区别在于,对于分支A和B,将向您显示B拥有而A没有的所有提交,而
将向您显示***both***A拥有和B没有的提交,以及B拥有但A没有的提交,或者换句话说,它将过滤掉A和B共享的所有提交,从而只显示它们 * 不 * 共享的提交。
使用维恩图和提交树进行可视化
下面是
git log A..B
的一个可视化表示,分支B包含的提交在分支A中不存在,这就是提交范围返回的提交,在维恩图中用红色高亮显示,在提交树中用蓝色圈出:下面是
git log A...B
的图表,注意,被两个分支***共享***的提交不会被命令返回:使三点提交范围
...
更有用你可以在log命令中使用
--left-right
选项来显示哪些提交属于哪个分支,从而使三点提交范围...
更加有用:在上面的输出中,你会看到属于
master
的提交带有<
前缀,而属于origin/master
的提交带有>
前缀。将提交范围与Git Diff一起使用
有一天我可能会添加我自己的解释,说明提交范围如何与
git diff
一起工作,但现在,您可能需要查看What are the differences between double-dot ".." and triple-dot "..." in Git diff commit ranges?。另见
8ljdwjyq3#
这取决于您使用的是
log
命令还是diff
命令。在log
的情况下,它位于man git-rev-parse
文档中:为了排除从一个提交可到达的提交,可以使用前缀^表示法。例如^r1 r2表示从r2可到达的提交,但排除从r1可到达的提交。
这个集合操作经常出现,所以有一个简写。当你有两个提交r1和r2(根据上面的指定修订版中解释的语法命名),你可以请求从r2可达的提交,排除那些从r1通过“^r1r2”可达的提交,它可以写成“r1..r2”。
类似的符号“r1...r2”被称为r1和r2的对称差,定义为“r1 r2 --not $(git merge-base --allr 1 r2)",它是从r1或r2中的一个可达但不能从两个都可达的提交集合。
这基本上意味着您将获得两个分支中任何一个分支的所有提交,但不会同时获得两个分支的所有提交。
在
diff
的情况下,它位于man git-diff
文档中:这有点模糊。基本上这意味着它只显示了该分支与另一个分支的差异:它会寻找最后一个与你给它的第一个committish相同的commit,然后将第二个committish与之进行比较。这是一个很容易的方法,可以看到那个分支与这个分支相比有什么变化,而不必只注意这个分支的变化。
..
稍微简单一些:在git-diff
的情况下,它与git diff A B
相同,只是将A与B进行了比较。在log
的情况下,它显示了所有在B中但不在A中的提交。kd3sttzy4#
我认为两个点和三个点最大的混淆来源是因为当与
git diff
一起使用时,它与git log
一起使用时相反。请参阅其他答案、实际文档或大量博客文章以了解 * 确切 * 细节,但我发现这些简单的陈述对于传达正确的 * 想法非常有效:*
kx1ctssn5#
This is a bit confusing = So here is a how it is actually for this flow
https://github.com/alexcpn/gitdiffs/pull/2/commitshttps://github.com/alexcpn/gitdiffs/pull/1/commits
Git Log Behaviour
Git Diff behaviour