2012-02-28 111 views
54

我做了一件非常愚蠢的事情。 我使用git commit(文件編輯+新文件)(C)進行了提交。 然後我做了修改最後一次提交。 然後我用git rm -r 然後我又git的承諾(C)刪除所有文件遞歸(!)。撤消在GIT中刪除

 
A-B-C 
    ↑ 
    master 

是否有任何方法可以取消刪除文件,但保留我在第一次提交時所做的更改? (C) 我寧願不回(B)。 我試過git reset --soft head ^,所以然後git status列出了我刪除的文件,然後我做了git checkout,但仍然沒有運氣。我甚至不知道是否有可能。

+0

所以你想要你的文件提交A回來? – uday 2012-02-28 07:01:17

+1

不,我想仍然在C但沒有刪除文件,只有我的文件編輯和文件添加。我現在沒有工作樹中的文件,它們被刪除。 – Nately 2012-02-28 07:05:54

回答

158

請你幫個忙,並像其他的答案表明,進入更多的問題不做git checkout <hash>

如果你已經從你的工作目錄中刪除文件,而不是提交更改的是,這樣做:

git checkout -f 

注意:在執行此命令之前提交未提交的文件,否則你會失去他們所有

被刪除的文件應該再回來。

如果不是,並且如果您可以從git reflog找到您想要的提交(C等,您的問題不清楚),只需執行git reset --hard <hash from reflog>,您應該全部設置。

+3

+1你可以添加一個鏈接到一個分離的頭的問題(如http://stackoverflow.com/questions/3965676/why-did-git-detach-my-head/3965714#3965714),來說明與問題git結帳SHA1答案。 ORIG_HEAD在這種情況下會有幫助嗎? (http://stackoverflow.com/questions/964876/head-and-orig-head-in-git/964927#964927) – VonC 2012-02-28 07:44:22

+1

好吧,所以這個答案其實更好。重置 - 難離開我在我的主分支,我沒有離開'獨立HEAD'狀態。 Sasha的回答在檢索我丟失的數據的情況下也很好。 – Nately 2012-02-28 08:01:01

+2

謝謝你剛纔保存我的屁股。 – Seth 2012-09-20 15:04:30

5

如果我理解正確的你,你重寫犯C.所以原來的承諾,讓我們把它叫做C1是不是從你的提交圖表訪問,但它仍然是存在的(GIT保留所有提交了一段時間)。使用git reflog來獲取提交散列,並使用git checkout <hash>或其他適當的命令轉到舊狀態C1。

+0

我的天啊!謝謝你太多了!承諾在那裏。你救了我三週的工作(自上次提交以來))。謝謝! – Nately 2012-02-28 07:16:34

+0

還有一個問題。現在它說我處於「分離頭部」狀態。我如何回到我的'主'分支? – Nately 2012-02-28 07:25:59

+0

不客氣。但是,我不明白倒票。 git reset --hard 可能會更危險。目前還不清楚海報是否修改了原來的提交C,並保留了他想要修改的內容。 – Sascha 2012-02-28 08:09:26