首页/开发/Git 与协作速查/.gitignore 忽略规则
Git 基础与命令88 条

.gitignore 忽略规则

声明无需纳入版本控制的文件:按目录生效、支持通配与否定;忽略规则只对未跟踪文件生效,已跟踪文件需要先移出索引。

Git 与协作速查开发更新于 2026-10-13

.gitignore 是什么

.gitignore 用来声明哪些文件不需要纳入版本控制,例如构建产物、依赖目录、日志与本地环境文件。它是仓库里的普通文本文件,按行写模式并支持通配与否定。规则只对尚未被跟踪的文件生效,已被跟踪的文件即使命中规则也仍会继续被跟踪。

匹配规则怎么算

模式里斜杠出现在开头或中间时,按 .gitignore 所在目录解析;不含斜杠的模式会匹配任意层级的同名文件或目录。结尾带斜杠只匹配目录,感叹号表示否定并把先前排除的内容重新纳入,两个星号可以跨目录匹配任意层级。多份 .gitignore 可以同时存在,深层的规则优先于浅层。

基本信息

适用平台Linux / macOS / Windows(Git 2.x)
写法每行一个模式;# 开头是注释;空行被忽略
生效范围.gitignore 所在目录及其全部子目录
特殊符号/ 锚定路径;结尾 / 只匹配目录;! 否定;** 跨目录
典型内容构建产物、依赖目录、日志、缓存、本地配置与密钥
优先级同层后写的规则覆盖先写的,深层规则覆盖浅层

典型使用场景

  • 新建仓库:第一次提交前先写好规则,避免把产物与密钥带进历史
  • 本机文件:用 .git/info/exclude 忽略只属于自己机器的临时文件
  • 强制保留:用 ! 把重要的示例配置从整体排除里放回来
  • 多语言项目:按语言分别声明依赖目录与编译产物
  • 全局兜底:用 core.excludesFile 配一份跨仓库有效的忽略文件
  • 排查规则:用 git check-ignore -v 定位某个文件被哪条规则命中

示例规则

示例规则
build/                  # 只忽略名为 build 的目录
*.log                   # 忽略任意层级下的日志文件
!important.log          # 但保留这一个日志
**/node_modules/        # 任意深度下的依赖目录
.env*                   # 忽略所有以 .env 开头的本地配置
docs/*                  # 忽略 docs 下的条目
!docs/README.md         # 但保留 README
/secret.txt             # 只忽略仓库根目录下的这个文件

常用模式对照

模式匹配范围注意
build/任意层级名为 build 的目录不匹配同名文件
*.log任意层级的日志文件默认作用于整个仓库
/build/仅仓库根目录下的 build斜杠起到锚定作用
!keep.log把先前排除的文件重新纳入父目录被排除时不生效
**/cache/任意深度的 cache 目录跨目录匹配
docs/**docs 目录下的全部内容不匹配 docs 自身
模式含斜杠时相对 .gitignore 所在目录解析,不含斜杠时匹配任意层级,两种写法覆盖面差别很大,写规则前先想清楚锚点在哪里。
已被跟踪的文件不受忽略规则影响。要让文件停止跟踪,先 git rm --cached,再确认 .gitignore 已经覆盖它,否则下次 git add -A 又会把它加回来。
只属于本机的文件(编辑器配置、临时笔记)更适合写进 .git/info/exclude,不会污染团队共享的 .gitignore。
想确认某个文件为什么被忽略,用 git check-ignore -v <路径> 会直接指出命中的规则与所在文件,比逐条比对快得多。

全局忽略与本机忽略

除了仓库里的 .gitignore,还有两个位置可以放规则:.git/info/exclude 只对当前仓库有效,而且不进版本控制,适合放本机个人文件;core.excludesFile 指向的全局文件对所有仓库有效,适合放编辑器与操作系统产生的临时文件。只有团队共享的规则才应该写进 .gitignore。

模式是否区分大小写取决于所在文件系统与 core.ignorecase 设置。跨平台项目里同名但大小写不同的文件,最好各写一条规则,避免只在一部分机器上生效。

易错点

  • 父目录整体被忽略后,子目录里的 ! 否定不会生效,需要先放开父目录再逐级否定
  • 已被跟踪的文件不受忽略规则影响,必须先 git rm --cached 移出跟踪才能生效
  • 密钥或本地环境文件一旦提交过,补上忽略规则也清不掉历史里的内容
  • docs/* 会把 docs 下的目录整体排除,想让其中某个深层文件例外必须逐级否定父目录,单写一条否定规则无效

数据来源与参考

  • Git 官方文档:gitignore(模式格式)
  • Pro Git 2nd Edition · 2.2 忽略文件
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