Git鬼提交

时间:2014-05-20 03:37:27

标签: git version-control commit

我注意到一些我无法理解的提交。提交具有以下属性:

  1. 它存在于主分支中(例如git log master | grep <sha1>返回一个事件)
  2. 它有适当的内容(git show <sha1>表示blob不为空)
  3. 更改文件/使用/ path / xyz
  4. 正在运行git log master -- file/with/path/xyz | grep <sha1>并不会返回任何事件)
  5. 主文件中的
  6. file / with / path / xyz不包含提交中的更改
  7. 基本上,提交存在于分支中,但不会反映在文件内容中。

    我不是提交作者。有一系列合并使得提交成为主人,我也不是合并的人,例如我从master中提取了origin

    什么可以使我们的树到这种状态,我该如何解决这个问题?有没有办法找到所有这样的提交?有不止一个,但我不知道有多少。

1 个答案:

答案 0 :(得分:2)

第4项和第5项捆绑在一起。正如git log documentation所说:

  

[--] <path>...

     

仅显示足以解释文件的提交   匹配指定的路径来了。请参阅历史简化   以下是详细信息和其他简化模式。

如果您给git log --full-history选项,则会看到提交重新出现。

  

什么可以让我们的树到这种状态...

通常是不正确的合并。

可以告诉合并在发生冲突时忽略某些更改(例如-X ours,不要与-s ours混淆)。

在任何合并中,在实际提交合并结果之前,您可以更改树。 (当合并失败,必须或使用--no-commit选项时,这当然要容易得多。)

在任何情况下,合并产生的树都是你设置的树,或者 - 如果你没有改变任何东西 - git最好猜测正确的结果是基于传递给merge命令的选项。

  

我该如何解决这个问题?

它可能不会被打破(尽管你问的事实表明它是这样)。通常,在合并两个修订版时,git的自动合并通常做正确的事情,但是为了防止将来出现结果有什么问题,无论谁进行合并都必须检查。

  

有没有办法找到所有这些提交?

阅读History Simplification命令中的git log部分。听起来你有兴趣看看哪些提交是或者不是特定文件的“TREESAME”(就像这里所说的那样)。