【问题标题】:How to revert a "git rm -r ."?如何恢复“git rm -r。”?
【发布时间】:2011-01-08 16:52:09
【问题描述】:

我不小心说了git rm -r .。我该如何从中恢复?

我没有承诺。

我认为所有文件都被标记为删除,并且也从我的本地结帐中物理删除。

编辑: 我可以(如果我知道该命令)恢复到上次提交。但如果我可以撤消git rm -r .,那会好很多。因为我不确定在最后一次提交之后和git rm -r . 之前我做了什么。

【问题讨论】:

  • 对于这个特定的问题,reset --hard 是一个很好的解决方案...它已经列出,所以我将在此评论中提到您可能需要查看 git-reflog 的文档。
  • 请注意,由于您没有将 -f 提供给 git rm,git 不会删除任何已暂存或未暂存更改的文件,因此 git reset; git checkout . 应该会恢复所有内容。
  • 请注意 - git checkout 。将清除所有未暂存的更改。
  • 我只是做了这样的事情,我不明白为什么我的本地文件被删除了(而且,像 OP 一样,我还没有提交。)
  • 使用 Git 2.23+(2019 年 8 月),您可以使用 git restore:git restore -s@ -SW -- . 恢复文件。见my answer below

标签: git git-rm


【解决方案1】:

更新:

由于git rm . 删除了此目录和工作结帐以及索引中的子目录中的所有文件,因此您需要撤消这些更改:

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD

这应该做你想做的事。它不会影响您签出代码或索引的父文件夹。


不是的旧答案:

reset HEAD

可以解决问题,并且不会删除您对文件所做的任何未提交的更改

之后,您需要重复您已排队的任何 git add 命令。

【讨论】:

  • 抱歉,我总是设置 git alias.co="checkout" 以便 git co 进行结帐。
【解决方案2】:
git reset HEAD

应该这样做。如果您没有任何您关心的未提交更改,那么

git reset --hard HEAD

应该强制将所有内容重置为您的最后一次提交。如果您确实有未提交的更改,但第一个命令不起作用,则使用 git stash 保存未提交的更改:

git stash
git reset --hard HEAD
git stash pop

【讨论】:

  • 请注意,git reset --hard HEAD 会破坏您在当前工作目录的父目录中所做的任何有用更改。
  • @Mild:我还在冒冷汗!
  • 我没有投反对票,但我只是尝试了隐藏、硬重置、弹出并丢失了我最近的所有更改。也许我看错了答案。
  • 这对我来说很少有用,我很高兴我在 Dropbox 文件夹中工作。糟糕的形式,但每次都救我......
  • 当我执行 git stash pop 时,它只是再次删除了文件,当然因为它隐藏了我(意外)删除了一些文件的事实。如果您要保留未提交的更改,则此答案无效。
【解决方案3】:

当我意识到我需要一些文件时,我 git-rm'd 了一些文件并在下一次提交之前继续进行更改。如果需要,您可以简单地检查您错过/删除的单个文件,而不是存储和重置:

git checkout HEAD path/to/file path/to/another_file

这会使您的其他未提交的更改完好无损,没有任何变通方法。

【讨论】:

  • 这很有帮助,因为我还有其他未提交的更改。
  • 这个答案有助于我们这些偶然发现这个问题的人希望恢复单个 git rm 而不是整个递归 git rm -r。对于完全递归删除,其他解决方案可能会更好,具体取决于删除的文件数量。
【解决方案4】:

如果您最终没有上述方法,您可以使用此处的建议检索数据:http://www.spinics.net/lists/git/msg62499.html

git prune -n
git cat-file -p <blob #>

【讨论】:

  • 4 年后,还是救命稻草!
  • 我编写了一个 c++ 程序来连接结果(我的 repo 中有大约 100 个对象悬空,这是必要的)。只需编译并运行,然后传入你的 git repo 本地目录。 raw.githubusercontent.com/bluuman/git-recover-files/master/…
  • 这个方法不错,运行git prune -n后,我得到了很多行,这些行要么是tree要么是blob要么是commit,我填写了所有的哈希字符串blob,我尝试使用第二个命令到git cat-file -p &lt;blob #&gt;,我仍然找不到丢失的文件。我的情况很简单,我新建了一个名为a.cpp的文件,并将这个文件添加到索引中,后来我用git rm -f删除了这个文件,我看到a.cpp迷路了。
  • 对不起我之前的评论,我再次测试,它可以恢复git rm -f删除的文件,我不知道为什么之前的测试不起作用,谢谢!
