Git“缺失”提交

12

我现在遇到这样一种情况,在一个功能分支上所做的一些更改并没有在主分支中反映出来,即使这个分支已经与主分支合并。我不知道为什么会出现这种情况。简单地说,假设这个提交具有哈希值“A”,更改了文件“file”。

可以通过以下命令最好地说明这个问题:

$ git checkout master

$ git branch --contains A
* master
feature_branch

$ git log file | grep A
(no output)

$ git checkout feature_branch

$ git log file | grep A
A

有人可以解释一下这里发生了什么吗?更重要的是,有什么措施可以防止将来再次发生这种情况吗?

编辑:

正如一些人提到的那样,以下内容显示了提交记录:

$ git checkout master

$ git log --follow file | grep A
A

问题在于...文件没有被重命名。所以这也不能完全解释事情的原因。


1
如果你运行 git log A..master,你会得到什么输出(如果有的话)? - jub0bs
1
你是如何合并的?合并可能会重写提交记录(例如压缩)。 - Eric Platon
有输出。很多输出。 这个特定的提交是一个多月前做的... 直到最近才引起了我的注意,它没有在主分支中反映出来。 - adam_bell
@CharlesDuffy 如果你执行了类似 git merge -s ours 的操作(记录一下,我相当确定这个操作没有被执行),它会从历史记录中抹掉一个版本的文件吗? - adam_bell
@Gauthier 是的,没错。但是内容并没有反映出所做的更改。 - adam_bell
显示剩余10条评论
2个回答

8

您是恶意合并的受害者。

以下是重现方法:

git init testrepo
cd testrepo

touch initial
git add initial
git commit -m 'initial commit'

git checkout -b feature_branch
echo "A" >> file
git add file
git commit -m 'file committed'

git checkout master

现在进行一次交互式合并,就像存在合并冲突一样。
git merge --no-commit --no-ff feature_branch

移动文件 file (恶意合并)。

testrepo (master|MERGING)

git mv file someOtherFile
git commit

现在您将看到,主分支包含引入文件file的提交(在我的情况下为9469682)。
 git branch --contains 9469682
  feature_branch
 * master

但是git log不会显示它,因为它已经被移动了。
 git log -- file
 (no output)

使用

git log --follow -- file

同时要记住合并可能会变得更加恶劣。如果file的内容也发生了很大变化,即使使用git log --follow也无法检测到,因为存在重命名阈值。

在这种情况下,请使用git log --follow --find-renames=来调整重命名阈值。

如果生成差异,则对每个提交检测和报告重命名。要在历史遍历中跟踪跨重命名的文件,请参见--follow。如果指定了n,则它是相似性指数(即添加/删除与文件大小相比的量)的阈值。例如,-M90%表示Git应将删除/添加对视为重命名,如果超过90%的文件没有更改。没有百分号,数字应作为分数读取,在其前面有一个小数点。即,-M5变为0.5,因此与-M50%相同。类似地,-M05等同于-M5%。要将检测限制为精确重命名,请使用-M100%。默认的相似性指数为50%。


1
事实是,这些文件没有被重命名。 我刚刚意识到另一个来自另一个功能分支的提交也出现了同样的问题。 - adam_bell

0
如果文件的位置发生了变化,你可能需要告诉 git log 命令进行跟踪:follow
$ git checkout master
$ git log --follow -- file | grep A

您可以通过比较 git log --oneline -- filegit log --oneline --follow -- file 来查看文件是否已被移动。


我不相信文件的位置已经改变了。 但是我还是运行了命令,只是想看看会发生什么... 出乎意料的是,缺失的提交就在那里。 - adam_bell
@Gauthier - 想必这里有个打字错误:--online --> --oneline - KazR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接