如何恢复“git rm -r。”?

时间:2010-01-24 02:47:31

标签: git git-rm

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

我没有承诺。

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

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

13 个答案:

答案 0 :(得分:431)

git reset HEAD

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

git reset --hard HEAD

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

git stash
git reset --hard HEAD
git stash pop

答案 1 :(得分:230)

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

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

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

答案 2 :(得分:46)

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

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

这将首先重新创建path/to/file的索引条目,并重新创建上次提交时的文件,即HEAD

提示:可以将提交哈希传递给两个命令,以便从旧提交中重新创建文件。有关详细信息,请参阅git reset --helpgit checkout --help

答案 3 :(得分: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

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


旧答案不是:

reset HEAD

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

之后,您需要重复排队的所有git add命令。

答案 4 :(得分:24)

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

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

答案 5 :(得分:9)

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

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

答案 6 :(得分:7)

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

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

答案 7 :(得分:7)

撤消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

答案 8 :(得分:3)

获取列表提交

git log  --oneline

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

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

答案 9 :(得分:1)

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

git checkout -- .

答案 10 :(得分:0)

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

也就是说:

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

或其缩写形式:

git restore -s@ -SW -- .

答案 11 :(得分:0)

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

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

答案 12 :(得分:-1)

我有完全相同的问题:清理我的文件夹,重新安排和移动文件。我输入了:git rm 并点击回车;然后觉得我的肠松弛了一点。幸运的是,我没有输入git commit -m&#34;&#34;马上。

但是,以下命令

git checkout .

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