我运行了git update-ref -d HEAD
命令,该命令删除了我所有的文件。文件夹的大小仍然很大,所以,我认为文件在git的内存中以某种方式存在。
如何恢复这些文件?
答案 0 :(得分:1)
如果可能的话,使用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命令;根据您的命令环境进行修改)。