reflog expire 是什么
reflog 记录每个引用的移动历史,是误提交、误 reset、误 rebase 后的恢复通道:只要记录在,被丢开的提交就被视为受保护、不会被回收。git reflog expire 把过期记录清掉,再配合 git gc --prune 才能让旧对象真正消失。它常出现在历史重写(filter-branch、filter-repo)收尾:确认现场不再需要回退后,才执行过期与回收。
基本信息
| 过期命令 | git reflog expire --expire=now --all |
|---|---|
| 回收命令 | git gc --prune=now |
| 默认窗口 | 条目默认保留 90 天,不可达条目更短(约 30 天) |
| 恢复依据 | git reflog 找到旧位置后用 reset 或 hash 回退 |
| 作用范围 | 仅本地仓库,不跨机器 |
| 不可逆性 | 过期后对应恢复能力即时消失 |
典型使用场景
- 历史重写收尾:filter-branch / filter-repo 后清理旧对象,让体积真正下降
- 误操作善后完成:确认不再回退旧现场后,收缩本地保留
- 敏感内容清理:误提交密钥后过期 reflog,避免旧提交仍能被捞出
- 体积治理:大对象被重写移除后,expire 与 gc 配套才释放占用
- 保留政策:按数据保留要求清理过期的引用历史
- 先救后清:先看 reflog 找回现场,确认恢复完成再考虑过期
常用示例
常用示例
git reflog -5 # 先看清最近引用变动,找回现场从这里开始
git reflog expire --expire=now --all # 立即过期全部 reflog 条目
git gc --prune=now # 回收不再可达的旧对象
git fsck --unreachable | head # 复核:不可达对象是否已清掉
git reflog -5 # 过期后旧记录不再可见命令对照
| 命令 | 作用 | 备注 |
|---|---|---|
| git reflog | 查看恢复通道 | 找回现场的第一步 |
| reflog expire | 删除 reflog 条目 | 过期后旧提交不再受保护 |
| git gc --prune=now | 回收不可达对象 | 只 expire 不 gc 时对象还在 |
| git fsck --unreachable | 列出不可达对象 | 复核清理效果 |
执行即失去对应恢复能力:只在确认现场不需要回退时使用,团队共享仓库要提前公告。
过期范围也包括 refs/stash 的条目(暂存栈依赖 reflog 保存),执行前确认没有还在依赖的暂存记录。
想局部处理可以加 --dry-run 先看清单,或指定具体引用过期单个分支,不必一上来就 --all --expire=now。