2010-02-27 105 views
12

我失去了最後一次提交,因爲我意外地運行了「git reset --hard HEAD ^」。注意:我不想在最後加上「^」。失去最後的Git提交

有什麼辦法讓它恢復嗎?這是工作:(

+2

在任何情況下,請勿使用git gc。這將永久刪除未鏈接的提交。 – Tronic 2010-02-27 17:41:12

+0

不,gc會*不會*失去那個提交,除非你讓自己的方式更容易讓git忘記你的提交(禁用或積極修剪)。任何花費足夠的時間學習如何配置git失去最近的提交的人至少會知道不會問這個問題。 – Dustin 2010-02-27 19:27:30

+5

默認情況下'git gc'不會在未引用提交的情況下(默認情況下)拒絕未提交鏈接的提交,時間長達30天。 – 2010-02-28 14:56:31

回答

25

我認爲this article是你在找什麼根據這篇文章,你的承諾是「水漲船高」,而不是垃圾回收 - 有點像在Windows回收站

您運行git fsck --lost-found。找到'dlingling commit',並用git reflog來查看它,然後將懸掛提交與當前分支git merge 7c61179合併。

+0

謝謝。那樣做了。我知道它只是在某處浮動,與分支無關。 – 2010-02-27 17:45:47

+0

結合difftool,我已經解決了我的「丟失的提交」問題: git fsck --lost-found(顯示懸掛提交哈希) git difftool SOME_HASH somefolder /(我試過所有懸掛的提交,直到我已經找到了需要的) – 2013-05-22 13:47:00

6

2天如果你知道該提交ID(如向後滾動你的終端上,或者使用git reflog),

git reset --hard 61567de5d9 

凡61567de5d9是最新的第一個數字(丟失)提交。

21

git使得它很容易回到之前的狀態,並且非常努力地防止你丟失任何你已經犯下的數據。這就是你應該經常做的原因。我有一個命令git trash那是否git reset --hard狀態,但在寫一個提交後,如果我需要,我可以撤消硬重置。

對於最近的狀態(即您的確切情況),只需執行git reset --hard ORIG_HEAD即可撤銷您剛纔的操作。

你可以做一個基於時間的復位git reset --hard '@{5 minutes ago}'把自己放在基於時間在先狀態(有很多的選擇,你可以使用,例如,git reset --hard '@{yesterday}'假裝今天從未發生過)。

否則,瀏覽git reflog輸出找到在你感覺你把你置於壞的狀態之前的事情並且重新設定。

+1

更一般的,你可以使用'@ {1}'或'HEAD @ {1}'而不是'ORIG_HEAD'。 – 2010-02-28 14:55:14