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 命令参数详解。