Git:恢复被“ git update-ref -d HEAD”删除的文件

时间:2018-09-14 15:38:32

标签: git

我运行了git update-ref -d HEAD命令,该命令删除了我所有的文件。文件夹的大小仍然很大,所以,我认为文件在git的内存中以某种方式存在。 如何恢复这些文件?

1 个答案:

答案 0 :(得分:1)

使用Horba's answer

如果可能的话,使用HEAD reflog技巧。如果这种方法出现问题,我也会在这里留下我自己的较早答案。


(原始答案)

  

我运行了git update-ref -d HEAD命令,该命令删除了我所有的文件。

实际上,它不是:

可能删除了附加了HEAD分支名称(通常将HEAD附加到分支名称)。

  

...我该如何恢复?

运行:

git fsck --lost-found

您可能会看到类似的输出,我在一个小型测试存储库中运行了该输出:

notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling commit 6719ac33e5c385b9fdba7c57636fbf8cc71a3f3f

如果您与一个未出生分支的dangling commit一起得到一个完全 notice –在这种情况下为master;您的将是您刚刚删除的任何分支的分支,那么这个特定的提交(可能是;请参见下文中的一些极端情况)是您想要的:

$ git branch master 6719ac33e5c385b9fdba7c57636fbf8cc71a3f3f

重新创建它,之后一切恢复正常:

$ git status
On branch master
nothing to commit, working tree clean

如果收到多条 dangling commit消息,请对产生的每个提交哈希ID运行git show和/或git log。其中之一(可能)是您应该重新连接的提交。但是,您可能处于下一段所述的情况中:

如果收到 no dangling commit消息,则表示您所在的分支已完全合并到其他分支中。在这种情况下,不需要重新创建分支名称。您可以简单地git checkout一些其他分支名称来附加HEAD

请注意,如果您位于分离的HEAD 上并使用git update-ref -d HEAD,则会破坏Git存储库:

$ git checkout --detach master
HEAD is now at 6719ac3... initial
$ git update-ref -d HEAD
$ git status
fatal: Not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

在这种情况下,您必须重新创建符号HEAD。不幸的是,普通的Git命令拒绝运行:

$ git symbolic-ref HEAD refs/heads/master
fatal: Not a git repository (or any parent up to mount point /)

因此,您必须作弊:

$ echo 'ref: refs/heads/master' > .git/HEAD
$ git status
On branch master
nothing to commit, working tree clean

(这假定为sh / bash命令;根据您的命令环境进行修改)。