我注意到一些我无法理解的提交。提交具有以下属性:
git log master | grep <sha1>
返回一个事件)git show <sha1>
表示blob不为空)git log master -- file/with/path/xyz | grep <sha1>
并不会返回任何事件)基本上,提交存在于分支中,但不会反映在文件内容中。
我不是提交作者。有一系列合并使得提交成为主人,我也不是合并的人,例如我从master
中提取了origin
。
什么可以使我们的树到这种状态,我该如何解决这个问题?有没有办法找到所有这样的提交?有不止一个,但我不知道有多少。
答案 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”(就像这里所说的那样)。