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 文件

-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 cleangit 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 配置、本地环境变量文件),但需格外小心。

图例理解

清理未跟踪文件git clean 只删除未被 Git 跟踪的文件,不影响已跟踪文件。但因为没有进入版本历史,删除后无法恢复。
工作区状态
已跟踪文件未跟踪文件忽略规则目录结构
结果
保留已跟踪文件删除未跟踪文件更干净的工作区
被 clean 删除的文件不在 Git 历史中,删掉就没了。养成先用 -n 预览的习惯。

特殊情况与边界

  • 不可逆操作:被 git clean 删除的未跟踪文件不在 Git 历史中,删除后无法通过 Git 恢复。
  • 先 dry-run:务必先执行 git clean -ngit clean -nd(含目录)预览将被删除的文件列表,确认无误后再加 -f 真正执行。
  • -x 的危险性-x 会同时删除 .gitignore 中列出的文件,可能误删 IDE 配置、本地环境文件等重要内容,使用前务必用 -n 仔细检查。
  • -f 是必需的:除非配置了 clean.requireForce=false,否则必须加 -f 才能真正执行删除,这是 Git 的安全保护机制。
  • git clean 不影响已跟踪文件,已跟踪文件的修改需要用 git checkoutgit restore 处理。