我们有多个开发人员在一个共享的git存储库上工作(他们将其推送至此)。
我们发现开发人员完成的某些提交丢失了。
我们可以使用gitk
命令(在Windows中使用)查看那些提交历史记录。
但是,当我们转到gitk中显示的提交中指定的文件并使用git log filepath
查看历史记录时,我们根本看不到该提交。
我们不知道这种情况如何发生,也不知道如何恢复。
我们认为这样会丢失来自不同开发人员的10多个提交。
奇怪的事情之一是,我们使用git checkout 034534fd
check out 了一些旧的提交
并一一提交完成git cherry-pick 234234321
。在执行此操作时,我们丢失了提交,但“234234321”的提交日志中未显示有关受影响文件的任何信息。
最佳答案
你的问题让我有些困惑。您是说可以在gitk
中看到提交,但不能在git log -- filepath
中看到提交吗?
如果是这样,您的提交不会丢失; git log
的简化历史记录使它们对您 stash 了,因为它认为它们没有兴趣。如果将--full-history
参数传递给git log
,您应该会看到它们。
解释
默认情况下,当您执行git log -- filepath
时,如果Git认为更改没有意义,则Git不会显示您对该文件所做的更改。这称为“历史简化”。这通常发生在樱桃小菜上。
关于简化历史记录的文档(请参阅git help log
)编写得不太好(极其难以理解),但这是关键部分:
换句话说,当Git在历史记录中查找更改filepath
的提交并遇到 merge 提交时,它并不总是走遍 merge 提交的所有父级。它通常只选择一个 parent ,并且只走 parent 的祖先。这意味着,如果提交位于其他分支之一中,则不会看到修改该文件的提交。--full-history
参数告诉git log
遍历所有 parent ,从而显示每次修改filepath
的提交,无论Git认为它是否有趣。
关于Git丢失了无法在历史中找到的提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9603072/