第 2 章

查看改动与配置忽略文件

在保存新版本前,通过代码差异(Diff)核对 AI 具体修改了哪些文件与代码行,并配置 .gitignore 排除密码、密钥和本地临时文件。

使用 Diff 查看具体改动

AI 生成代码的速度很快,但它有时会在我们看不见的地方修改非目标文件,甚至删除原本正常的逻辑。如果我们只凭界面表现来判断,很容易遗漏潜在问题。

在 Git 中, 用于逐行核对两个状态之间的变化。在编辑器对比窗口或 Agent 输出的报告中,通常会以加号与绿色标注新增代码,以减号与红色标注删除代码。通过要求 Agent 提供 Diff 报告,我们能够确认三件事:第一,AI 是否只修改了当前任务涉及的文件;第二,是否误删了原有的必要逻辑;第三,改动是否仍满足功能要求。

让 Agent 审查改动时,需要明确比较的两端,否则“没有改动”可能只是看错了范围:

  • 未暂存改动:工作区与暂存区比较,显示已跟踪文件尚未登记到暂存清单的编辑(对应 git diff)。
  • 待提交改动:暂存区与最近一次提交比较,显示下一次提交将正式记录的改动(对应 git diff --cached)。
  • 未跟踪新文件:尚未纳入版本管理的新文件,通常以 ?? 标记显示在状态列表中,不会直接出现在普通差异对比中。

初学者在实际使用中经常会遇到一种情况:明明让 AI 修改了代码,但在询问改动时,AI 却说 git diff 没有任何输出。这通常不是因为改动丢失了,而是 AI 在修改完文件后,已经顺手运行了 git add 将改动加入了暂存区。此时工作区与暂存区之间没有差异;只要让 AI 检查暂存区的差异(git diff --cached),就能看清即将写入新提交的代码内容。

两组 Diff 命令的核对范围如果 git diff 结果为空,检查改动是否已经被加入到了暂存区。
  1. 本地工作区(未暂存)我们或 AI 刚刚完成的编辑。运行 git diff,可查看它与暂存区的差异。
  2. 待提交暂存区(已暂存)运行 git add 登记的内容。运行 git diff --cached,可查看它与上一次提交的差异。
  3. 本地仓库(已记录)运行 git commit 生成的正式快照。提交后暂存区清空,两份 Diff 均恢复为空。
导航栏的一处改动示例 git diff:比较工作区与暂存区,保留登录跳转,只调整显示。
src/components/Navbar.tsx
+2-1
1010 export function Navbar() {
1111 return (
1212 <header className="nav-header">
13 - <a href="/login" className="link-old">旧版登录</a>
13+ <a href="/login" className="btn-primary">立即登录</a>
14+ <span className="badge-new">新功能</span>
1415 </header>
1516 );
1617 }

红色减号(-)表示相对暂存区删掉的行;绿色加号(+)表示本次新增的行;白色表示未改动的上下文参考行。

图中展示了一处典型的导航栏修改:新增 2 行、删除 1 行。如果把链接改成没有跳转逻辑的按钮,即使样式正确,登录入口还能用吗? 不能。因此例子保留了 /login 链接,在让 Agent 提交前,我们还要在浏览器中实际点击验收。Agent 暂存后,再让它核对一次待提交差异,确认准备记录的正是检查过的内容。

配置 .gitignore 保护敏感信息与排除产物

并不是项目目录下的所有文件都应当被 Git 记录。有些文件体积庞大且可以通过命令自动下载,例如依赖包目录;有些文件包含敏感凭据,例如本地环境变量文件。如果把这些内容提交到公开仓库,会带来严重的安全风险。

是存放在项目根目录下的文本文件,用于指定 Git 应当忽略的文件或目录规则。对尚未被跟踪且命中规则的文件,普通 git add 会跳过它们;规则不会加密文件,也不能阻止强制添加,更不会清除已有历史。图中的每条规则单独写一行;!.env.example 放在 .env* 后面,只为不含真实秘密的配置模板保留入口。

.gitignore 的生效范围规则只忽略未跟踪文件。下面特意保留一个已跟踪配置作为反例;这不是密钥保险箱。
.gitignore 规则过滤中
.env*!.env.examplenode_modules/dist/.DS_Store
src/components/Navbar.tsx已跟踪

已跟踪的源码。是否 add,由本次提交范围决定。

.env.local未跟踪 · 已忽略

假设尚未跟踪,命中 .env*;普通 add 会跳过,但规则不会加密内容。

node_modules/axios/...未跟踪 · 已忽略

假设尚未跟踪,第三方依赖命中 node_modules/,通常由包管理器安装。

.DS_Store未跟踪 · 已忽略

macOS 保存文件夹显示设置的文件,假设尚未跟踪,命中忽略规则。

.env.production已跟踪 · 规则不拦截

反例:若此前已跟踪,后加 .env* 也不会阻止其修改进入提交。必须另行停止跟踪;旧历史仍在。

初学者最常遇到的一个困惑是:为什么我明明把文件写进了 .gitignore,修改它时 Git 依然会提示改动并准备提交?

这是因为 .gitignore 规则只对从未被 Git 记录过的全新文件生效。如果某个文件在此前已经被提交过,Git 就已经与它建立了跟踪关系;之后单纯在 .gitignore 里补上规则,只要该文件的内容发生变化,Git 依然会如实报告修改,并允许提交。

遇到这种情况,直接对 Agent 说:“.env.local 已经被加进 .gitignore 了,帮我停止跟踪这个文件,但保留本地磁盘上的文件,不要删除它。”

Agent 底层执行的正是 git rm --cached 命令——它只把文件从 Git 暂存区和跟踪列表中移除,本地文件完好无损。提交这次变动后,后续对该文件的修改就不会再出现在待提交列表里了。

如果敏感密钥此前已经不小心提交并推送到了公开仓库,光加忽略规则或删文件是不够的;必须第一时间到对应服务商后台撤销或重置密钥,避免安全风险。

怎样让 AI 自检改动并配置忽略规则

在让 AI 协助开发时,我们可以把“检查差异”与“核对忽略规则”作为明确要求写入指令中。AI 能够熟练运行状态检查命令,并根据技术栈补齐配置。

当我们向 AI 索取改动报告时,应要求它说明比较范围、文件和关键行为变化,行数只能辅助判断;在初始化项目或添加新工具库时,也可以直接让 AI 检查 .gitignore 是否已经包含对应的构建目录。

向 AI 下达审查改动与忽略配置指令示例对话:同时检查差异范围、跟踪状态和忽略规则。

检查未暂存和已暂存的改动,只应涉及导航栏。确认登录链接仍可用,再检查 .env.local 是否已被跟踪、是否命中忽略规则。

示例结果:未暂存的 Navbar.tsx 为 +2/-1,/login 链接保留;暂存区没有改动。ls-files 未列出 .env.local,check-ignore 显示它命中 .env*。链接点击尚未实测,需完成后再提交。

把这些要求作为固定规范,能够有效减少 AI 自由发挥带来的副作用,让每一次版本记录都干净可查。

本章总结:先审查后提交,把好安全边界

在这一章中,我们学习了使用 Diff 审查代码变动的方法,理解了.gitignore 过滤无用与敏感文件的机制,并掌握了如何让 AI 自检改动。审查工作区与暂存区,并核对文件跟踪状态,才能判断本次提交会包含什么。在下一章中,我们会探讨 Git 最具特色的能力:分支机制与 HEAD 指针。

本章目录