在我提交之前,我在一个新的仓库中的ENTIRE目录上做了git rm -r -f
。我没有分支。
我在Stack Overflow上尝试了答案,但都没有帮助。我试过这个:
git reset --hard HEAD
但得到了这个:
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
我有什么方法可以取回文件吗?
答案 0 :(得分:3)
实际上,可以打捞文件。
原因是git rm -r
只会删除索引中的文件,因此要删除它们,您必须已经git add
- 编辑这些文件。当你这样做时,git使用blob-contents的SHA-1“真实名称”将每个文件的内容副本放入存储库。
如果您现在运行git fsck --lost-found
,git将找到没有引用的对象(也就是说,存储库中的所有对象)并打印dangling <type> <SHA-1>
。对于每个“blob”(在这种情况下,它找到的所有内容),它将内容写入SHA-1名称下的.git/lost-found/other/
:
$ git rm -r -f .
rm 'bar'
$ git fsck --lost-found
notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling blob f53433f357a56ddb698196519f30eb390ae684cb
$ cat .git/lost-found/other/f53433f357a56ddb698196519f30eb390ae684cb
this is file bar
$
这也适用于做有一些提交的存储库,并且是“恢复以前有引用但不再存在的东西”的一般方法。这将找到您git add
编辑的文件,然后替换为您在git add
之前git commit
编辑“旧”的新内容。它还会发现任何“被遗弃”的提交,包括丢弃的git stashes。 (提交进入.git/lost-found/commit/
。)
在上面的示例中,文件bar
在其内容中方便地声明为文件bar
。在大多数实际情况下,您必须查看每个恢复的blob并猜测其原始名称。
答案 1 :(得分:0)
由于您在进行任何提交之前删除了数据,因此丢失了数据。
git reset --hard
不起作用,因为您没有初始提交也要重置。因此,“模糊参数”错误,git无法确定您所引用的提交,因为没有提交。