git reflog 记录 HEAD 和分支引用每一次移动——提交、切换、合并、reset、rebase 都留痕。它是 Git 里最重要的后悔药:git reset --hard 之后以为丢掉的提交,绝大多数能靠它找回来。

本文列出 git reflog 的常用参数与子命令,并给出一次完整的「误 reset 后恢复」流程。

ℹ️
关于本系列
本文是《Git 使用教程》按命令拆分的第 11 / 28 篇,全部收录在 Git 栏目。参数表列的是日常高频项,并非穷举;想看某个命令的完整参数,用 git reflog -h 看精简列表、git help reflog 看完整手册。示例以 Git 2.56.0 为准。

一、命令语法

先看语法骨架,再对照下一节的参数表。<占位> 表示必填值,实际输入时不要带尖括号;[...] 表示可选项,-- 用来分隔选项与路径。

bash语法
git reflog [show] [<options>] [<ref>]
git reflog expire / delete / exists <ref>

二、参数逐项详解

下表按用途列出 git reflog 的常用参数,每项都注明了「它到底改变了什么」。

参数 / 子命令作用
git reflog / git reflog show列出当前 HEAD 的移动记录,最新的在最上面
<ref>查看指定引用的记录,如 git reflog show main
--date=<格式>显示相对 / 绝对时间,iso、relative、local 等
--all显示所有引用的 reflog,不只当前 HEAD
-n <条数> / --max-count只看最近若干条,如 git reflog -10
--format=<格式>自定义输出字段,脚本里可用 %gd %gs
git reflog exists <ref>判断该引用是否有 reflog,常用于脚本条件判断
git reflog expire --expire=<时间> --all清理过期记录;默认 90 天,一般不需要手动执行
git reflog delete <ref>@{n}删除某条记录,极少使用,操作前务必确认
HEAD@{n} / <ref>@{n}引用第 n 步之前的 HEAD 状态,是恢复操作的关键写法
<ref>@{<时间>}按时间定位,如 main@{yesterday}、main@{2.hours.ago}

恢复操作的三种写法

写法含义
HEAD@{1}HEAD 上一次移动前的位置
HEAD~1当前提交的父提交(按提交拓扑,与 reflog 无关)
main@{yesterday}main 分支昨天此时的位置

三、常用示例

误 reset --hard 后的标准恢复流程

bash误 reset --hard 后的标准恢复流程
git reflog --date=iso -10
# a1b2c3d HEAD@{0}: reset: moving to HEAD~2
# f9e8d7c HEAD@{1}: commit: feat: 重要的改动   <-- 要找回的就是它

git show --stat f9e8d7c             # 先确认内容
git reset --hard f9e8d7c            # 或 git switch -c rescue f9e8d7c

更稳妥:先开分支再决定

bash更稳妥:先开分支再决定
git switch -c rescue f9e8d7c
git log --oneline -3
# 确认无误后再把这个分支合并回去,原分支完全不动

按时间回溯

bash按时间回溯
git reflog --date=local --all | head -20
git show "main@{yesterday}" --stat

四、注意事项

⚠️
reflog 有期限,也有边界
本地 reflog 默认保留 90 天(可达的更久),过期记录会被 git gc 清掉;未提交且未暂存的工作区改动从未进入对象库,reflog 找不回来,被 git clean 删掉的文件同理。另外 reflog 是本地记录,不会随 push 传到远端。
出事之后的第一条命令: 别再继续 commit、checkout、pull,先跑 git reflog --date=iso 把现场记下来,再决定用 reset --hard 还是开一个 rescue 分支。

五、小结

git reflog 平时几乎用不到,一旦用到就是救命。记住两点:它是本地的、有期限的;恢复时优先用 git switch -c rescue <哈希> 开新分支,比直接 reset --hard 更不容易二次误伤。

本系列共 28 篇,一个命令一篇,完整目录见 Git 栏目。下一篇:git restore 命令参数详解。