是吉特坏了还是我们做错了什么?;-)
我们发现,git存储库的最新版本中有一个文件发生了更改,我试图弄清楚这是什么时候在使用whatchanged
。
这怎么可能:
$ git checkout 27773b72432e86d308d25d666663f237e50aa3fd Tools/foo.php
$ md5sum Tools/foo.php
85552061cae9832c11eb6607ac88e3d8 Tools/foo.php
$ git checkout master Tools/foo.php
$ md5sum Tools/foo.php
f38f51232785a432af2d1bd8db4429ed Tools/foo.php
但是:
$ git whatchanged 27773b72432e86d308d25d666663f237e50aa3fd..master | grep foo.php
# empty result
怎么会这样?
最佳答案
简而言之,你可能想尝试使用
git whatchanged master..27773b72432e86d308d25d666663f237e50aa3fd
(确实,您应该使用
git log
来代替它,但这与它为什么没有达到您的预期无关。)以下是一些有助于理解原因的信息:
正如其他用户所建议的那样,这种表示法并不意味着“从(但不包括)
27773b72432e86d308d25d666663f237e50aa3fd..master
开始到(包括)27773b7
结束的一系列提交”。有时会减少到这个程度,但这不是它的意思。(你马上就会明白为什么区别很重要。)它的意思是,“所有可以从
master
访问但不能从master
访问的提交”。(其中“可达”是指通过父指针。)如果我们假设你的提交图看起来像
.... 27773b7 -- A -- B -- C <--(master)
然后这将减少到其他人已经确定的“范围”类型。但那样的话,你就不会遇到问题了。这是因为您已经显示了
27773b7
处的文件与27773b7
(C
)处的文件不同,这意味着master
或A
或B
必须已更改它。如果你的提交图是那样的。所以我们可以得出结论,你的提交图不是这样的。
另一种可能是
--- o -- A -- 27773b7 -- x ...
\
B -- C <--(master)
在这个图中,
C
只是指27773b7...master
和B
,因为C
无法通过A
访问master
,虽然o
可以通过master
访问27773b7
,但也可以通过27773b7
访问。现在有可能文件在
A
处不同的原因是它被27773b7
或27773b7^
本身更改了。在这两种情况下,使用A..B
(如其他答案所示)都没有帮助。这让我回到了我的观点:如果你真的想把
A
符号看作是定义一个范围,那么这个范围的开始不能被认为是A
;如果有什么不同的话,你会希望它是B
和B
之间的合并基(如果有的话);有时它可能只是A
s提交层次结构的根,只有当A
可以从B
访问A..B
时,它才等于B..A
。无论如何,你不能假设它是一个线性的提交范围。但是,了解它真正指示的提交图的子集可以更清楚地看到,如果没有显示任何内容,您可能需要尝试。