2010-02-27 106 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