执行了 git reset --hard 后后悔了,如何找回丢失的 commit?
别慌!在 Git 中,只要你曾经成功执行过 git commit,代码就几乎不可能真正丢失。Git 会在后台保留这些“孤儿” commit 一段时间。
以下是找回丢失 commit 的标准步骤,按推荐程度排序:
方法一:使用 git reflog(最常用、最简单)
git reflog 记录了你本地仓库 HEAD 指针的每一次移动(包括 commit、reset、rebase 等)。
第一步:查看操作记录
在终端运行:
git reflog
你会看到类似下面的输出:
8a3f2e1 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2 <-- 这是你后悔的那个操作
c9d2b1f HEAD@{1}: commit: 修复了登录页面的bug <-- 这是你丢失的最新的 commit
e4f5g6h HEAD@{2}: commit: 添加了用户模块
第二步:找到丢失的 commit hash
在日志中找到你执行 reset 之前的那个状态。在上面的例子中,就是 c9d2b1f(或者用 HEAD@{1} 表示)。
第三步:恢复到那个 commit
你有两种选择来恢复:
选择 A(最安全,推荐):为丢失的 commit 创建一个新分支
这样你可以先检查代码,确认无误后再合并。bashgit branch recover-branch c9d2b1f然后切换过去:
git checkout recover-branch。选择 B(直接恢复):将当前分支再次强制重置回那个 commit
如果你确信这就是你要的代码:bashgit reset --hard c9d2b1f(或者
git reset --hard HEAD@{1})
方法二:使用 git fsck(如果 reflog 找不到)
如果你清理过 reflog,或者有些特殊情况导致 reflog 里没有,可以使用 git fsck 寻找“悬空(dangling)”的 commit。
第一步:查找悬空 commit
git fsck --lost-found
这会输出一堆类似这样的内容:
dangling commit 9b8c7d6e5f4...
dangling blob 1a2b3c4d5e6...
第二步:逐个查看 commit 的内容
复制 dangling commit 后面的 hash 值,用 git show 来看看是不是你丢失的那个:
git show 9b8c7d6e5f4
第三步:恢复
找到正确的 hash 后,像方法一那样,新建分支或者直接 reset:
git branch recover-branch 9b8c7d6e5f4
⚠️ 重要的坏消息(关于未提交的代码)
git reset --hard 的威力在于它不仅移动指针,还会清空工作区和暂存区。
- 如果你丢失的是已经 commit 过的代码,上面的方法 100% 能找回来。
- 但如果你在 reset 之前,有没有 commit 也没有 stash 的代码,这些代码 Git 是没有记录的,无法通过 Git 找回。
【终极救命稻草】:
如果你确实丢失了未 commit 的代码,请立刻打开你的编辑器(如 VS Code 或 WebStorm/IDEA):
- VS Code: 在文件列表中右键那个文件,选择 "Timeline" (时间线) 或 "Local History" (本地历史)。
- JetBrains (IDEA/WebStorm): 右键项目或文件 -> Local History -> Show History。
现在的智能 IDE 都有自己的本地文件缓存机制,通常能帮你找回未提交就被强制覆盖的代码!