基于本文回答
0
评论

执行了 git reset --hard 后后悔了,如何找回丢失的 commit?

知识点图片

别慌!在 Git 中,只要你曾经成功执行过 git commit,代码就几乎不可能真正丢失。Git 会在后台保留这些“孤儿” commit 一段时间。

以下是找回丢失 commit 的标准步骤,按推荐程度排序:

方法一:使用 git reflog(最常用、最简单)

git reflog 记录了你本地仓库 HEAD 指针的每一次移动(包括 commit、reset、rebase 等)。

第一步:查看操作记录
在终端运行:

bash
git reflog

你会看到类似下面的输出:

plaintext
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 创建一个新分支
    这样你可以先检查代码,确认无误后再合并。

    bash
    git branch recover-branch c9d2b1f

    然后切换过去:git checkout recover-branch

  • 选择 B(直接恢复):将当前分支再次强制重置回那个 commit
    如果你确信这就是你要的代码:

    bash
    git reset --hard c9d2b1f

    (或者 git reset --hard HEAD@{1})


方法二:使用 git fsck(如果 reflog 找不到)

如果你清理过 reflog,或者有些特殊情况导致 reflog 里没有,可以使用 git fsck 寻找“悬空(dangling)”的 commit。

第一步:查找悬空 commit

bash
git fsck --lost-found

这会输出一堆类似这样的内容:

plaintext
dangling commit 9b8c7d6e5f4...
dangling blob 1a2b3c4d5e6...

第二步:逐个查看 commit 的内容
复制 dangling commit 后面的 hash 值,用 git show 来看看是不是你丢失的那个:

bash
git show 9b8c7d6e5f4

第三步:恢复
找到正确的 hash 后,像方法一那样,新建分支或者直接 reset:

bash
git branch recover-branch 9b8c7d6e5f4

⚠️ 重要的坏消息(关于未提交的代码)

git reset --hard 的威力在于它不仅移动指针,还会清空工作区暂存区

  • 如果你丢失的是已经 commit 过的代码,上面的方法 100% 能找回来。
  • 但如果你在 reset 之前,有没有 commit 也没有 stash 的代码,这些代码 Git 是没有记录的,无法通过 Git 找回

【终极救命稻草】:
如果你确实丢失了未 commit 的代码,请立刻打开你的编辑器(如 VS CodeWebStorm/IDEA):

  • VS Code: 在文件列表中右键那个文件,选择 "Timeline" (时间线)"Local History" (本地历史)
  • JetBrains (IDEA/WebStorm): 右键项目或文件 -> Local History -> Show History
    现在的智能 IDE 都有自己的本地文件缓存机制,通常能帮你找回未提交就被强制覆盖的代码!
右滑查看面试常问