Vibe Coding 选择性暂存:用三轮 Diff 自审筛掉越界改动
工作树里的代码能运行,不代表下一次提交只含目标变化。本文用工作树、索引和 HEAD 三层视图执行选择性暂存,并从范围、语义和证据三轮自审候选 Diff。
本文要点
- 主题聚焦:AI、Vibe Coding、DevOps
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
“我看过页面,功能正常”只检查了当前 working tree。真正会被 git commit 记录的是 index,而 index 可能少了一个新文件、多了半份格式化,或者仍保留上一次任务的 staged hunk。Vibe Coding 让一次编辑覆盖更多文件,因此提交前必须把“运行中的现场”和“准备写入历史的候选树”分开审查。
脏工作树安全改码解决已有修改的归属与保护;本文从所有权已经明确之后开始,回答哪些 hunk 应进入当前原子提交。选择性暂存不是美化历史,而是最后一次阻止越界语义进入共享记录的门。
第一轮:从全局范围找异常
先看 git status --short、未暂存 git diff --name-status 与 git diff --stat,再看已暂存的 git diff --cached --name-status。这轮不评价代码写得好不好,只回答:
- 出现的每个路径是否在任务允许范围;
- 是否有意外删除、rename、文件模式、submodule 或二进制变化;
- lockfile、生成产物和源文件是否成对;
- 是否混入日志、
.env、凭证、数据库或大体积 fixture; - 已暂存内容中是否残留旧任务。
遇到陌生路径先取消本次候选并查归属,不要用文件后缀推断“应该只是缓存”。AI 可以生成清单和风险标记,但秘密扫描、路径政策和所有者确认是独立门。git diff --check 能发现部分空白错误,不能发现授权泄露或错误业务逻辑。
第二轮:按 hunk 建立语义候选
使用 git add -p 逐块选择,必要时用交互界面的 split 把相邻 hunk 分开。每次选择都要能指向当前提交 claim;仅仅“代码看起来更好”不是进入理由。手工编辑 patch 能进一步切分,但上下文、行号或补丁格式处理不当会制造意外结果,只在理解补丁语义且随后重新读取 index 时使用。
常见的拒绝项包括:Agent 顺手改名;全文件 formatter 噪声;为让测试变绿而放宽断言;无关依赖升级;调试日志;把真实错误吞成默认值。与目标行紧邻并不表示语义相关。如果两个目标共享同一行而无法安全拆分,重新编辑源文件形成清楚边界,不要依赖一份难以复核的手改 patch。
暂存完成后,把 git diff --cached 当作一篇陌生补丁重新阅读,不依赖聊天摘要。先从测试和公共接口推断行为,再核对实现。要求 Agent 做两次角色不同的自审:第一次只找范围外变化和门禁削弱;第二次只找功能反例、权限、错误处理与数据兼容。AI 的结论是候选问题,最终以 diff、规格和运行结果裁决。
第三轮:证明证据属于暂存树
这是选择性暂存最容易犯的错误:通常的测试命令读取 working tree,而不是 index。假设未暂存代码补上了一个函数,index 中的调用却已经暂存,测试会在混合现场通过;提交后该函数不存在,CI 才失败。反过来,未暂存实验也可能让候选看起来失败。
因此先比较 git diff 与 git diff --cached 的依赖关系,确认候选不读取仅存在于未暂存区的行为。高风险变化应在隔离副本中按 index 对应的 tree 或候选提交运行门禁;无法做到时,明确标记 working-tree-contaminated,不能声称提交级验证通过。改动验证门提供 claim 与测试绑定方法,干净起点与恢复检查点则为隔离验证提供基线。
门禁通过后再做一次反向检查:
cached diff: 当前提交承诺的全部内容
unstaged diff: 明确保留给后续、且不被当前提交依赖
untracked: 每项有归属,没有被测试暗中读取
若测试生成了文件或 formatter 改了源,状态已经变化,必须从第一轮重来。不要看到绿色退出码就立即提交。
自审输出要能被另一个人复算
最终收据至少列出 claim、staged 路径与 hunk 摘要、主动排除项、运行命令、证据绑定的 tree/commit、未暂存依赖检查和已知限制。它不需要复述每一行,但要让 reviewer 能从 git diff --cached 重建同样结论。若使用 AI 总结,摘要之后发生任何暂存变化都使其过期。
发生冲突时不要在选择性暂存阶段静默采用一边,转入合并冲突语义对账。提交后才发现范围混杂,也不要用一条新提交“解释过去”;在尚未共享且仓库政策允许时重新组织,否则以显式修复或撤销保留事实历史。
三轮自审把 Git index 变成真正的候选发布面:第一轮证明路径没越界,第二轮证明每个 hunk 服务同一语义,第三轮证明绿色证据没有借用未提交代码。Vibe Coding 生成得再快,也只有通过这三层的部分值得进入下一次提交。
Related