- 已经会基本提交和分支操作的开发者
- 想理解命令边界与风险的人
Command Reference
git clean 教程
解释 git clean 如何删除未跟踪文件和目录,以及为什么 dry-run 和 force 标志在这里非常重要。
- 知道工作区、暂存区、提交的基本关系
- 能读懂 `git status` 和简单历史图
- 误把本地整理命令用到共享历史
- 在没确认恢复路径前直接继续改写历史
一句话理解
git clean 用来删除未跟踪文件和目录,它不会作用于已经被 Git 跟踪的文件内容。
为什么它是高风险命令
因为被删除的未跟踪文件通常不在 Git 历史里,删掉后不容易恢复。
最重要的习惯
先 dry-run:
git clean -n
确认无误后再真正执行:
git clean -f
git clean -fd
标志完整对比
| 标志 | 作用 | 风险等级 |
|---|---|---|
-n | 预览模式,不实际删除 | 安全 ✅ |
-f | 强制删除未跟踪文件 | 中等 ⚠️ |
-d | 同时删除未跟踪目录 | 中等 ⚠️ |
-x | 也删除 .gitignore 中的文件 | 高危 🔴 |
-X | 只删除 .gitignore 中的文件 | 中等 ⚠️ |
-i | 交互式模式,逐条确认 | 安全 ✅ |
-e <pattern> | 排除匹配模式的文件 | 安全 ✅ |
组合使用时要格外小心:
git clean -fd # 删除未跟踪的文件和目录
git clean -fdx # 连 .gitignore 中的也删了
git clean -fdX # 只删 .gitignore 中列出的
git clean -fdi # 交互式确认每个文件
-x 标志会忽略 .gitignore 规则,删除所有未跟踪文件——包括那些你故意忽略的 IDE 配置、.env 文件、本地工具链等。执行 git clean -fdx 之前,请务必先用 git clean -fdxn 仔细检查输出列表。
交互式 clean 模式
git clean -i
交互式模式会逐步展示将要删除的文件,并允许你逐条确认或排除。它提供了几个子命令:
- clean:开始清理
- filter by pattern:按模式过滤
- select by numbers:通过编号选择文件
- ask each:逐条确认
- quit:退出
适合不确定哪些文件该删的场景,尤其是在别人的仓库或不熟悉的项目中。
dry-run 输出分析
$ git clean -nd
Would remove build/output.js
Would remove node_modules/.cache/
Would remove dist/assets/logo.png
dry-run 的输出以 Would remove 开头,逐行列出将被删除的路径。注意:
- 目录会以
/结尾(或带递归内容) - 单个文件直接显示完整路径
- 如果输出为空,说明工作区没有未跟踪文件需要清理
- 建议养成"先
-n看输出、确认列表、再执行"的习惯
排除模式
使用 -e 可以排除特定文件,即使它们匹配其他条件:
# 清理未跟踪文件,但保留 .env 文件
git clean -fd -e '.env'
# 排除多个模式
git clean -fd -e '*.log' -e '*.tmp'
# 排除整个目录
git clean -fd -e 'node_modules/'
这在需要清理构建产物但想保留本地配置文件时非常实用。
与替代方案对比
| 场景 | 命令 | 影响范围 |
|---|---|---|
| 清理未跟踪文件 | git clean -fd | 只删未跟踪的 |
| 清理未跟踪文件 + 忽略文件 | git clean -fdx | 未跟踪 + .gitignore 中的 |
| 重置已跟踪文件的修改 | git reset --hard | 已跟踪文件恢复到最后一次提交 |
| 两者都用 | git reset --hard && git clean -fd | 工作区完全回到 HEAD 状态 |
git clean 和 git reset --hard 处理的是不同层面的问题:
git clean处理未跟踪文件——这些文件从未被git add过git reset --hard处理已跟踪文件的修改——这些文件被 Git 跟踪,但工作区有改动
如果你想要一个完全干净的工作区(回到最后一次提交的状态),通常需要两者组合使用。
git reset --hard && git clean -fdx 会让工作区彻底回到 HEAD 状态,所有未提交的修改和未跟踪的文件都会被删除。执行前请确保你不需要保留任何本地改动。
这条命令在流程里解决什么问题
git clean 解决的是"工作区中存在大量未跟踪文件需要清理"的问题。它删除未被 Git 跟踪的文件和目录,常用于构建后清理、切换分支前的环境净化,或移除误创建的临时文件。
典型用例
- 构建或测试后留下大量编译产物、临时文件,用
git clean -fd一键清理所有未跟踪的文件和目录。 - 切换分支前想让工作区尽量干净,先用
git clean -n预览会被删除的文件,确认无误后再执行。 - 使用
-x标志清理包括.gitignore中列出的文件(如 IDE 配置、本地环境变量文件),但需格外小心。
图例理解
已跟踪文件未跟踪文件忽略规则目录结构
保留已跟踪文件删除未跟踪文件更干净的工作区
被 clean 删除的文件不在 Git 历史中,删掉就没了。养成先用 -n 预览的习惯。
特殊情况与边界
- 不可逆操作:被
git clean删除的未跟踪文件不在 Git 历史中,删除后无法通过 Git 恢复。 - 先 dry-run:务必先执行
git clean -n或git clean -nd(含目录)预览将被删除的文件列表,确认无误后再加-f真正执行。 -x的危险性:-x会同时删除.gitignore中列出的文件,可能误删 IDE 配置、本地环境文件等重要内容,使用前务必用-n仔细检查。-f是必需的:除非配置了clean.requireForce=false,否则必须加-f才能真正执行删除,这是 Git 的安全保护机制。git clean不影响已跟踪文件,已跟踪文件的修改需要用git checkout或git restore处理。