Git reflog 能帮我找回被 reset 掉的提交吗?

恩硕 Dev 阅读 11

我昨天不小心在主分支上执行了 git reset --hard HEAD~2,结果把最近两次提交全删了。现在项目代码回退到了两天前的状态,但那两次提交里其实有很重要的功能改动。

听说 Git 的 reflog 可以找回“丢失”的提交,但我试了 git reflog 看到一堆哈希值,不太确定哪个是我需要的。我尝试用其中一个 commit ID 做了 git checkout,虽然能看代码,但不知道怎么把它重新应用到当前分支上。

有没有人能告诉我具体该怎么操作?比如找到正确的提交后,是用 git cherry-pick 还是直接 git reset 回去?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
长孙利娜
能找到,reflog 就是干这个的。

先用 git reflog 仔细看,输出格式大概是这样的:

abc1234 HEAD@{0}: reset: moving to HEAD~2
def5678 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 天(默认配置),所以你昨天弄的完全来得及找回来。赶紧动手吧。
点赞
2026-03-13 08:11
UI艺涵
UI艺涵 Lv1
用reflog找回是完全可行的,你之前的思路没问题。

首先执行 git reflog 找到那条 reset之前的记录,格式大概是这样的:

abc1234 HEAD@{0}: reset: moving to HEAD~2
def5678 HEAD@{1}: commit: 第二次提交的信息
ghi9012 HEAD@{2}: commit: 第一次提交的信息


你需要找的是 reset 之前那个 HEAD@{1},对应的 commit ID 是 def5678。确认一下是不是你丢的那两次提交,用 git show def5678 或者 git log def5678 -1 看一下提交信息。

确认无误后恢复就两种方式:

第一种是直接 reset 回去,把 HEAD 重新指向那个提交:

git reset --hard def5678


这样你的分支就完全回到那个提交的状态了,包括提交历史。这是标准做法,如果你确定那两次提交就是全部要恢复的内容,用这个最省事。

第二种是 cherry-pick,如果你想保留当前分支的历史,只是把这两个提交重新搬过来:

git cherry-pick def5678 ghi9012


注意顺序,先 pick 第一次提交,再 pick 第二次提交,或者一次性写两个 commit ID。

建议你先在本地分支测试,确认没问题再推送到远程。如果已经push到远程了,push 的时候可能需要 force push。
点赞 2
2026-03-11 09:44