2013-03-18 24 views
5

我想清除一些未提交文件的工作目錄,但是意外地跑了git reset --hard重置後Git commit丟失--hard。沒有被fsck發現,不在reflog

我意識到,我已經失去了以前的(未推)提交,所以我跑git reset --hard ORIG_HEAD。這並沒有讓我失去我的承諾。

我跑git reflog,但承諾沒有列出。我也跑了git fsck --lost-found,但列表中沒有提交,只有幾個不相關的斑點和樹。

由於我找不到丟失的提交的任何參考(除了.git/COMMIT_EDITMSG,它仍然有相關的提交消息和更改列表),我不知道如何去恢復提交。

有沒有辦法讓丟失的提交回來,或者我應該準備好一個全能的?

+0

爲什麼你認爲你有一個git的承諾爲當地的變化? git reset不會丟失它。如果您只有未提交的更改,那些更改就會消失。 – fche 2013-03-18 15:15:13

+3

沒有commit-ish參數的'git reset --hard'就相當於'git reset --hard HEAD',它不會丟失提交,推送或者不被提交。它會簡單地將您的索引和工作目錄重置爲您所做的最後一次提交的狀態,從而失去暫存和非暫存(但尚未提交)更改。 'git reset --hard ORIG_HEAD'可能會成爲一個問題,具體取決於ORIG_HEAD實際更新的最後一個命令是什麼,以及它之前多長時間,以及您在之間做了什麼... – twalberg 2013-03-18 15:42:32

+0

謝謝,在'git reset --hard'之前大約半個小時就做出了失敗的承諾。 – 2013-03-18 15:56:15

回答

9

不知道爲什麼你無法找到你的提交,如@ twalberg的評論關於git reset --hard是正確的。不過,這裏有些事情要嘗試。

您有提交你正在尋找(.git/COMMIT_EDITMSG)的消息。如果編寫了COMMIT_EDITMSG,那麼該特定的提交應該是某處。挑選出來自是相當獨特的消息一些文字,試試這個:

git log -g --grep="<something specific from your commit message>"

這將通過引用日誌,找到從提交你丟失提交的信息相匹配的文本。

如果與沒有運氣,你可以嘗試通過所有提交的每個分支尋找:

git log --all --grep="<something specific from your commit message>"

一旦你找到了提交哈希值,你可以檢查出來,做一個新的分支,將其合併回到你當前分支等

但是,如果所有的失敗,您可以嘗試尋找儘管這是在資源庫中的對象,但都沒有任何承諾的一部分(例如,添加到索引,但尚未提交。 )這個答案可以幫助你:

https://stackoverflow.com/a/7376959/845716

+1

感謝羅布。在發佈問題之前,我已經搜索了git日誌,但最終鏈接[「撤消git reset --hard」](http://stackoverflow.com/a/7376959/845716)查看所有工作對象!不知道爲什麼我找不到提交。我可以找到各個文件。 – 2013-03-18 17:38:17