Git reflog 能帮我找回被 reset 掉的提交吗?
我昨天不小心在主分支上执行了 git reset --hard HEAD~2,结果把最近两次提交全删了。现在项目代码回退到了两天前的状态,但那两次提交里其实有很重要的功能改动。
听说 Git 的 reflog 可以找回“丢失”的提交,但我试了 git reflog 看到一堆哈希值,不太确定哪个是我需要的。我尝试用其中一个 commit ID 做了 git checkout,虽然能看代码,但不知道怎么把它重新应用到当前分支上。
有没有人能告诉我具体该怎么操作?比如找到正确的提交后,是用 git cherry-pick 还是直接 git reset 回去?
先用
git reflog仔细看,输出格式大概是这样的:abc1234 HEAD@{0}: reset: moving to HEAD~2def5678 HEAD@{1}: commit: 提交了你的重要功能
ghi9012 HEAD@{2}: commit: 再上一次提交
...
你看到
HEAD@{1}对应的就是被删掉的那次提交。数字越小越新,你找那个commit:开头的行就行。找到正确的 commit hash 之后,恢复有两种方式,看你需求:
如果就想把整个分支状态恢复到那个提交点(把你之前 reset 掉的那两次提交都拿回来),直接:
git reset --hard def5678这样 HEAD 就指回去了,你之前的工作区也回来了。
如果你只想把其中某一次提交拿回来(比如那两次里只要一次),用 cherry-pick:
git cherry-pick def5678这样就把那个 commit 重新应用到当前分支上,形成一个新的 commit。
一般情况直接 reset 回去最省事,cherry-pick 适合只想恢复部分提交的情况。
另外提醒一下,reflog 默认保留 90 天(默认配置),所以你昨天弄的完全来得及找回来。赶紧动手吧。
首先执行
git reflog找到那条 reset之前的记录,格式大概是这样的:你需要找的是 reset 之前那个 HEAD@{1},对应的 commit ID 是 def5678。确认一下是不是你丢的那两次提交,用
git show def5678或者git log def5678 -1看一下提交信息。确认无误后恢复就两种方式:
第一种是直接 reset 回去,把 HEAD 重新指向那个提交:
这样你的分支就完全回到那个提交的状态了,包括提交历史。这是标准做法,如果你确定那两次提交就是全部要恢复的内容,用这个最省事。
第二种是 cherry-pick,如果你想保留当前分支的历史,只是把这两个提交重新搬过来:
注意顺序,先 pick 第一次提交,再 pick 第二次提交,或者一次性写两个 commit ID。
建议你先在本地分支测试,确认没问题再推送到远程。如果已经push到远程了,push 的时候可能需要 force push。