首页 > 解决方案 > 即使文件更改,Git 也不会显示更改

问题描述

git坏了还是我们做错了什么?;-)

我们发现,在最新版本的 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

解决方案


简短的回答是,您可能想尝试使用

git whatchanged master..27773b72432e86d308d25d666663f237e50aa3fd

(确实,您确实应该使用它git log,但这与为什么它没有达到您的预期无关。)

以下是一些有助于理解原因的信息:

正如其他用户所建议的那样,该符号27773b72432e86d308d25d666663f237e50aa3fd..master并不意味着“一系列提交开始于(但不包括)并结束于(并包括)”。它有时会简化为那个,但这不是它的意思。(你马上就会明白为什么区分很重要。)27773b7master

master它的意思是,“所有可以从 到达,但不能从到达的提交27773b7”。(“可达”意味着通过父指针。)

现在,如果我们假设您的提交图看起来像

 .... 27773b7 -- A -- B -- C <--(master)

那么这将减少到其他人已经确定的“范围”类型。但在这种情况下,您不会遇到问题。那是因为您已经证明 at的文件与( )27773b7的文件不同,这意味着要么或要么必须更改它。如果您的提交图看起来像那样。CmasterABC

所以我们可以得出结论,您的提交图看起来不像那样。

它的另一种外观是

--- o -- A -- 27773b7 -- x ...
     \
      B -- C <--(master)

在此图中,27773b7...master仅表示BC,因为A不能通过 到达master,而通过o 可以到达master,也可以通过 到达27773b7

现在文件不同的原因可能27773b7是它被自己A27773b7自己改变了。在任何一种情况下,使用27773b7^(如其他答案所示)都无济于事。

这让我回到了我的观点:如果您真的想将A..B符号视为定义范围,则不能假定范围的开头是A; 如果有的话,你会期望它是 and 之间的合并基础AB如果有的话;有时它可能只是Bs 提交层次结构的根) - 这等于A只有 ifA可以从B. 无论如何,你不能假设它是一个线性的提交范围。

但是了解它真正指示的提交图的子集会更清楚,如果A..B没有显示任何内容,您可能需要尝试B..A


推荐阅读