【问题标题】:How to undo git rm -rf dirname without a first commit?如何在没有第一次提交的情况下撤消 git rm -rf dirname?
【发布时间】:2012-03-27 11:56:55
【问题描述】:

我做到了:

git init
git add .
git rm -rf dirname

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

有没有办法找回文件?

【问题讨论】:

  • 请将接受的答案更新为实际允许取回文件的答案。

标签: git commit delete-file undo rm


【解决方案1】:

警告:在没有-n 选项的情况下运行git prune (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

(1) 来自git prune 文档:

名字
git-prune - 从对象数据库中删除所有无法访问的对象

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

【讨论】:

  • 这是唯一真正有帮助的答案!谢谢!
  • 你是救生员!在一个项目上工作了 12 个小时并尝试了初始提交后,我不小心运行了git rm -rf . 以撤销更改。老实说,我以为我所有的工作都永远丢失了。未来自我的注意事项 - 总是从一个空的 repo 开始,然后添加文件!
【解决方案2】:

没有办法。

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

简而言之:

  • 不要使用-f
  • 不要碰任何你没有做过的事情。

【讨论】:

  • 就像 unix - -f 意味着你最好确定你在做什么。
  • 考虑到我刚刚取回了我的数据,这根本不是真的,不应该是公认的答案。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 是吗?我没有测试它,但我认为 -f 标志会抑制该错误。
    • 除非你使用-f?这将“覆盖最新检查。”,无论这意味着什么。
    • @Matt - 不,它不会抑制这一点。 git rm 中的 -f 仅用于覆盖最新检查。
    • 我刚刚在 Git 1.7.5.4 上测试过。 git rm -rf 不会触及未暂存的目录,但它会愉快地清除暂存但未提交的目录。
    【解决方案5】:

    git reset --hard 在删除尚未提交时提供帮助,一般而言,删除被Ctrl+Z 中断

    【讨论】:

      【解决方案6】:

      如果您还没有提交,您可以通过以下方式恢复目录:

      git stash
      git stash pop
      git co dirname
      

      【讨论】:

        【解决方案7】:

        git stash 是对我有用的命令。

        【讨论】:

          猜你喜欢
          • 2022-01-17
          • 2018-07-09
          • 2014-04-10
          • 2020-11-16
          • 1970-01-01
          • 2017-08-24
          • 2017-04-11
          • 2013-07-20
          • 2013-02-26
          相关资源
          最近更新 更多