2010-01-24 125 views
284

我认命说git rm -r .。我该如何恢复?如何恢复“git rm -r。”?

我没有提交。

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

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

+2

对于这个特定的问题,重置--hard是一个很好的解决方案...它已经列出,所以我只是在这个评论中提到你可能想要检查git-reflog的文档。 – 2010-01-24 05:42:51

+7

请注意,因为您没有为'git rm'提供'-f',所以git不会删除任何已经执行或未执行更改的文件,所以'git reset; git checkout .'应该可以恢复所有的东西。 – 2010-01-24 08:47:16

+0

只要小心 - git结帐。将消灭所有未分离的变化。 – PeterB 2011-10-11 15:30:27

回答

369
git reset HEAD 

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

git reset --hard HEAD 

应强制重置所有内容到您上次提交。如果您有未提交的更改,但第一个命令不起作用,然后用git stash保存您提交的修改:

git stash 
git reset --hard HEAD 
git stash pop 
+17

请注意,'git reset --hard HEAD'会破坏您在当前工作目录的父目录中所做的任何有用更改。 – 2010-02-05 14:41:50

+145

此主题只是防止即将发生的心脏病发作。 – 2011-04-07 11:47:32

+8

@Mild:我还是穿着冷汗! – hoipolloi 2011-08-04 21:00:23

24

更新:

由于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命令。

+0

'co'就是'checkout' – DanSkeel 2012-05-10 23:52:22

+1

对不起,我总是设置'git alias .co =“checkout”'这样'git co'确实签出。 – 2012-06-14 22:53:50

196

我混帐rm'd几个文件,去之前我下进行更改时提交我意识到我需要回来一些这些文件。而不是藏匿和复位,你可以,如果你想简单地签删除你错过了单独的文件/:

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

这将使你的其他未提交的修改完整,没有解决方法。

+3

这有帮助,因为我有其他未提交的更改。 – Dan 2014-08-25 04:50:25

+8

这是IMO的最佳答案。救了我。 – sudo 2015-07-02 18:48:32

+1

这个答案有助于我们这些偶然发现这个问题的人寻找恢复单个'git rm'而不是整个递归'git rm -r'。对于完整的递归删除,其他解决方案可能会更好,具体取决于删除的文件数量。 – tresf 2016-03-15 01:43:43

18

如果你最终没有上述工作的,你也许可以从这里获取使用建议数据:http://www.spinics.net/lists/git/msg62499.html

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

你已经救了我 – Bear 2014-12-22 11:04:48

+0

4年后,依然是救命恩人! – ThievingSix 2016-09-18 06:23:19

+0

诀窍! – 2017-02-22 13:54:02

38

要恢复一些单个文件或文件夹,一个可以使用以下

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

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

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

7

有一些很好的答案了,但我可能会建议一个很少使用的语法,不仅伟大工程,但非常明确的想要什么(为此不可怕或神秘)

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

我一个相同的情况。在我的情况的解决方案是:

git checkout -- . 
9

如果你致力于推的变化,你可以做到这一点得到回文件

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

这是唯一一个工作!谢谢 – smac89 2015-04-13 07:10:56

+2

我不......我连字都没有。先生,我会给你买一个KEG。 – motleydev 2015-04-14 09:40:45

+0

这适用于'要承诺的更改:'从旧git cherry-pick中删除了一个文件,我仍然需要这个文件。我曾尝试过git reset HEAD〜,这是行不通的。 – mushcraft 2016-06-06 15:48:25

-1

我一模一样的问题:被清理我的文件夹,重新安排和移动文件。我输入了:git rm 并按回车键;然后感觉到我的肠子松了一下。幸运的是,我没有直接输入git commit -m“”。

但是,下面的命令

git checkout . 

恢复一切,救了我的命。

3

获取列表提交

git log --oneline 

例如稳定的承诺具有散:45ff319c360cd7bd5442c0fbbe14202d20ccdf81

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

这对我有效,谢谢 – 2017-04-18 17:45:53

1

撤消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室射频

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

+0

当然,没有任何东西可以撤销'git rm -rf',因为这可能会删除未跟踪或已暂存(仅)的文件。 – jpaugh 2018-02-05 18:28:01

+0

'git rm -rf file'和'git rm -rf dir'不会删除任何未跟踪的文件。 – 2018-02-06 02:24:30