如何恢复"git rm -r."?

use*_*021 360 git git-rm

我意外地说git rm -r ..我该如何从中恢复?

我没有承诺.

我认为所有文件都标记为删除,并且还从我当地的结帐中删除.

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

Bri*_*ell 452

git reset HEAD
Run Code Online (Sandbox Code Playgroud)

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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

git stash
git reset --hard HEAD
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 这个线程只是阻止了即将发生的心脏病发作. (176认同)
  • 请注意,`git reset --hard HEAD`会破坏您在当前工作目录的父目录中所做的任何有用的更改. (22认同)
  • @Mild:我还是穿着冷汗! (10认同)
  • 我没有投票,但我只是尝试藏匿,重置硬盘,弹出并丢失了我最近的所有更改.也许我误解了答案. (6认同)
  • 当我做git stash pop时,它只是再次删除了文件,当然因为它隐藏了我(意外)删除了一些文件的事实.如果您要保留未经修改的更改,则此答案不起作用. (3认同)
  • 这对我来说很少有用,而且我很高兴我在 Dropbox 文件夹中工作。形式很糟糕,但每次都救了我...... (2认同)

Jai*_*yer 242

我git-rm了几个文件,并在我下次提交之前继续进行更改,当时我意识到我需要一些这些文件.您可以根据需要简单地检查错过/删除的单个文件,而不是藏匿和重置:

git checkout HEAD path/to/file path/to/another_file
Run Code Online (Sandbox Code Playgroud)

这使您的其他未提交的更改保持不变,无需解决方法.

  • 这有帮助,因为我有其他未提交的更改. (6认同)
  • 这个答案有助于我们这些偶然发现这个问题的人想要恢复单个`git rm`而不是整个递归的`git rm -r`.对于完全递归删除,其他解决方案可能更好,具体取决于删除的文件数量. (4认同)

Arn*_* L. 54

要重新获得某些单个文件或文件夹,可以使用以下内容

git reset -- path/to/file
git checkout -- path/to/file
Run Code Online (Sandbox Code Playgroud)

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

提示:可以将提交哈希传递给两个命令,以便从较旧的提交中重新创建文件.查看git reset --helpgit checkout --help了解详情.


Ale*_*own 27

更新:

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

git reset HEAD . # This undoes the index changes
git checkout .   # This checks out files in this and child directories from the HEAD
Run Code Online (Sandbox Code Playgroud)

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


旧答案不是:

reset HEAD
Run Code Online (Sandbox Code Playgroud)

将完成这一操作,并且不会删除您对文件所做的任何未提交的更改.

之后你需要重复git add你排队的任何命令.


Ski*_*ake 24

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

git prune -n
git cat-file -p <blob #>
Run Code Online (Sandbox Code Playgroud)


son*_* xu 11

撤消git rm

git rm file             # delete file & update index
git checkout HEAD file  # restore file & index from HEAD
Run Code Online (Sandbox Code Playgroud)

undo git rm -r

git rm -r dir          # delete tracked files in dir & update index
git checkout HEAD dir  # restore file & index from HEAD
Run Code Online (Sandbox Code Playgroud)

undo git rm -rf

git rm -r dir          # delete tracked files & delete uncommitted changes
not possible           # `uncommitted changes` can not be restored.
Run Code Online (Sandbox Code Playgroud)

Uncommitted changes包括not staged changes,staged changes but not committed.


Cor*_*son 10

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

// Replace 2 with the # of commits back before the file was deleted.
git checkout HEAD~2 path/to/file
Run Code Online (Sandbox Code Playgroud)


meh*_*guh 7

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

git checkout <branch>@{"20 minutes ago"} <filename>
Run Code Online (Sandbox Code Playgroud)