gpt4 book ai didi

即使文件已更改,Git 也不会显示更改

转载 作者:太空狗 更新时间:2023-10-29 13:36:59 24 4
gpt4 key购买 nike

是 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 whatchanged master..27773b72432e86d308d25d666663f237e50aa3fd

(的确,您确实应该改用 git log,但这与为什么它没有按照您的预期进行操作无关。)

这里有一些信息可以帮助理解原因:

表示法27773b72432e86d308d25d666663f237e50aa3fd..master 不是,正如其他用户所建议的那样,意思是“从(但不包括)27773b7 到(包括)master 结束的一系列提交”。有时它会简化为那样,但这不是它的意思。 (您很快就会明白为什么区别很重要。)

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

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

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

然后这将减少到其他人确定的“范围”类型。但在那种情况下,您不会遇到问题。那是因为您已经显示了 27773b7 处的文件与 C 处的文件不同( master ),这意味着 ABC必须改变它。如果您的提交图看起来像那样。

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

另一种可能的样子是

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

在此图中,27773b7...master仅表示 BC ,因为 A无法通过 master 访问,同时 o 可以通过 master 联系到, 它也可以通过 27773b7 到达.

现在可能是文件在 27773b7 处不同的原因是它被 A 改变了吗?或通过 27773b7本身。在任何一种情况下,使用 27773b7^ (正如其他答案所暗示的那样)无济于事。

这让我回到我的观点:如果你真的想想想 A..B作为定义范围的符号,范围的开始可以假设为A ;如果有的话,您会期望它是 A 之间的 merge 基础和 B (如果有的话;有时它可能只是 B 提交层次结构的根) - 等于 A仅当A可以从 B 到达.无论如何,您不能假设它是一个线性范围内的提交。

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

关于即使文件已更改,Git 也不会显示更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51105192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com