【解决方案5】:

要重新获得一些单个文件或文件夹,可以使用以下方法

git reset -- path/to/file
git checkout -- path/to/file

这将首先重新创建path/to/file 的索引条目,然后重新创建文件,就像它在上次提交中一样,即HEAD

提示:可以将提交哈希传递给两个命令,以从较旧的提交重新创建文件。详情请参阅git reset --helpgit checkout --help

【讨论】:

  • 最佳答案。对单个 git rm 操作进行简单的外科手术“撤消”,而不会清除其他未提交的更改。
  • 帮帮我!最佳答案。
【解决方案6】:

已经有一些很好的答案,但我可能会建议一种很少使用的语法,它不仅效果很好,而且在你想要的方面非常明确(因此并不可怕或神秘)

git checkout <branch>@{"20 minutes ago"} <filename>

【讨论】:

    【解决方案7】:

    我也有同样的情况。就我而言,解决方案是:

    git checkout -- .
    

    【讨论】:

      【解决方案8】:

      如果您已提交并推送更改,则可以执行此操作以取回文件

      // Replace 2 with the # of commits back before the file was deleted.
      git checkout HEAD~2 path/to/file
      

      【讨论】:

      • 这适用于“要提交的更改:”从我仍然需要的旧 git cherry-pick 中删除了一个文件。我试过 git reset HEAD~ 没有不行。
      【解决方案9】:

      我遇到了完全相同的问题:清理文件夹、重新排列和移动文件。我输入: git rm . 并回车;然后感觉我的肠子松了一点。幸运的是,我没有直接输入 git commit -m "" 。

      但是,下面的命令

      git checkout .
      

      恢复了一切,救了我的命。

      【讨论】:

        【解决方案10】:

        获取列表提交

        git log  --oneline
        

        例如,稳定提交有哈希:45ff319c360cd7bd5442c0fbbe14202d20ccdf81

        git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
        git push -ff origin master
        

        【讨论】:

          【解决方案11】:

          撤消 git rm

          git rm file             # delete file & update index
          git checkout HEAD file  # restore file & index from HEAD
          

          撤消 git rm -r

          git rm -r dir          # delete tracked files in dir & update index
          git checkout HEAD dir  # restore file & index from HEAD
          

          撤消 git rm -rf

          git rm -r dir          # delete tracked files & delete uncommitted changes
          not possible           # `uncommitted changes` can not be restored.
          

          Uncommitted changes 包括not staged changesstaged changes but not committed

          【讨论】:

          • 当然,没有什么可以撤消git rm -rf,因为这也可能会删除未跟踪或暂存的(仅)文件。
          • git rm -rf filegit rm -rf dir 不会删除任何未跟踪的文件。
          【解决方案12】:

          使用 Git 2.23+(2019 年 8 月),恢复文件(和索引)的正确命令应该是使用... git restore(不是 reset --hardconfusing git checkout command )

          即:

          git restore -s=HEAD --staged --worktree -- .
          

          或其缩写形式:

          git restore -s@ -SW -- .
          

          【讨论】:

            【解决方案13】:

            如果您对未暂存(因此也未提交)更改的 repo 执行命令 git rm -r --cached .,则可以使用命令 git restore --staged . 撤消操作(取消暂存删除)

            简而言之,要撤消 git rm -r --cached .,您只需运行git restore --staged .

            【讨论】:

              猜你喜欢
              • 2011-06-28
              • 1970-01-01
              • 1970-01-01
              • 2015-05-16
              • 2013-07-20
              • 1970-01-01
              • 2016-07-09
              • 2014-05-02
              • 1970-01-01
              相关资源
              最近更新 更多