检查状态与忽略文件
在之前的章节中,我们学习了 Git 的生命周期(工作区、暂存区、仓库)。在实际开发中,我们最频繁使用的命令非 git status 莫属。它就像汽车的仪表盘,随时告诉你仓库当前的情况。
本节我们将深入解读状态信息,并学习如何通过 .gitignore 让 Git “无视”某些特定的文件。
读懂 git status
Section titled “读懂 git status”当你运行 git status 时,Git 会扫描你的工作目录,并与暂存区及最新提交(HEAD)进行对比。输出通常分为三类信息:
1. Changes to be committed (已暂存的修改)
Section titled “1. Changes to be committed (已暂存的修改)”这部分显示的是绿字(在大多数终端中)。这些文件已经执行过 git add,准备好被提交了。
On branch mainChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: README.md modified: app.js2. Changes not staged for commit (未暂存的修改)
Section titled “2. Changes not staged for commit (未暂存的修改)”这部分显示的是红字。这些文件在工作区被修改了,但还没有添加到暂存区。如果你现在执行 git commit,这些修改不会被包含进去。
Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: config.yaml3. Untracked files (未跟踪的文件)
Section titled “3. Untracked files (未跟踪的文件)”这部分也是红字。这些是 Git 之前从未见过的文件(新创建的)。除非你显式地 add 它们,否则 Git 不会开始跟踪它们的历史。
Untracked files: (use "git add <file>..." to include in what will be committed) logs/debug.log temp/忽略文件 (.gitignore)
Section titled “忽略文件 (.gitignore)”在开发过程中,总有一些文件是我们不想提交到 Git 仓库的:
- 编译产物:如 Java 的
.class,Python 的__pycache__,Node.js 的dist/文件夹。 - 依赖包:如庞大的
node_modules/文件夹(它们应该通过package.json管理)。 - 系统文件:如 macOS 的
.DS_Store或 Windows 的Thumbs.db。 - 敏感配置:如包含 API 密钥的
.env文件。
为了让 git status 保持清爽,避免误提交这些无关文件,我们需要配置 .gitignore。
创建 .gitignore
Section titled “创建 .gitignore”在项目的根目录下创建一个名为 .gitignore 的纯文本文件。Git 会自动读取这个文件中的规则。
Glob 模式匹配规则
Section titled “Glob 模式匹配规则”.gitignore 使用标准的 Glob 模式来匹配文件路径。注意:规则中的路径分隔符统一使用 /,即使在 Windows 上也不要写 \。
以下是核心语法:
| 符号 | 含义 | 示例 | 解释 |
|---|---|---|---|
# | 注释 | # 这是一个注释 | 被 Git 忽略的行 |
* | 零个或多个字符 | *.log | 忽略所有以 .log 结尾的文件 |
? | 单个字符 | access?.log | 匹配 access1.log 但不匹配 access10.log |
[] | 范围匹配 | log.[0-9] | 匹配 log.0, log.1 等 (注意:不要误用为 *.png,扩展名应直接写为 *.png) |
/ (开头) | 锚定根目录 | /TODO | 仅匹配当前 .gitignore 所在目录下的 TODO 文件,不匹配 docs/TODO |
/ (结尾) | 指明目录 | build/ | 忽略 build 目录下的所有内容 |
! | 取反 (不忽略) | !important.log | 即使前面写了 *.log,也要强制跟踪这个文件 |
** | 跨目录匹配 | src/**/*.css | 匹配 src/a.css, src/b/c.css 等 |
典型的 .gitignore 模板
Section titled “典型的 .gitignore 模板”一个标准的 Web 前端项目 .gitignore 可能长这样:
# 依赖目录 (由包管理器安装)node_modules/
# 注意:通常不要忽略 pnpm-lock.yaml / package-lock.json,锁定文件应提交以保证版本一致性# pnpm-lock.yaml
# 构建产出dist/build/
# 环境变量 (包含敏感信息,绝不提交!).env.env.local
# 系统文件.DS_StoreThumbs.db
# 日志*.lognpm-debug.log*
# IDE 配置 (视团队规范而定,通常建议忽略).vscode/.idea/状态的局限性
Section titled “状态的局限性”虽然 git status 非常有用,但它有一个明显的局限性:它只能告诉你哪些文件变了,却不能告诉你文件里具体改了哪一行代码。
比如,它会告诉你 app.js 被修改了(modified),但你可能已经忘了你是改了一个变量名,还是重写了整个函数。
为了查看具体的代码差异,我们需要使用下一节将要介绍的命令 —— git diff。