我在错误的窗口跑了 git reset --hard
来源:dev.to — 2026-09-03
📋 概述
作者在错误的仓库窗口、傍晚 6:40 敲下 git reset --hard HEAD~3,三份尚未提交的相邻工作在一秒内从工作区消失。他首先给出最重要的安慰:它很可能还在——reset 只是移动分支指针并重置工作区,被孤立的 commit 对象会留在对象数据库里,直到 GC 清理(多数仓库里「最终」可能意味着数周)。git reflog 记录着 HEAD 最近指向过的每个位置,reset 不过是其中的一条新记录。真正无法挽回的是从未 commit 的改动——reflog 只追踪指针不追踪文件内容,唯一的防线是频繁提交含临时 wip commit。
🔑 核心要点
- git reset --hard 移动分支指针并重置工作树,但不会删除不再被引用的 commit 对象——它们躺在对象库里直到 GC,多数仓库中可能要数周才被清理
- git reflog 是 HEAD 最近指向位置的本地日志,它能在 reset 中存活,因为 reset 只是新增一条记录而非抹掉之前的记录;git reset --hard <旧hash> 即可瞬间还原
- 若 reset 作用于从未 commit 的改动,reflog 救不了你——它只跟踪 HEAD 与分支指向,不跟踪从未提交的文件内容;唯一防线是早提交勤提交
- reflog 条目过期后,git fsck --unreachable --no-reflog | grep commit 仍可能直接找到悬空 commit 对象,git show <hash> 核验后再决定
- 对任何真正破坏性且不熟悉的 Git 操作(跨长历史的 rebase、filter-branch、含 hard 或 force 的指令),先在一次性 clone 上演练确认行为,再对真实仓库执行
💡 金句
在压力下依赖记住 reflog 存在,不如养成先演练的习惯——把破坏性操作放到弄不坏任何东西的地方去试。
👍 0
👎 0
← 返回 dev.to 首页