2010-01-24 98 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