- 已经会基本提交和分支操作的开发者
- 想理解命令边界与风险的人
Command Reference
git-prune 教程
清理不可达的 Git 对象,配合 gc 和 reflog 管理仓库对象生命周期。
- 知道工作区、暂存区、提交的基本关系
- 能读懂 `git status` 和简单历史图
- 误把本地整理命令用到共享历史
- 在没确认恢复路径前直接继续改写历史
一句话理解
git-prune 删除对象数据库中所有不再被任何引用指向的对象(不可达对象),是 Git 垃圾回收的核心组成部分。
什么时候适合用
- 当你明确知道某些对象已不可达且不再需要,想立即释放空间
- 当你在执行
git gc前想单独执行清理步骤 - 当你在恢复操作后确认已不需要旧的临时对象
基本示例
# 删除所有不可达对象(默认只删除超过 2 周的)
git prune
# 立即删除所有不可达对象(不等待过期时间)
git prune --expire=now
# 模拟运行,查看会被删除哪些对象但不真正删除
git prune --dry-run
# 只保留被 HEAD 和分支指向的对象,删除其余一切
git prune --expire=now
# 查看当前有多少松散对象
git count-objects -v
读这条命令时最该注意什么
prune 是一个破坏性命令。一旦对象被删除,如果它们不被任何引用(分支、tag、reflog、stash)保留,就真的消失了。运行前务必确认你没有遗漏需要保留的内容。
一个更稳的实践建议
不要直接运行 git prune。日常使用中,让 git gc 自动处理对象清理即可,它会智能地判断哪些对象可以安全删除。如果你确实需要手动清理,先用 git fsck 检查对象状态,再用 git prune --dry-run 预览删除范围。
补充理解角度
git gc内部会调用git prune来完成对象清理--expire参数控制对象保留时间,默认2.weeks.agogit prune-packed清理已经被 pack 文件包含的松散对象git reflog expire清理过期的 reflog 条目后,更多对象会变得不可达
这条命令在流程里解决什么问题
Git 的对象数据库只增不减(在正常操作下)。rebase、reset、amend 等操作会产生大量旧版本的提交对象,虽然它们不再被分支引用,但仍占用磁盘空间。prune 负责识别并删除这些真正的"垃圾"对象,是仓库维护的关键环节。
典型用例
- 清理因大量 rebase 操作产生的临时提交对象
- 删除已合并分支后残留的旧提交树
- 在仓库归档或备份前清理无用对象,减小体积
- 配合
git filter-repo清除大文件历史后,删除残留的大文件对象
图例理解
可达对象(有引用)不可达对象(无引用)松散对象
保留可达对象删除过期不可达对象释放磁盘空间
prune 是破坏性操作,删除的对象不可恢复。
特殊情况与边界
git prune默认不删除最近 2 周内的不可达对象,这是为了防止你正在恢复中的对象被意外清理- reflog 会保留对象的可达性,所以即使分支引用移走了,reflog 仍然能保护对象一段时间
git gc --prune=now是更常用的方式,它会先做 pack、再清理,比单独git prune更安全高效- 在团队协作中,prune 只影响本地仓库,不会删除远端的对象
- 如果磁盘空间极度紧张,可以考虑
git gc --aggressive,它会做更深度的压缩
延伸阅读
继续搭配 git gc、git fsck、git count-objects、git reflog 一起看,理解对象生命周期、可达性和垃圾回收的完整机制。