2012-06-19 146 views
22

我正試圖使用​​Git Tower將更改導入我的存儲庫。當我這樣做的時候,發生了衝突,我錯誤地把所有的事情都打到了舞臺上(正如我在解決衝突後想要做的那樣)。當我這樣做時,衝突標誌着自己解決了。在Git中,如何恢復提交之前恢復的分級文件?

我想手動解決變化,所以我點擊「中止合併」,但是,當我這樣做時,它回滾了我的所有更改!有什麼辦法讓他們回來?

回答

44

如果你有任何東西上演混帳,你可能應該能夠得到它。 (如果你只是改變了工作副本,你將無法恢復它。)

首先:做運行git gc。在繼續之前備份您的存儲庫和工作副本。 (請務必備份.git目錄。)還要避免在發生這種情況時關閉終端,和/或重新啓動 - 如果全部失敗,您有機會在歷史/記憶中查找內容。

無論如何,嘗試第一件事是:

 
git fsck --lost-found 

它會打印出類似這樣

 
Checking object directories: 100% (256/256), done. 
Checking objects: 100% (30165/30165), done. 
dangling blob 8f72c7d79f964b8279da93ca8c05bd685e892756 
dangling commit 4993502a6394491190d3f4d6fb3d1e14019c2e9b 

因爲你失去了籌備的文件並沒有做一個承諾,你有興趣dangling blob項。

爲每一個運行git show <sha> - 其中一些應該是你的文件。

+4

謝謝!我放棄了希望Git保留了任何未提交的文件。 我想給那些在失物招領中有很多垃圾的人添加小費。我爲一個人擁有100個條目,所以要找到這個哈希,只要你能記住你寫的文件的一部分,你也可以在你的git目錄中使用find-in-file type命令。我用 找到。 | xargs grep'PIECE_OF_MISSING_CODE'-sl | grep'lost-found' – David

+0

git show 顯示廢話,我的意思是有一些可識別的字符串,但其餘的是廢話。是否意味着以某種方式解碼,或者它是什麼(不可用)。 – jayarjo

+1

謝謝。你剛剛救了我的一天。 – fuz

4

用更簡單的選擇擴展Alexander的答案:是的,如果您已經進行了更改,那麼您可能會重新獲得文件。運行git add時,文件實際上被添加到Git的對象數據庫中。在你做的那一刻,git會就把文件索引:

% git add bar.txt 
% git ls-files --stage 
100644 ce013625030ba8dba906f756967f9e9ca394464a 0 bar.txt 
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0 foo.txt 

注意,對於跳回到bar.txt的條目包含的文件的對象ID。 Git實際上已經將文件添加到其對象數據庫中。在這種情況下,Git有它添加到存儲庫作爲鬆散的對象:

% ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 
4 -r--r--r-- 1 ethomson staff 21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a 

這些文件將最終被垃圾收集(確實如此,並沒有明確運行git gc)。幸好,默認情況下,這將發生在個月,而不是幾天。在這些文件被垃圾收集之前,您可以恢復它們。

要做到這一點,最簡單的辦法就是download and install the git-recover program在交互模式:

% git recover -i 
Recoverable orphaned git blobs: 

61c2562a7b851b69596f0bcad1d8f54c400be977 (Thu 15 Jun 2017 12:20:22 CEST) 
> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
> tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 
> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
> commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 

Recover this file? [y,n,v,f,q,?]: 

git-recover會在對象數據庫是文件提交(或指數)。您可以在the blog post announcing it找到更多關於git-recover的信息。

+2

祝福你!你救了我的培根,哈哈 –