文章目录
- [1. 简介](#1. 简介)
- [2. 格式](#2. 格式)
- [3. 选项](#3. 选项)
-
- [3.1 显示控制](#3.1 显示控制)
- [3.2 时间限制](#3.2 时间限制)
- [3.3 其他](#3.3 其他)
- [4. 示例](#4. 示例)
-
- [4.1 基础用法](#4.1 基础用法)
- [4.2 恢复丢失的提交](#4.2 恢复丢失的提交)
- [4.3 按时间筛选](#4.3 按时间筛选)
- [4.4 查看相对时间](#4.4 查看相对时间)
- [5. 注意](#5. 注意)
-
- [5.1 子命令](#5.1 子命令)
- [5.2 `git reflog` vs `git log` 对比](#5.2
git reflogvsgit log对比) - [5.3 引用表达式格式](#5.3 引用表达式格式)
- [5.4 reflog 条目何时删除?](#5.4 reflog 条目何时删除?)
- [5.5 常用别名设置](#5.5 常用别名设置)
- [6. 小结](#6. 小结)
- 参考文献
1. 简介
git reflog 用于查看本地仓库的引用日志。
它记录了 HEAD 和分支引用在本地仓库中的每一次移动(如提交、切换分支、合并、重置等)。
核心价值:
- 找回因
git reset、git rebase、git commit --amend等操作"丢失"的提交 - 查看本地仓库的操作历史
- 恢复误删的分支
与 git log 的区别:
git log:显示提交历史(可被同步)git reflog:显示本地引用移动的历史(仅本地,不同步)git log只能查看从某个引用(默认 HEAD)出发"能追溯到"的提交历史(即按父子关系向前追溯)。git reflog可以查看引用(如 HEAD、分支)的"移动历史",包括那些不再被任何分支引用(即从 git log 中"消失")的提交。
2. 格式
bash
git reflog [show] [<log-options>] [<ref>]
git reflog list
git reflog exists <ref>
git reflog write <ref> <old-oid> <new-oid> <message>
git reflog delete [--rewrite] [--updateref]
[--dry-run | -n] [--verbose] <ref>@{<specifier>}...
git reflog drop [--all [--single-worktree] | <refs>...]
git reflog expire [--expire=<time>] [--expire-unreachable=<time>]
[--rewrite] [--updateref] [--stale-fix]
[--dry-run | -n] [--verbose] [--all [--single-worktree] | <refs>...]
<ref> 可以是分支名、HEAD 等引用,缺省为 HEAD。
3. 选项
3.1 显示控制
bash
--all
显示所有引用的 reflog(包括 HEAD、分支、远程跟踪分支等)
--remotes
只显示远程跟踪分支的 reflog
--no-abbrev
显示完整的提交哈希(不缩写)
--oneline
一行显示,格式为 `<ref>@{<n>}: <action>`
3.2 时间限制
bash
--since=<date>, --after=<date>
只显示指定日期之后的条目
--until=<date>, --before=<date>
只显示指定日期之前的条目
3.3 其他
bash
--date=<format>
指定日期显示格式(如 `relative`, `iso`, `short`)
-v, --verbose
显示额外的信息
4. 示例
4.1 基础用法
bash
# 查看 HEAD 的 reflog(最常用)
git reflog
# 一行显示(简洁模式)
git reflog --oneline
# 查看指定分支的 reflog
git reflog main
# 查看所有引用的 reflog
git reflog --all
输出示例:
a1b2c3d HEAD@{0}: commit: 修复登录验证
e5f6g7h HEAD@{1}: rebase -i (finish): 变基完成
i9j0k1l HEAD@{2}: rebase -i (start): 变基开始
m3n4o5p HEAD@{3}: reset: moving to HEAD~2
q6r7s8t HEAD@{4}: commit: 添加用户注册功能
4.2 恢复丢失的提交
bash
# 1. 查看 reflog,找到想要恢复的提交
git reflog
# a1b2c3d HEAD@{2}: commit: 重要的功能
# 2. 基于该提交创建新分支
git branch recover-branch a1b2c3d
# 或者重置当前分支到该提交
git reset --hard a1b2c3d
4.3 按时间筛选
bash
# 只显示最近 2 天的 reflog
git reflog --since="2 days ago"
# 显示指定日期范围内的 reflog
git reflog --after="2024-01-01" --before="2024-03-01"
4.4 查看相对时间
bash
# 使用相对时间格式
git reflog --date=relative
输出示例:
a1b2c3d HEAD@{2 minutes ago}: commit: 修复登录验证
e5f6g7h HEAD@{1 hour ago}: checkout: moving from main to feature
5. 注意
5.1 子命令
git reflog 实际上是由多个不同子命令组成的,用于精细化管理引用日志。
| 子命令 | 核心作用 | 适用场景 | 是否常用 |
|---|---|---|---|
show (默认) |
查看日志:显示指定引用的操作历史 | 查看操作历史、找回误操作丢失的提交 | ✅ 非常常用 |
list |
列出引用:列出所有拥有 reflog 的引用 | 快速知道仓库里哪些引用保留着操作记录 | ❌ 较少用 |
exists |
检查存在性:检查某个引用是否有 reflog | 在脚本中判断某个分支是否开启了 reflog | ❌ 较少用 |
expire |
清理过期条目:删除 reflog 中过期的旧条目 | 手动清理老条目释放空间(通常由 git gc 自动触发) |
❌ 极少直接用 |
delete |
删除单条记录:从 reflog 中删除指定的一个条目 | 确定某条操作记录是错误时彻底删除 | ❌ 极少用 |
drop |
删除整个日志:彻底移除一个引用的整个 reflog | 不再需要某个分支的整个操作历史时清空 | ❌ 极少用 |
write |
写入新记录:手动向 reflog 中添加一条记录 | 开发底层 Git 工具或编写复杂脚本时手动记录 | ❌ 极少用 |
5.2 git reflog vs git log 对比
| 对比维度 | git reflog |
git log |
|---|---|---|
| 记录内容 | 本地引用的移动历史 | 提交历史 |
| 是否可同步 | ❌ 仅本地 | ✅ 可推送到远程 |
| 是否显示丢失的提交 | ✅ 是(只要未被 gc) | ❌ 否 |
| 典型用途 | 恢复误操作 | 查看项目历史 |
5.3 引用表达式格式
bash
# 基本格式
<ref>@{<n>}
# 示例
HEAD@{0} # HEAD 当前指向的位置
HEAD@{1} # HEAD 上一次指向的位置
main@{2} # main 分支前两次的位置
HEAD@{2.weeks.ago} # 两周前 HEAD 的位置
5.4 reflog 条目何时删除?
git reflog expire:手动清理过期条目git gc --prune:垃圾回收时会清理过期的 reflog 条目- 默认过期时间:90 天(不可达条目)/ 30 天(可达条目)
5.5 常用别名设置
bash
git config --global alias.rl "reflog"
git config --global alias.rloneline "reflog --oneline"
# 使用别名
git rl
git rloneline
6. 小结
| 需求 | 命令 | 说明 |
|---|---|---|
| 查看 HEAD 的 reflog | git reflog |
最常用 |
| 简洁模式查看 | git reflog --oneline |
一行一个条目 |
| 查看指定分支的 reflog | git reflog main |
查看 main 分支的引用历史 |
| 按时间筛选 | git reflog --since="2 days ago" |
只显示最近 2 天的条目 |
| 恢复丢失的提交 | git reflog → git reset --hard <commit> |
找到丢失的提交哈希 |
| 查看所有引用 | git reflog --all |
包括 HEAD、分支、远程跟踪分支 |
一句话总结 :git reflog 是 Git 的"后悔药",记录了你本地仓库的所有引用移动。当你误操作(如 git reset --hard)丢失提交时,它是找回代码的最可靠工具。** **