michas 的答案是正确的答案。
如果您没有旧的 ref,即 的a8e5e4e
部分a8e5e4e..295bf31 master -> origin/master
怎么办?可能您实际上并不关心:正如他所建议的那样,看master...origin/master
可能会更有趣。1 但是,这个三点...
语法实际上是什么意思?
答案在git rev-list
文档中:
另一个特殊符号<commit1>...<commit2>
对合并很有用。提交的结果集是两个操作数之间的对称差异。...
我怀疑这足以令人困惑的措辞(实际上git diff
使用了完全不同的含义)。但实际上,它并没有那么复杂。
给定一些可以像这样绘制的提交:
master origin/master
E G
| |
D F
\ /
C
|
B
|
A
你所拥有的是 commit 的分歧C
。master
当和origin/master
都指向时,您开始工作C
。显然,您承诺了D
and E
,而“他们”(无论他们是谁)都承诺了F
and G
。顺便说一下,提交C
被称为合并基础。
意思master...origin/master
是:找到我C
,然后把左右两边的东西都“从那里”给我。也就是说,所有在master
和 origin/master
上的提交,不包括在它们第一次相遇点及以下的任何提交。
如果您运行gitk master...origin/master
,您将看到:2您所做的所有提交,以及他们所做的所有提交。但是,如果您运行,则会将大部分内容抛出。相反,它会找到合并基数3并将其与右侧名称进行比较。git diff flags master...origin/master
git diff
C
假设您在您的master
分支上(即,HEAD
无论如何都只是意味着“master”),您可以进一步缩短它。要查看自从您和他们的分支分歧后他们修改了哪些文件,只需运行:
$ git diff --stat ...origin/master # or --name-status, etc
留下名字的意思HEAD
,所以这和HEAD...origin/master
which是一样的master...origin/master
。
如果你的 git 足够新,@{u}
指的是“当前分支的上游分支”(即 from master
, find origin/master
),所以你可以运行:
$ git diff --stat '...@{u}'
(引号是为了保护括号免受外壳的影响;在您的特定外壳中可能需要也可能不需要它们)。即使您将develop
其origin/develop
作为其上游或作为其上游等,featureX
这也有效。origin/featureX
1如果没有gitk
,请尝试:
$ git log --graph --boundary ...origin/master
(或'...@{u}'
如上所述)。您需要--boundary
包含合并提交。您可能还想添加--oneline --decorate
。
2实际上gitk
也会向您显示合并提交,就像脚注 1 中的命令一样。也就是说,它用于--boundary
包含会合点提交(这与合并基础并不完全相同,但足够接近)。
3这假设只有一个合并基础提交。对于这些情况,这应该是正确的。因此,git diff
将树C
与G
上游分支头部的树进行比较。您将比较“他们在哪里”和“他们最终在哪里”,而不管他们在任意长的车程中访问的任何中间点。:-) 例如,如果提交F
添加了一个文件this/that
,然后G
再次提交删除它,您将看不到该文件。