三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

怎么防止多 Agent 并行开发时的代码冲突?

怎么防止多 Agent 并行开发时的代码冲突?

防止多 Agent 并行开发时的代码冲突,核心思路不是让它们“协同”得更好,而是让它们在工作时物理隔离,在完成后有序合并。根据当前主流工具(如 Cursor、AI21 Maestro)的实践经验,最有效的方案是“物理工作区隔离 + 角色分工 + 统一合并审查”


🛠️ 方案一:物理工作区隔离(最推荐,Git Worktree 模式)

这是目前最成熟、最主流的方案。Cursor、AI21 Maestro、GitHub Copilot 等都在采用类似思路。

核心原理:不为每个 Agent 创建不同的文件夹,而是利用git worktree为同一个仓库创建多个独立的、并行的工作目录。每个 Agent 拥有完全独立的文件系统和分支,从根本上杜绝了文件冲突。

实现步骤

  1. 为每个任务创建独立工作区

    # 在主仓库目录下执行gitworktreeadd../repo-feature-auth-bfeature/authgitworktreeadd../repo-feature-api-bfeature/apigitworktreeadd../repo-bugfix-login-bfix/login

    执行后,你会得到三个独立的目录,分别对应不同的分支,互不干扰。

  2. 分配任务
    让 Agent A 修改../repo-feature-auth/目录下的文件,Agent B 修改../repo-feature-api/目录。它们可以同时运行,就像操作不同的项目一样。

  3. 合并与清理
    当 Agent 完成任务后,在其工作区内提交代码,然后推送到远程仓库。

    # 在 Agent 工作区内gitadd.gitcommit-m"feat: implement auth module"gitpush origin feature/auth

    最后,通过正常的 Pull Request 流程进行代码审查和合并。合并后可以删除 worktree:

    gitworktree remove../repo-feature-auth

优势

  • 彻底隔离:没有文件锁竞争,不会出现“两个 Agent 改同一个文件”的情况。
  • 成本极低:Worktree 共享 Git 对象数据库,几乎不占用额外磁盘空间。
  • 原生支持:不依赖任何第三方工具,纯 Git 原生功能。

适用场景:绝大多数后端、前端、全栈项目。


🧩 方案二:职责与角色分工(架构层,Planner-Worker 模式)

如果多个 Agent 不可避免地要修改同一份代码(例如,一个修前端、一个修后端,但最终要合并到同一个main分支),就需要在架构上做文章。

核心原理:不再让所有 Agent 平起平坐,而是引入一个“总指挥”(Planner)角色来拆解任务、分配工作;引入“执行者”(Worker)角色只负责具体实现。

实现架构

  1. Planner(规划者)

    • 职责:接收用户需求,分析代码库结构,将大任务拆解成多个互不重叠的小任务(例如:“重构user/auth.py文件”、“添加utils/logger.py”)。
    • 关键:Planner 必须确保拆解出的任务修改的文件集合是不相交的。
  2. Workers(执行者)

    • 职责:每个 Worker 只领取一个任务,在其分配的独立工作区(可以是 Worktree 或临时分支)内工作。
    • 关键:Worker 只对自己负责的代码块进行修改,不关心全局。
  3. Reviewer(评审者)

    • 职责:在 Workers 完成任务后,Reviewer 负责合并所有变更,并进行集成测试,确保整体功能正常。

工具支持

  • dataplane:一个 Node.js 库,内置了“Stream”机制,可以自动管理基于分支的工作流、冲突检测和级联变基(Cascade Rebase),适合需要编程控制多 Agent 流程的场景。
  • CCG-Workflow:一个开源 CLI 工具,实现了“Claude 做规划、Codex/Gemini 做执行”的分工模式,并强制外部模型只能输出建议,由主模型执行,安全性很高。

适用场景:大型重构、跨模块功能开发,或需要严格控制代码质量的场景。


⚡ 方案三:轻量级文件锁协同(Beep-Boop 信号模式)

如果你的 Agent 数量不多(例如 2-3 个),且无法使用 Worktree,可以使用基于文件的“信号量”机制。

核心原理:Agent 在修改某个目录或文件前,先“插旗”(创建一个标记文件,如boop.txt),完成后再“拔旗”(删除标记,创建beep.txt)。其他 Agent 看到“旗子”就会绕路。

实现工具

  • Beep-Boop MCP Server:这是一个基于 Model Context Protocol(MCP)的服务器,专门为此设计。Agent 可以通过 MCP 协议调用check_status查看目录是否被占用,调用update_boop锁定目录,调用end_work释放。

优势:简单直观,不依赖 Git 高级功能。

劣势:手动管理锁容易出错(如 Agent 忘记释放锁),且在高并发下会成为瓶颈。

适用场景:小型项目、快速原型验证,或 Agent 数量很少(<5个)的场景。


📊 方案对比与选择建议

方案核心机制隔离级别并发能力复杂度推荐场景
Git Worktree物理目录隔离⭐⭐⭐⭐⭐ (最高)⭐⭐⭐⭐⭐ (极强)⭐⭐ (低)首选,适用于绝大多数项目
Planner-Worker角色分工 + 任务拆解⭐⭐⭐⭐ (高)⭐⭐⭐⭐ (强)⭐⭐⭐⭐ (较高)大型项目、需要严格流程控制
文件锁 (Beep-Boop)目录级信号量⭐⭐ (低)⭐⭐ (弱)⭐ (极低)小型实验、快速测试

⚠️ 关键注意事项

  1. 避免共享状态:确保每个 Agent 的环境(环境变量、配置文件、依赖包版本)都是可复现且隔离的。否则,即使代码不冲突,运行环境也会“漂移”导致问题。
  2. 不要把 Diff 审查当作可选项:无论采用哪种方案,最终合并前都必须有人或 Reviewer Agent 进行审查。并行不是目的,输出高质量的、可合并的代码才是。
  3. 从“少”开始:不要一上来就跑 10 个 Agent。先从 2-3 个开始,跑通 Worktree 流程,再逐步增加并发数。Cursor 团队的经验表明,20 个 Agent 的吞吐量可能还不如 3 个精心协调的 Agent。

总结一下:首选 Git Worktree 方案,它简单、可靠、成本低。只有当 Worktree 无法满足(例如必须实时修改同一文件)时,再考虑引入 Planner-Worker 架构或文件锁机制。

← 返回列表