我们有多个开发人员在一个共享的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/

10-11 22:21
查看更多