2012-08-10 34 views

回答

0

讓我們進入,並設法解決它。只有當git reflog也不起作用時才使用這種方法,因爲很顯然,您的索引已損壞,並且reflog無法從已損壞的索引中讀取。

打開.git/文件夾

看看所謂HEAD文件。
這有你的git當前所在分支的名稱。

現在尋找一個名爲ORIG_HEAD文件。
這個probably擁有git能夠註冊的最後一次良好提交的SHA。如果是的話,瞧!

複製它(比如X),在終端做:
git show X > interim.patch

這會複製上次成功轉變爲一個標準的差異。

而且這個SHA(X)複製到HEAD文件的內容。
這告訴git將此更改視爲當前位置,它可以與之共存,因爲它已經記錄了一段時間。

現在如果你做一個git branch,你會搬到(no branch)

所以,現在你有你的變化。做git checkout -f <branch-name>
這將覆蓋您的更改與遠程內容,但你仍然有他們在該補丁。

所以現在,你是

  • 到一個Git分支
  • Git是恢復

做一個git apply interim.patch其中,如果通過順利的話,意味着你有你的變化。
然後繼續正常的git步驟。

  • git add .
  • git commit -am 'Message'

而且你又回到了正常的和平生活。

-1

克隆到另一個目錄的項目。有調查你是否有原始的所有裁判。

+0

這個想法是解決現有的損壞提交。所以它不會丟失 – Arindam 2012-08-11 06:15:33

+0

-1:如果這是一個大型項目呢?這顯然不是解決方案。 – 2013-08-29 20:00:30

1

使用@阿瑞丹姆的回答上面,我沒有工作,但它的變化做了,我希望別人發現它有用:

此時你在GIT無人過問是。您無法檢出具有當前分支狀態的新分支,可能是因爲reflog已損壞。

繼續之前:

  • 備份您的項目文件別的地方
  • 記下從git的/日誌/ HEAD立即在此之前,GIT說,它無法找到一個最後成功SHA1對象(按照上述@Arindam)

在我的情況,我知道大致的時候誰是變化的文件,我已經「丟失」上次編輯 - 大約2小時前 - 所以運行以下取我的所有項目被edtited我最後的成功之間的文件提交和現在:

$> cd my/project/dir 
$> find . -type f -mmin -240 -exec grep -l "$1" {} \; | xargs ls -l 
  • 記下輸出find命令到一個文本文件作爲地方你會在哪兒的支持這些,你需要知道的他們來自哪些目錄以知道將它們「複製」到哪裏。

將這些文件複製在其他地方手動(例如到/ tmp目錄/備份)或通過擴展命令來手動完成(我有大約一打,所以通過手沒有這樣一個苦差事)

  • 編輯的.git/HEAD,並與SHA其內容替換爲您記下上面
  • 編輯的.git/ORIG_HEAD,做同樣的

    $> git的分支

GIT應該告訴你 「(無分支)」

$> git log 

GIT應該給你你上面

提到的SHA1日誌消息

現在創建一個新的分支:

$> git checkout -b my_new_branch 

現在將所有文件從/ tmp/backup複製到正確的位置並運行:

$> git commit -a -m "Some commit" 

你完成了。您現在應該位於名爲「my_new_branch」的新分支中,所有文件都在最後一次成功提交和現在提交併且安全的 之間修改。

現在把這個東西打成一團,然後把它放回原處!