先把结论摆出来:当整个开发历史的提交量堆到 73.8 亿次这个量级时,我们根本不可能再像以前那样,靠"人肉翻 Git log"来分辨哪些提交是Agent自己改出来的,哪些又改错了。Agent 只要拿到权限,就会在本地生成一堆带着错误信息的 Commit、失败的 CI 记录、以及后来要花很久才能发现的隐藏回归数据。这些数据不收拾的话,它们不会自己消失,而会沉淀在仓库历史、构建日志和度量看板里,变成比一行坏代码更难处理的"脏凭证"。
这篇文章不讨论情绪,也不声讨 Agent。我们只聊一个工程问题:Agent 改错之后,产生的数据到底留在哪里、影响多大、如何定位、怎么干净地处理掉,以及——更关键的——怎么让这些"错误数据"在下一次迭代里反而变成有效信息。它适合正在用 AI 编程助手做日常开发的人,也适合那些已经在思考 CI 数据治理、代码提交规范、团队协作边界的后端与平台工程同学。
1. 73.8 亿次提交背后的隐藏成本:Agent 错误数据正成为新的技术债
1.1 从"自动补全"到"自主改错":Agent 的权限跃迁
前几年的 AI 辅助编程,本质上是"更聪明的补全器"。它输出的内容停留在编辑器里,最终写入版本库的,仍然有一个明确的人在做判断。而现在的 Agent 工具已经把链路打通了:它能读取当前分支差异、运行测试、根据报错修改函数、甚至自行追加 Commit 和推送远程分支。问题就出在这里——当 Agent 开始"自己提交代码"时,它留下的不仅是代码变更,还有一整套围绕这次变更产生的历史记录和元数据。
我把这个过程叫做"权限跃迁":从"建议"到"执行"的跃迁,也是从"人类控制所有步骤"到"人类接受结果"的跃迁。权限跃迁带来的生产效率提升是很明显的,但很少有人认真回答一个基本问题:如果 Agent 改错了,它在仓库里、CI 系统里、评审平台里留下的那些记录谁来负责?
这不是甩锅,这是一个数据的可追溯性问题。举个例子,某次 Agent 在"修复空指针"的过程中,顺手把另一个无关的日志级别从 DEBUG 改成了 ERROR。代码评审没发现,合并之后三天内日志系统被错误告警淹没。当你去查 Git Blame 时,看到的是一行来自某个 Agent 身份的信息——但它为什么要改这一行、依据什么决策改的、改之前有没有跑过关联模块的测试,这些过程数据是完全缺失的。这种缺失本身,就是新的技术债。
1.2 错误数据沉淀的四个池子:Git 历史、CI 日志、评审记录、遥测指标
一次 Agent 改错,往往不只是"一个错误提交"这么简单。它会在至少四个地方留下痕迹:
Git 历史是最显眼的,错误提交会变成永久记录。即便后来执行了 revert,那个"错误提交 + 回滚提交"的组合仍然存在,未来的审计和自动分析脚本都会把它们当有效历史看待。
CI 日志是第二个池子。Agent 触发的构建失败、测试失败、静态检查警告,全都会被记录在流水线日志里。这类日志通常没有人去清理,但是当团队开始用这些数据做"交付质量分析"时,一次 Agent 引发的虚假失败就会污染指标,让流程状态的判断失真。
评审记录是第三个池子。代码评审系统会保留改动块上的评论、approve、reject 记录。如果 Agent 的提交被人工评审驳回,这条记录会留在那里,和正常的评审记录混在一起,影响后续对"代码质量趋势"的统计。
遥测指标是第四个,也是最容易被忽略的一个。构建成功率、平均修复时长、缺陷逃逸率、分支集成频率……所有基于历史数据计算的指标,都会因为 Agent 的错误提交而偏离真实水平。细心一点说,它不只是"弄脏了代码",它弄脏了团队用来做技术决策的数据基础。
这四个池子里的数据不是独立存在的,它们之间会互相引用、互相印证。Git 里的错误提交会出现在 CI 的变更集里,CI 的执行号会挂在评审平台的检查记录上,评审记录最后又会回到版本历史里。所以当你想要"收拾"某一次 Agent 错误时,面对的往往是一张数据关系网,而不是单个提交。
1.3 为什么说它是"毒数据":越错越错的数据飞轮
我这里想强调一个比"代码回归"更麻烦的后果——数据污染会自我繁殖,形成越错越错的飞轮。
现在的 AI 开发工具,正在越来越多地利用历史仓库数据做能力增强。比如有的工具会把本地的构建错误、修复方式、最终提交的 diff 采集起来,用于模型微调或 RAG 检索;有的团队在做内部工具链时,会直接拿 Git 历史、CI 日志、评审评论来训练自己的"代码审查 Agent"。这些历史数据里,如果含有一条看起来正常、实际上是在引入新 bug 的 Agent 提交,而它恰好被用于训练,那么模型学到的就是"这种改法是可以的、是正确的"。
你可能会说:模型有监督信号,错了会被人类回滚。但问题是,绝大多数回滚操作并不会以"这是一次 Agent 错误"的标签留在历史里。它可能只是一次普通的 "Revert" 提交,没有任何上下文说明。于是模型看到的是:提交 A 被修复了一次;至于提交 A 本身是不是错的、错在哪里、为什么错——全都不可见。
所以我说它是"毒数据":它表面上存在于版本库中,甚至没有语法问题、没有明显告警,但它会让所有依赖历史数据的系统沿着错误的方向迭代。这就是 73.8 亿次提交规模下的真正难题——不是一条坏代码,而是一类难以从源头隔离的坏数据。
2. 先搞清楚"数据"存留在哪,再谈谁收拾
2.1 Git 历史里的错误提交:几种典型形态
如果有人问"Agent 改错的数据在哪里",答案的第一站永远是git log。但要知道,错误提交在 Git 历史里的形态并不总是"一眼能看出来的坏改动"。根据我观察到的实际案例,大致有这么几类:
- 逻辑替换型:改动符合语法、测试勉强通过,但把原本正确的业务逻辑替换成了"看似等价"的错误版本。典型的如把循环边界从
<改成<=、把空判断的位置挪移。 - 越权修改型:在修复区域 A 时,顺带修改了区域 B 的无关代码。这类提交通常 commit message 很短,比如 "fix: handle null in getConfig",实际 diff 里却混入了日志配置、硬编码、甚至依赖版本的变化。
- 伪重构型:提交信息写着 "refactor: extract utils",实际改动里既没有等价的测试保护,还造成调用点遗漏,只靠编译通过撑住了场面。
- 环境敏感型:本地生成的配置文件被提交上来,锁定了某台机器的路径、代理或环境变量,让其他成员拉取后行为不一致。
这些提交的特点,是可以在一段时间内不触发明显的构建失败。等你发现时,它已经和下游的若干提交纠缠在一起,无法通过简单 revert 干净撤回。这也是为什么治理 Agent 错误的长期收益,绝不只是"快速恢复线上系统"。
2.2 CI/CD 日志与构建产物:被忽略的错误凭证
第二个藏匿点是 CI/CD 日志。我见过太多团队只关注日志的"消费"——检查失败原因、看测试报告——却从不对日志做生命周期管理。结果是,Agent 错误提交触发的那条失败流水线,会以一个"失败记录"的身份,被完整保留在系统里。
这条记录的价值被严重低估。它里面至少包含:提交 SHA、触发时间、失败任务名、错误堆栈、测试输出、上下文日志。如果团队未来想对 Agent 的行为做审计,或者想复盘"某个 Agent 在多长时间内会制造多少个失败构建",这些数据就是一手证据。但是,因为这些日志没有结构化的标签,没有和"这次失败是 Agent 引入的"这个事实绑定,它们只能躺在数据里,既不能主动报警,也无法在统计中排除。
我对团队的建议是:至少要在 CI 任务层面增加一个"提交来源"的维度。简单来说,在流水线的阶段命名、构建报告或通知里带上 Author 信息,比如author: agent-name。这样至少你能在面板上筛出 Agent 改出来的失败,而不是永远被混在一个"团队构建成功率"的大池子里。
2.3 代码评审与议题系统:假错误如何污染统计
代码评审记录是第三处容易被忽视的数据池。有一点我得说在前面:评审系统里不只有"代码评论",还有依赖 Git 数据的统计。比如:平均评论轮次、每个提交的审批耗时、缺陷逃逸率。如果一个 Agent 生成的提交质量不稳定,且团队成员且没有被训练出"看到 agent 提交就提高警惕"的习惯,那么它很可能获得与普通提交完全一致的统计权重。
更麻烦的是一旦 Agent 改错被发现,评审记录里会留下大量带有情绪的信息讨论。这些讨论本身是有价值的——它们能帮助后续维护者理解现场——但缺乏结构化的结果标注。比如:评审中被驳回的代理提交没有被标记为 "agent-error",合并后被回滚的错误提交也没有被标记为 "caused-by-agent"。所以在做季度质量和流程改进时,这些数据就会误导分析,让人以为某些人工代码也有同样高的缺陷率。
要解决这个问题,最直接的手段是在评审模板与提交模板中增加字段:来源类型(人工 / Agent)、代理名称、是否回滚、回滚原因。这些事情听起来像是在增加流程负担,但如果你已经大量引入 Agent 参与开发,这就是绕不开的基础设施,否则后面所有复盘都是盲人摸象。
2.4 本地 IDE 与 Agent 运行日志:个人残留
再往下挖一层,还有本地环境里的日志残留。多数 Agent 工具在本地运行时会输出操作日志、读取上下文文件、缓存历史对话,甚至把"你刚才手动改的代码"和"Agent 生成的代码"一起记录在一个工作区里。
这些本地日志有时候比远端历史更危险。它们通常不进入代码库,也不被统一管理,但又真实记录了 Agent 做出决定的上下文。一旦设备丢失或工作区被清理,这些数据就不可恢复。更好一点的情况,是有人把本地日志里的关键片段贴到项目 Wiki 或 Issue 中,让上下文可以共享。但更多时候,这些"个人残留"只是静静地躺在.agent/目录里,直到某次系统升级后消失。
如果你所在团队开始统一使用 Agent 开发工具,我建议把"本地日志是否纳入管理与备份"作为基础设施评审项。哪怕只是约定一个统一的目录和命名规则,也远比什么都没有强。
3. 收拾数据的实操链路:从定位、回滚到净化
3.1 定位 Agent 错误提交:用好 Git 自身工具
无论谁收拾,第一步永远是定位。好在 Git 本身提供了非常强大的查找工具组合,只是很多人没有把它们组合起来用。
最基础的是按 Author 过滤,前提是建立过 Agent 身份(见第 4 部分)。如果没有区分身份,则需要通过提交信息、改动关键词和时间窗口来缩小范围。
# 查看当前分支所有提交及作者 git log --pretty=format:"%h %an %ad %s" --date=short # 按作者过滤,且只看近7天 git log --author="your-agent-name" --since="7 days ago" --stat # 按提交信息关键词模糊搜索 git log --all --grep="fix:" --grep="refactor:" --since="2024-01-01" # 按代码内容搜索:找出某段被删除/新增的关键词 git log -S "getConfig(" --oneline # 按正则搜索:找出改动量异常大的提交 git log -G "TODO|HACK|debugger"我通常的做法是三步走:先按时间窗口拉出所有 Agent 提交,然后按文件列表圈定可疑范围,最后用git show逐条看差异。
# 查看某个提交的完整改动 git show <commit-id> --stat git show <commit-id> --no-patch --pretty=fuller其中--no-patch --pretty=fuller能拿到完整的作者、提交者、时间戳。在排查多开发工具残留问题时,这个信息很有用——因为"提交者"往往体现的是 Agent 所使用的系统身份,而"作者"则可能是原开发者或委托方。
另一个经常被低估的命令是git reflog。它记录的是本地仓库的 HEAD 移动历史。假设 Agent 在本地完成了一串提交后被判定错误,有人用 reset 或 rebase 撤销了它们,远端历史可能已经丢失,但本地 reflog 里还留着那串提交的 SHA 集合。配合git show <sha>,你甚至可以复原 Agent 当时到底改了什么。
# 查看本地 HEAD 的移动记录 git reflog --date=iso | head -50 # 根据 reflog 中的 SHA 快速查看当时内容 git show <sha_from_reflog> --stat3.2 撤销与修正:改写历史的操作要点与风险
定位到错误提交之后,选择哪种撤销手段,取决于"错误提交是否已经被推送到远程"、"是否有其他协作者基于它提交了新内容"、"是否只有最后一个提交有问题"。我整理了一张常用的决策表:
| 场景 | 推荐操作 | 风险等级 | 说明 |
|---|---|---|---|
| 错误提交在本地,未推送,且在最新位置 | git reset --soft HEAD~1 | 低 | 保留改动内容在暂存区,便于重新提交 |
| 错误提交在本地,未推送,但在历史中间 | git rebase -i后执行 drop / edit | 中 | 需要处理冲突,注意后续提交的 SHA 变化 |
| 错误提交已推送,且有协作者基于它继续开发 | git revert <sha>生成反向提交 | 低 | 不改变历史,最安全,但会留下回滚记录 |
| 错误提交已推送,且确认只有自己在维护该分支 | git reset --hard+git push --force-with-lease | 中 | 改写远程历史,务必先通知协作者 |
| 错误提交涉及敏感数据 / 大文件,需要彻底移除 | git filter-repo重写完整历史 | 高 | 会改变所有提交的 SHA,需要全团队配合 |
具体到 Agent 场景,我推荐的最稳妥操作依然是 revert。因为 Agent 的错误往往不是单点问题,而是牵一发动全身。如果直接 reset 掉中间一段历史,极容易丢失它后续已经修复过的部分。使用 revert 生成一个反向提交,既不影响后续提交,又能让所有人都清楚"某次 Agent 修改被否定了"。
# 生成反向提交,且保留原提交信息用于追溯 git revert -m 1 <commit-id> --no-edit # 如果回滚后产生了冲突,解决后继续提交 git add . git revert --continue如果你的项目有良好的分支隔离,那么最省力的方案其实是:在 Agent 专用的分支上直接 reset。Agent 分支允许自由改写历史,只要没有合并到主干,任何错误提交都能在本地消失得干干净净。这也解释了为什么分支隔离是 Agent 数据治理的第一道防线。
3.3 净化 CI 日志与指标系统:避免"错误"变成"凭证"
Git 改完了,还有一个大概率被忽视的环节:CI 流水线的日志和指标系统里,可能已经记录了 Agent 触发的那次失败。如果只是改了代码但不处理 CI 记录,那么下次你在"构建失败趋势分析"里,依然能看到那个幽灵般的失败点。
CI 日志的净化思路,不一定是删除。删除日志不是所有平台都开放的能力,而且可能影响合规。更务实的做法是:给它打上"已识别为 Agent 错误、已回滚、不影响当前交付"的处理标签。这样它在历史统计中可以被除权,在审计时可追溯,在后续训练数据清洗时也能被过滤。
具体怎么做,要看团队用的流水线平台能力。但一个通用的思路,是用 "annotation" 类的接口追加一条标记:
# 伪代码示例,表示在 CI 记录上追加标记 pipeline.runs[run_id].add_annotation( tag="agent-error", commit_start="abc123", commit_end="def456", resolution="reverted", owner="developer-name", reason="AI model introduced unintended config change" )有些平台支持直接在 UI 上对构建记录加 tag;有些需要在通知 webhook 里追加字段。关键是定一个团队内部的约定:遇到 Agent 引发的失败构建,不能只让它挂在面板上,要有人负责"打标 + 关联回滚提交"。
3.4 团队协作下的清理流程:先冻结再处置
当错误提交已经进入主分支、被多人拉到本地,或者已经推进了几个发布迭代时,"收拾数据"就不再是单人操作了。我建议按下面四个阶段来执行:
阶段一:冻结。先通知相关团队成员暂停基于该分支的集成操作,避免在清理期间产生新的冲突。不要急着第一时间强推。
阶段二:快照与证据留存。在动任何历史之前,先用git branch snapshot或直接导出 patch 文件保存现场。即便后面操作失误,也可以用来恢复。
# 保存当前状态到独立分支,作为安全快照 git branch safety-snapshot-<date> # 导出当前改动为补丁文件 git diff <base>..<target> > agent-rescue-<date>.patch阶段三:逐池清理。先处理 Git 历史,再处理 CI 标记,再处理评审记录。每处理完一步,由执行人向一个小群组或卡片同步进度,避免重复劳动。
阶段四:复盘与再入库。清理完成后,把"Agent 错误报告"整理成结构化的条目:哪个 Agent、改了什么、为什么错、如何被发现、如何被回滚、需要什么测试覆盖。这份数据本身,就是你团队抵御未来错误的最佳输入。
4. Agent 身份与数据标记:让错误数据重新变为有效数据
4.1 Git Author 身份隔离:为 Agent 建立专属身份
第 3 部分的很多操作能不能高效执行,前提在于你能不能从提交堆里快速筛出 Agent 的贡献。所以,第一道治理动作不是清理,而是"发身份证"。
具体来说,就是给每一个团队使用的 Agent 工具分配独立的 Git 用户身份,不允许与真实开发者共用身份。配置方法很简单:
# 在项目本地为 Agent 指定独立用户 git config --local user.name "agent-name" git config --local user.email "agent-name.yyyy-mm-dd@local" # 或者通过环境变量临时指定 GIT_AUTHOR_NAME="agent-name" \ GIT_AUTHOR_EMAIL="agent-name@local" \ GIT_COMMITTER_NAME="agent-name" \ GIT_COMMITTER_EMAIL="agent-name@local" \ git commit -m "task: update validation logic"不要小看这一步。有了独立身份,git log --author=agent-name就能精确列出某个 Agent 的所有产出;有了精确列表,你才能在事后做批量审计、回滚、数据统计。否则,再先进的查找手段也只能靠猜。
我为这个身份字段建议再加一层时间维度。Agent 的迭代速度极快,同一天内可能因为模型版本更新导致行为变化。如果身份能体现日期,比如agent-name-20250521,那么哪怕未来出现大面积回滚,你也能快速聚焦到某个具体版本行为上。
4.2 提交信息规范与错误前缀:让搜索与审计成为可能
身份隔离解决了"谁改的"问题,但还没解决"为什么改"和"改得对不对"的问题。这里的抓手是提交信息规范。
我建议团队为 Agent 提交制定一个比人工提交更严格的前缀规则。比如:
格式: [agent] [task-type] module: description 示例: [agent][feat] payment: add refund retry logic 示例: [agent][fix] search: adjust fuzzy matching threshold 示例: [agent][refactor] utils: extract date formatter这样的好处,第一是搜索方便。任何想知道"这个 Agent 在支付模块干了什么"的人,都可以用git log --grep="\[agent\].*payment"快速定位。第二是触发保护机制时方便配置规则。例如,某些分支策略可以阻止[agent]开头的提交直接推到主干,必须走评审。
错误发生后,如果回滚了,我建议在反向提交的信息里同样保留可识别的标签:
[agent][revert] payment: revert refund retry logic due to concurrency issue这样在以后的分析里,你能把"Agent 提交"和"Agent 被回滚的提交"两类数据进行合并与交叉,得到非常有价值的统计:Agent 单次修改被回滚的比例是多少、集中在哪些模块、哪些任务类型回滚率最高。这些数据直接指导后续的 Agent 使用策略,真正做到"用错误数据反哺决策"。
4.3 建立"回滚即数据"的标注机制:把错误沉淀变成训练信号
我在这篇文章之前提到过,"毒数据"的可怕之处在于缺少监督信号。那么反过来想:如果我们给"错误数据"加上明确的标签,它会不会就从毒数据变成了训练信号?
答案是肯定的。在我接触过的几个比较成熟的应用场景里,团队会在本地维护一份结构化的"AI 行为事件表"。每当一次 Agent 改动被认定为错误,相关人员就按照统一格式追加一条记录。事件内容包括:触发命令、Agent 身份、模型版本、上下文摘要、改动文件、诊断结果、回滚编号、人类修正补丁。
EVENT_TYPE: agent_error AGENT_ID: agent-name-20250521 TASK_TYPE: fix MODULE: order-service ERROR_PATTERN: missing_transaction_boundary DETECTION_METHOD: code_review / test_failure RESOLUTION: revert REVERT_COMMIT: f01dab REVISED_PATCH: order-service-transaction-boundary-fix.patch这份表可以有多种用途。首先是做代码审查前的筛选——新提交如果和某条已知错误模式高度相似,可以提前标记高风险。其次是作为未来内部检索的语料,让工具能主动避开已被验证的错误路径。第三,它能让团队在向外部模型反馈问题时提交高质量的数据包,而不是几段零散的命令行日志。
这套机制听上去很工程化,但它的价值非常长远。因为只要团队还在让 Agent 写代码,错误事件就不会停止出现。与其让每次错误都白费,不如用一套标注机制,把错误沉淀为团队的核心知识资产。
4.4 分支策略与评审闸门:从源头减少污染
数据治理之所以累,很大程度是因为污染已经发生。所以真正的"收拾",应该往前挪,在 Agent 产出提交时就开始控制污染面。
我推荐的 Agent 分支策略长这样:
- 为每个 Agent 任务创建独立分支,分支名带任务号或日期,比如
agent/order-refund-retry-20250521。 - 禁止 Agent 提交直接推到开发主分支或主干分支。
- Agent 分支上的提交,必须通过至少一次人工评审,或自动测试全部通过后,才允许合并。
我并不反对给 Agent 更大的自主权:它可以自主创建分支、自主提交、自主推送远程。但引入"评审闸门"这一层,不是不信任 Agent,而是为了让错误数据出现在受控区域,而不是直接进入主历史。受控区域内任何错误都更容易被回滚、更容易被打标、更难污染主数据流。
评审闸门未必都需要人工过一遍全量代码。针对 Agent 提交,你可以只做差异评审:看它到底比人工基线多改了哪些地方、有没有删除测试、有没有修改配置文件。这样就能以少量时间成本,阻止大量无效错误扩散。
5. 命令组合与边界控制:别把"收拾"变成二次事故
5.1 常用命令组合与快速定位脚本
说了这么多方法论,最后落回实际操作。下面这套组合,是我个人处理 Agent 错误提交时的高频动作,按顺序执行基本能覆盖九成场景。
# 第一步:定位。列出所有 Agent 提交,按时间倒序 git log --author="agent-name" --date=short \ --pretty=format:"%h %ad %s" --all # 第二步:针对可疑提交查看改动文件总量与对象大小 git show <commit-id> --stat --summary # 第三步:查看更细微的文本变化,尤其是配置、路径、依赖 git show <commit-id> -- \ '*.json' '*.yaml' '*.yml' '*.toml' '*.env*' # 第四步:确认该提交是否已经进入远程分支 git branch -r --contains <commit-id> # 第五步:如果进入远程,则生成反向提交 git revert <commit-id> --no-edit # 第六步:为回滚提交补充标签信息,方便后续检索 git commit --amend --no-edit \ -m "$(git log -1 --pretty=%B) [resolved-by: agent-error-review]"需要注意第六步的做法是:先 revert 生成默认提交,再 amend 补充完整信息。这样提交说明里既有原始提交信息,又带有处置标签,后续grep能一并查出来。如果你更偏好保持 SHA 不被修改,也可以直接把标签写到 merge commit 的说明里,二选一即可。
我还建议把这个过程脚本化。将"列出 Agent 提交、输出文件列表、导出 patch、生成回滚提交"封装成一段工具脚本,存放于团队内部工具库。这样即使不熟悉 Git 的同学,也能在事故发生后有条理地走完流程。
5.2 改写远程历史时要守住的边界
有些场景下,比如错误提交带出了敏感信息,或者错误提交体积巨大,需要直接从远程历史中抹除。此时 filter-repo 几乎是唯一出路。
# 安装后先克隆一份裸仓库作为工作副本 git clone --mirror <remote-url> repo-mirror cd repo-mirror # 删除所有匹配指定作者的全部提交 git filter-repo --force \ --mailmap mailmap.txt \ --invert-paths \ --path-glob 'secrets/*' # 清理缓存引用并重新打包 git reflog expire --expire=now --all git gc --prune=now --aggressive这类操作一定要在隔离环境做,做完之后再推送到远程。它会把提交 SHA 全部改写,因此受影响的协作者需要重置本地副本——如果团队大、分支多,这会是一次不小的协作成本,必须在变更窗口里执行。而且强烈建议在改完远程后,同步清理 CI 的构建缓存和制品,否则旧的 hash 还会以产物形式残留。
如果你只是要去掉敏感内容,而不想承担全部 SHA 变动的成本,可以用更保守的git filter-branch配合--tree-filter只处理特定路径。但 filter-branch 的性能与可用性都远不如 filter-repo,且容易踩坑,我不太推荐在 73.8 亿次这种大体量仓库上跑。
5.3 清理数据时常见的三个误区
最后,说几个我踩过或见过的坑。
误区一:清理完 Git 历史就觉得万事大吉。错。CI 日志、评审评论、本地分支、远程分支引用都可能残留旧 SHA。如果你只处理了 Git 历史,那么新统计面板上的指标依然会被旧数据干扰,且一旦有人点开一条旧的评审评论,关联的新提交信息也会错乱。
误区二:把所有 Agent 提交无差别回滚。错。Agent 也有可能在其中某些提交里做对了事。无差别回滚会连带把正确修复也从主干里拿掉。正确的做法是先按文件列表和提交信息分类,只回滚被确认为错误的提交;对分不清的,用标签标记后在评审层面做二次确认,而不是默认全部干掉。
误区三:让"收拾"只有清理的人看到。错。Agent 错误不只影响一个人。如果清理动作没有被记录、没有被团队成员知晓,后面依然会有人基于旧的错误提交继续开发。清理动作必须同时带来一份变更说明,哪怕只更新在项目的 CHANGELOG 或内部论坛里,也要让其他人知道"这条路走不通,别重试"。
实际上,在我自己处理过的多个项目里,最大的成本从来不是敲那几条 Git 命令,而是"决定哪些数据算错误、谁来标记、后续怎么复用"。这套决定一旦做成机制,Agent 错误就不再是团队的拖累,而会变成一套非常稳定的质量反馈闭环。我也越来越觉得,73.8 亿次 Commit 之后的真正答案,不是某个人能"收拾"完所有数据,而是一整套让数据在产生时就被贴好标签、在出错时能被迅速定位的工程习惯。这套习惯越早建立,后面要收拾的东西就越少。