git reflog

文章目录

  • [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 reflog vs git log 对比)
    • [5.3 引用表达式格式](#5.3 引用表达式格式)
    • [5.4 reflog 条目何时删除?](#5.4 reflog 条目何时删除?)
    • [5.5 常用别名设置](#5.5 常用别名设置)
  • [6. 小结](#6. 小结)
  • 参考文献

1. 简介

git reflog 用于查看本地仓库的引用日志

它记录了 HEAD 和分支引用在本地仓库中的每一次移动(如提交、切换分支、合并、重置等)。

核心价值:

  • 找回因 git resetgit rebasegit 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 refloggit reset --hard <commit> 找到丢失的提交哈希
查看所有引用 git reflog --all 包括 HEAD、分支、远程跟踪分支

一句话总结git reflog 是 Git 的"后悔药",记录了你本地仓库的所有引用移动。当你误操作(如 git reset --hard)丢失提交时,它是找回代码的最可靠工具。** **


参考文献

Git - git-reflog Documentation

相关推荐
MatrixOrigin2 小时前
MatrixOne Git4Data 技术详解(二):从零跑通所有 Git 原语
git
anew___3 小时前
常用的 Git 工作流
git
shimly1234563 小时前
git diff 生成一部分文件的补丁
git
m0_579146654 小时前
Git 重置模式详解:四种重置方式的原理与应用场景
git
恋喵大鲤鱼4 小时前
git grep
git·git grep
霸王龙的小胳膊4 小时前
Git基础知识
git
恋喵大鲤鱼5 小时前
git fetch
git·git fetch
Java知识技术分享5 小时前
安装sourcetree
java·git·源代码管理
恋喵大鲤鱼6 小时前
git revert
git·git revert