如何在没有第一次提交的情况下撤消git rm -rf dirname?

时间:2012-03-10 05:14:44

标签: git commit delete-file undo rm

我做了:

git init
git add .
git rm -rf dirname

查看其他答案,git reset --hard HEADgit checkout -fgit reflog不起作用,显然是因为没有HEAD可以返回,也没有提交文件。

有没有办法让文件恢复?

6 个答案:

答案 0 :(得分:9)

没有办法。

通常,git rm会在删除之前检查已提交的文件,因此您不会丢失任何工作。但是,使用-f会覆盖此检查。

简而言之:

  • 请勿使用-f
  • 不要碰任何你没有犯过的东西。

答案 1 :(得分:2)

警告:在没有git prune选项的情况下运行-n(1)将清除您无法访问的数据。

可能有一种方法,使用git prunegit cat-file

运行git prune -n将列出通过修剪删除哪些对象:

$ git prune -n
9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob
c315143703752ef4d11ca7d93f2c324872b2ebff blob

每一行对应一个已删除的文件。

现在,使用git cat-file,我们可以将删除的文件的内容恢复为新文件:

git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restored-filename.whatever

(1)来自git prune文档:

  

NAME   
git-prune - 修剪对象数据库中所有无法访问的对象   

选项   
-n   
--dry运行   
不要移除任何东西;只需报告它会删除的内容。

答案 2 :(得分:1)

据我所知,没有。我相信git取消链接文件,就像执行rm -rf一样。它是否知道文件并不重要,它很乐意核对目录。实际上,您唯一的办法就是尝试使用文件恢复工具,就好像 已完成rm -rf

答案 3 :(得分:1)

git reset --hard帮助了删除尚未提交,一般来说,删除被Ctrl+Z

中断

答案 4 :(得分:0)

如果git没有跟踪dirname目录,它将不允许您删除git rm -rf目录,因为它不知道它。你会(会)得到像

这样的错误
fatal: pathspec 'dirname' did not match any files

如果您在git add .之后完成了git add dirnamegit init,那么您唯一可以删除的方式就是。如果是这种情况,你的文件就会消失,你无法将它们取回,因为它从未被提交过,而git也没有跟踪它。它与在普通文件夹上执行rm -rf一样好(除非你有备份,否则无法恢复)

答案 5 :(得分:0)

如果尚未提交,可以执行以下操作恢复目录:

git stash
git stash pop
git co dirname