☰
Git Worktree + Agent蜂群:多智能体并行开发的协同方案
2026/10/9 21:37:45 网站建设 项目流程

1. 团队协作的隐形瓶颈:上下文切换与分支分裂

1.1 为什么“一人一线程”在Agent时代失效了

最近在带中型团队做AI辅助开发落地,我观察到一个特别反直觉的现象:很多组里每个人都配了AI编程助手,甚至一个开发者同时开两三个Agent帮他写代码,但整个团队的协同方式还停留在十年前——开分支、切上下文、等CI、手动合并。结果是什么?AI帮每个人省下的时间,又被来回切换上下文、解决冲突、等待构建这些琐事成倍地吃回去了。

你可能会说,写代码嘛,本来就是一个人负责一个模块,并行开发靠Git分支就够了。这话在纯人工作业时代成立,因为人的注意力本来就是单线程的,一个人同一时刻只能专注一个任务,分支切来切去反而增加心智负担。但Agent不一样,Agent可以多实例并行,它可以同时读多个文件、改多处代码、甚至在不同语义上下文中工作。这时候真正限制我们的是什么呢?是工作区本身。

大家都用过git branch创建分支,然后git checkout来回切换。问题是,Git的分支本质上只是一个指向commit的引用,工作区却只有一个。你在A分支改了文件,切到B分支的时候,那个文件就被带过去了——除非产生冲突。于是大家被逼出了一套“潜规则”:要么一个任务一个仓库克隆,要么串行工作,要么频繁stash。放在Agent蜂群这种多Agent并行场景下,这套潜规则就是灾难。

1.2 单分支工作流在多Agent场景下会踩什么坑

我举个真实案例。我们组让两个Agent开发两个功能:Agent A负责给用户模块加一个“最近登录设备”列表,Agent B负责重构后端认证中间件。两个任务都涉及user.go这个文件。按照传统分支流程,Agent A在feature/user-devices分支上改完,Agent B结束了自己的分支后才发现,自己改的user.go是基于一个老版本,里面没有A新增的字段。于是冲突一大堆,需要人工逐行判断到底保留谁。

更隐蔽的坑是“语义冲突”。文件层面没冲突,但逻辑上打架了。A把user.go里的GetUserInfo函数改成了返回缓存版,B在另一个模块里调用了这个函数并假设它走的是DB强一致逻辑。合并后系统行为变了,测试不报红,因为两个分支的测试各自都是绿的,合并后集成测试也没覆盖到这条调用链。

你以为这就完了?还有CI排队的问题。Agent跑完代码要自动提交、自动触发流水线,但单工作区同一时间只能有一个分支处于可测试状态。Agent A和Agent B同时提交,CI队列就开始拥堵,谁的任务先通过全凭运气。这个等待时间,恰恰是Agent无法用“多开几个线程”来弥补的。

后来我们引入了git worktree和一套多Agent协同的调度策略,局面才真正改观。下面我会把整个方案拆开讲,包括原理、实操、以及我们踩过的那些坑。

2. Agent蜂群:让多个智能体在同一个目标下分工

2.1 蜂群模式的本质:不是人多,而是角色化与共识

提到“Agent蜂群”,很多人的第一反应是:多开几个Agent,一起干,不就行了?这是最大的误解。蜂群模式的本质不是“人多力量大”,而是角色化分工 + 共识机制 + 去中心化协作。就像真正的蜜蜂群体,每只蜜蜂有明确的职责——侦察蜂、工蜂、护卫蜂,它们之间通过舞蹈、信息素来同步信息,而不是靠一只“蜂王”指挥所有人。

放到软件开发场景中,常见的Agent角色化设计是:

  • 规划Agent:负责拆解需求、生成任务列表、划定模块边界和接口契约。
  • 实现Agent:按任务列表去具体写代码,可以同时开多个,每个负责一个模块。
  • 评审Agent:对实现结果做代码审查、静态检查、安全扫描。
  • 测试Agent:生成测试用例、运行测试、分析覆盖率。
  • 运维Agent:负责构建、部署、监控反馈。

这听起来很美好,但实际落地时有个关键前提:这些Agent必须共享同一套“共识”。共识包含两部分:一是对目标的理解,比如“我们要做的是一个订单系统”,二是对边界和契约的理解,比如“订单状态机只允许五种状态,谁都不许擅自加状态”。如果没有这套共识,多个Agent就会像无头苍蝇,各自基于自己的假设改代码,最后产物根本没法拼在一起。

2.2 调度策略:主从式、集市式还是混合式

多Agent并行,必须解决“谁听谁的”的问题。我们试过三种模式。

主从式(Orchestrator-Worker):只有一个规划Agent作为主控,其他Agent都听它的。优点是指令清晰、任务边界容易控制;缺点是主控Agent会变成瓶颈,如果它能力不够,整个蜂群都会被带偏。

集市式(Marketplace):每个Agent都是一个独立的“摊主”,自己认领任务、自己提交成果,大家通过一个共享队列来竞争。这样并行度最高,但也很容易失控——没人对全局负责,任务可能会重复做,也可能会被遗漏。

混合式(Hybrid):我们最终采用的是这种。规划Agent负责拆解第一层任务,并且定义好每个任务之间的依赖关系图。然后多个实现Agent按依赖关系并行开工。但每个实现Agent在提交代码前,必须先跑一个统一的“契约校验器”,比如接口定义是否符合OpenAPI规范、数据库变更是否符合迁移脚本模板。这相当于用程序化检查来充当共识机制,而不是依赖Agent自觉。

混合式的调度可以用下面这个简化流程来描述:

# 伪代码:混合式调度 tasks = planner.plan(requirements) # 生成带依赖关系的任务图 ready_tasks = get_ready_tasks(tasks) # 当前无依赖的任务 for task in ready_tasks: worker = acquire_worker() # 从Agent池里取一个空闲实例 worker.assign(task) # 绑定任务 register_worker(worker) while workers_are_running(): for worker in finished_workers(): result = worker.collect() if validate_contract(result): commit_to_worktree(worker.worktree) update_dependency_graph(worker.task_id) else: worker.request_rework()

这里有三个关键点:一是依赖图,确保没有依赖的任务可以并行,有依赖的任务必须等前置任务完成后才能开始;二是契约校验,用机器检查代替人工评审,防止“逻辑冲突”悄悄溜进代码库;三是隔离的工作区,每个Agent一个干净的工作区,互不干扰——这就说到Worktree了。

2.3 任务拆分与结果融合的实践模板

我们实践下来,任务拆分的粒度特别重要。太粗了,Agent做着做着就会发现“这个任务还需要改另一个模块”,于是开始越界;太细了,调度开销反而超过编码收益。我们总结了一个经验法则:一个Agent实例的单个任务,应该可以在10到30分钟内完成编码,且只涉及一个主要的代码目录。

比如上面提到的用户模块和认证中间件重构,我们不会把它们拆成两个任务,而是拆成四个:

任务ID职责涉及目录依赖
T1设计“最近登录设备”的数据库模型migrations/,internal/model/无
T2实现设备列表的API查询接口internal/handler/,internal/service/T1
T3重构认证中间件的基础框架internal/middleware/无
T4将新中间件接入路由并做集成测试internal/router/,tests/T2, T3

T2和T3都涉及internal下的不同子目录,且都依赖外部模块,理论上可以并行。T4则必须等T2和T3都完成后才能拆开做。这就是用依赖图防止“交叉污染”的方式。

结果融合也不是等所有任务做完一次性合并,而是按依赖图逐层合并。每完成一层的并行任务,就把它们各自的Worktree合并回主干,然后立即跑一遍集成测试。这样做的好处是:冲突从来不会积压到最后才爆发,而是在每一层合并时就被及时暴露和修复。

3. Git Worktree:并行工作区的核心机制

3.1 一次checkout的底层发生了什么

要理解为什么单工作区会成为多Agent的瓶颈,得先弄明白Git切换分支时到底做了什么。很多人以为git checkout branchA就是“把分支换过去”,但底层其实干了几件重量级的事:

  1. 把HEAD切换到目标分支的引用上。
  2. 用目标分支指向的commit内容,更新索引(index)。
  3. 用新的索引内容覆盖工作区文件。

这几步里,第二步和第三步是真正的耗时大户。如果目标分支和当前分支差异很大,比如改了上百个文件,Git就要把这一百多个文件的变更同步到工作区里。这会触发许多额外操作:更新文件的修改时间戳、重新扫描目录、让IDE的索引失效等。最要命的是,如果你当前工作区里有未提交的改动,Git还得分情况处理——要么带过去,要么拒绝切换,要么要求你stash。

所以,当多个Agent在同一仓库同一工作区工作时,它们就像三四个同学共用一张书桌,每个人要写作业前都得先把别人的书本挪走。哪怕你不在物理上切换分支,只要两个Agent基于同一工作区改过文件,git status 就会变得混乱不堪。

3.2 git worktree vs git branch:真正的区别在哪里

很多刚接触这个概念的同事会问:“我已经用了git branch了,为什么还需要worktree?”这里得把这两者彻底掰开讲明白。

git branch只是创建了一个指向某个commit的引用。它不创建任何新的工作目录,也不改变你当前的工作环境。你执行git branch feature-1之后,还是站在当前分支上,工作区文件一个没变。要让工作区切换到新分支,必须再执行git checkout feature-1,这时候工作区才被更新。

而git worktree是直接创建了一个新的工作目录,并把这个目录“绑”到一个分支上。在这个新目录里,你有独立的HEAD、独立的索引、独立的工作区文件。你可以同时打开两个终端:

# 终端1:主工作区,停留在 main 分支 cd ~/repo # 终端2:创建一个新的工作树,并绑定到 feature-device 这个新分支 git worktree add ../repo-device -b feature-device cd ../repo-device

此时你在repo-device目录里改代码、提交、切换分支,完全不会影响~/repo目录。两个目录共用同一个.git对象库(对象和引用是共享的),但各自的HEAD、索引、工作区是独立的。

用表格来对比更直观:

维度git branchgit worktree
创建的实体一个引用(指针)一个完整的工作目录
是否改变当前工作区不改变改变(新增目录)
切换代价需要checkout,可能触发大量文件更新目录之间切换,零文件更新
能否同时在两个分支改代码不能,同一工作区只能有一个分支状态可以,每个工作区各不相同
共享内容共享对象库共享对象库和引用
独立内容无HEAD、索引、工作区、配置(部分)
适用场景创建分支、管理版本线多任务并行、多Agent开发、复杂合并

补充一个细节:同一个分支只能在一个Worktree被检出的情况下工作。你不能同时在两个worktree里都checkout出main分支。如果试图那样做,Git会报错。这其实是Git在保护引用的一致性,也恰恰说明每个worktree都扮演着独立“开发环境”的角色。

3.3 从创建到清理:Worktree的完整生命周期

我们团队现在的标准操作是:每个Agent任务开一个worktree,任务结束后把worktree清理掉。生命周期如下:

第一步:创建一个任务专用的worktree

git worktree add ../agent-t1 -b task/t1-user-device-model

注意这里有个小技巧:路径放在仓库目录外面,比如../agent-t1,这样能避免worktree嵌套在仓库内导致 Git 扫描到一堆无关文件。另外worktree目录命名要能对应上Agent任务ID,否则多Agent并行时你会分不清哪个worktree是哪个Agent的。

第二步:在worktree中开发并提交

cd ../agent-t1 # Agent在这里改写代码,生成commit git add . git commit -m "feat: add user device model"

这个commit直接写到共享的引用对象库里,但工作区是隔离的。你可以同时在~/repo里看别的代码,不会被agent-t1里的未提交文件干扰。

第三步:回到主工作区合并

cd ~/repo git merge task/t1-user-device-model

合并时如果和当前主分支有冲突,Git会明确告诉你冲突文件,而这些冲突只影响主工作区的文件。你不用担心另一个worktree里的未提交内容被误伤。

第四步:清理worktree

git worktree remove ../agent-t1 # 或者 git worktree delete ../agent-t1

同时删除远端分支和本地分支,保持引用整洁:

git branch -d task/t1-user-device-model git push origin --delete task/t1-user-device-model

我见过不少人漏掉最后一步,导致仓库里挂着一堆历史worktree的引用。你可以用git worktree list查看当前所有worktree,如果想清理所有不再需要的,就逐个remove。注意,如果worktree里有未提交的改动,git worktree remove会拒绝执行,需要先处理干净。

4. 多工具协作:把Agent蜂群和Worktree焊在一起

4.1 工具选型:CLI、编辑器集成与自动化脚本

有了Agent蜂群和Worktree这两个“核武器”之后,还需要一套工具把它们缝合起来。我们在实践中的工具栈很务实,没有引入任何重量级商业平台,几乎都是CLI和脚本的组合。

核心工具清单:

  • Git(废话):用于worktree管理、分支合并。
  • jq:解析API返回的JSON,方便Agent和脚本之间传数据。
  • gum:交互式shell脚本美化工具,用于人工确认关键步骤。
  • make:统一封装常用的自动化命令,比如make worktree-create id=t1,make merge-all。
  • Aider(或类似支持CLI的AI编码工具):作为Agent实例的执行器。它本身支持通过命令行指定要修改的文件,这样我们可以脚本化控制每个Agent的工作范围。
  • 预提交钩子(pre-commit):统一的代码风格检查和基础静态分析。

这里我想重点强调一下执行力边界的问题。Agent蜂群真正落地时,最让人头疼的不是Agent不会写代码,而是它会乱写。比如你让Agent A去改订单模块的路由,它顺手把用户模块的配置也改了。这种越界行为在纯人工Code Review时还能被发现,但在多Agent并行时,根本没有一个“人”能实时盯着所有提交。

我们的解决方案是:在worktree的仓库里设置强制的pre-commit钩子,检查本次提交涉及的文件是否都在该worktree允许的路径白名单内。不在白名单的直接抛错,不允许创建commit。这个钩子脚本是所有worktree共享的,因为worktree共享.git里的钩子配置。我们放在项目根目录下的.git/hooks/pre-commit中(或者用core.hooksPath指向共享钩子目录)。

4.2 组合工作流:一个真实的多Agent并发任务示例

我画不出漂亮的流程图,但可以把我们最常用的一套命令直接贴出来,你照着敲一遍就能理解这个协作模式。

假设主分支是main,需要同时开发两个特性:用户设备列表(T2)和认证中间件重构(T3)。它们各自可以独立提交、独立测试,最后都合入带T4的集成分支。

# 0. 从 main 创建集成分支,用于最终合并 git checkout main git pull git checkout -b integration/t2-t3 git push origin integration/t2-t3 # 1. 为Agent T2建一个worktree,基于集成分支 git worktree add ../work-t2 -b task/t2-api query cd ../work-t2 # 2. 只允许修改 internal/handler 目录 echo "internal/handler/* internal/service/*" > .allowed-path git add .allowed-path git commit -m "chore: add allowed path for T2" # 3. Agent T2 开始基于该worktree工作 # 调用AI编码工具的API或CLI,限定只访问internal/handler和internal/service aider --no-auto-commits --file internal/handler/user_device.go internal/service/user_device.go # 4. 提交并推送 git add . git commit -m "feat: user device list API" git push origin task/t2-api

另一个Agent T3的操作完全并行,只是路径不同:

git worktree add ../work-t3 -b task/t3-midware integration/t2-t3 cd ../work-t3 # 只允许改 internal/middleware 目录 echo "internal/middleware/*" > .allowed-path # Agent T3 在这里重构 aider --no-auto-commits --file internal/middleware/auth.go git commit -am "refactor: auth middleware foundation" git push origin task/t3-midware

然后等待两个worktree的CI都跑绿。CI脚本里可以加一条规则:只有路径白名单内的文件变更才会触发对应的测试任务,这样能减少无效的CI排队。

最后合并:

cd ~/repo git checkout integration/t2-t3 git pull git merge task/t2-api git merge task/t3-midware # 如果出现冲突,只会在主工作区处理,不影响其他worktree git push

整个流程里,两个Agent天然就把自己的工作区隔离开了,合并时发生的任何冲突,都可以在隔离的集成分支上一次解决,而不是在多个开发者的主分支上互相等待。

4.3 冲突预防:文件锁、职责边界与原子提交

即便有了worktree隔离,两个Agent还是可能在同一个文件的不同区域修改,最终合并时产生冲突。我们总结了三个预防手段。

文件锁:在AI辅助开发时代,文件锁听起来很“土”,但真的有用。我们在共享目录里放了一个LOCKS文件,每个Agent在开始改文件前,先通过脚本检查并写入“我准备改哪个文件”。如果文件已经被其他Agent锁了,就等待或者协商重试。

# 在worktree里运行的Agent ./scripts/lock-file internal/service/user_device.go "T2" # 如果成功,创建 internal/service/user_device.go.lock

当然这个lock文件本身会产生Git变更,所以我们会把它加入.gitignore,它只作为现场协调工具,不进入版本控制。

职责边界:比文件锁更根本的是提前划清权限边界。我们使用前面提到的.allowed-path文件,其实这就是一个“权限清单”。Agent只能触碰被分配范围内的文件。一旦越界,pre-commit就拒绝提交。这比人工提醒靠谱多了。

原子提交:我们要求Agent的一次提交只对应一个原子逻辑变更,不要拖泥带水。例如用户设备列表API,一次提交只包含新增的文件和对应修改的handler;绝不允许在同一commit里混入无关的重命名或格式调整。这样做可以大幅减少合并冲突的定位成本。我曾经见过一个Agent在同一个commit里既加了新接口又重构了另一个文件里的老函数,结果和老模块的Agent产生了跨目录的冲突,排查了很久才定位到是格式化工具版本不一致导致的。

5. 架构复用:让多个Agent共享同一套“世界观”

5.1 复用的不是代码,是契约

很多团队说“复用”,第一反应是抽公共函数、搞共享库。但在多Agent场景下,我们更提倡先复用契约——接口定义、数据结构、错误码、配置模式。因为Agent天然对“公共函数”缺乏全局感,它在自己的上下文窗口里,只能看到局部信息。如果你让它复用公共函数,它可能不知道这个函数在别的模块里被怎么用,贸然改动就会悄悄破坏其他模块。

我们做了一件事:把所有跨模块调用的接口都定义在独立的契约文件里,比如api/openapi.yaml、internal/contract/schema.go。每个Agent开工前,必须先从主分支拉取最新的契约文件,并且它改代码时只能实现契约,不能改契约本身。契约的修改由专门的“规划Agent”或委员会统一执行。

举个例子:用户设备列表API需要返回设备名称和最近登录时间。我们在契约里定义好请求和响应的JSON结构,Agent T2只能根据这个契约去实现handler和service。如果T2发现数据库里没有“最近登录时间”这个字段,它只能停下来说“我缺少数据源”,而不是擅自改契约。

这听起来很反直觉,但效果极佳。我们让Agent直接忽略“如何优雅改契约”这个OpenAI级的难题,把它们的能力锁定在“按图施工”上。改契约这种高风险动作,永远留给人工或经过专门训练的高权限Agent。

5.2 共享模块与抽象层的设计边界

除了契约,我们也有真正的代码级复用。但复用边界必须极其克制。我们的原则是:

只复用“不会因业务方向改变而改变”的底层部分,比如日志封装、数据库连接池、配置读取、错误处理中间件。这些部分对多Agent来说是“稳定的底座”,所有Agent可以直接调用。

至于“业务层面的共享服务”,比如订单状态机、用户权限校验,我们反而刻意不共享。为什么?因为业务逻辑演进太快,多个Agent同时改它,冲突率极高。我们把这类逻辑做成领域模块,每个模块由固定的一组Agent负责,其他部门通过接口而非内部类来访问。这也呼应了领域驱动设计里对“聚合边界”的强调。

另外,抽象层的数量要克制。我们团队曾经为了“复用”,设计了三层抽象:Repository -> Service -> Facade。实际上只有Service层被系统主体代码用到了,Facade层完全浪费。多Agent场景下,你每增加一层抽象,Agent需要理解和遵循的规则就多一层,出错概率也线性上升。命中即用的抽象才是好抽象,为了复用而设计的抽象,大多数时候都会变成技术债。

5.3 用AI Agent自动维护架构规范

架构规范最大的问题是“嘴上说说容易,落实起来难”。没人愿意在Code Review时一遍遍唠叨“事务边界要对齐”“异步操作必须加超时”。我们的解法是:让一个专门的架构守护Agent来做这件事。

这个Agent并不写业务代码,它的职责包括:

  • 检查每个worktree提交的代码是否符合项目架构规范,比如“所有外部HTTP请求必须经过internal/client层”。
  • 扫描是否有Agent越权改动核心目录。
  • 自动修复简单规范问题,比如 import 分组、命名规则。
  • 将复杂的架构偏差升级为“架构评审任务”,分配给资深工程师。

它的运行时机就在pre-commit或CI的早期阶段。我们把架构守护Agent封装成一个命令行工具,集成进去:

architecture-guard check --worktree=../work-t2 --mode=strict

输出类似:

[PASS] internal/handler/user_device.go: 仅包含handler映射,未包含业务逻辑 [FAIL] internal/handler/user_device.go: 调用了internal/service/order.go,超出当前任务边界

一旦有FAIL,整个worktree的提交就会被拦下。你会觉得这很“冷酷”,但正是这种冷酷,让多个Agent不会互相踩踏。没有它之前,经常出现两个Agent各自认为“自己改的是对的”,结果架构越来越臃肿。有了它之后,至少架构层面的争执减少了七成。

6. 实战踩坑与效果评估

6.1 最容易被忽略的坑:代理缓存与全局状态

Worktree解决了工作区隔离,但有个东西仍然在“共享”,那就是进程级的全局状态和缓存。

第一个坑是AI编码工具的对话缓存。Aider这类工具会记录每个文件的历史上下文,在多个worktree里并行开着多个Agent,它们的配置文件如果指向同一个缓存目录,就很容易互相干扰。比如T2的Agent先读取了internal/service/user_device.go的内容,然后T3的Agent在同一缓存路径下也读取了,可能拿到的是T2还未提交的临时版本。这会导致Agent基于“脏数据”做决策,最后产生离谱的提交。

我们的解决方法是:每个Agent的worktree目录里设置独立的缓存环境变量,例如:

export AI_CACHE_DIR=../work-t2/.cache

第二个坑是依赖缓存。Go、Rust这类语言都有全局的依赖缓存,比如GOPATH/pkg/mod、~/.cargo/registry。多Agent并行编译时会同时访问这个缓存,虽然一般不会出错,但当两个Agent同时构建同一个依赖的新版本时,可能会触发锁等待,把构建时间拉长。我们后来给CI容器缓存加了一层基于worktree的隔离,确保每个Agent任务用同一份依赖快照。

第三个坑是文件系统监听器。如果你的IDE或编辑器监听了整个仓库根目录,worktree里新增的文件也会触发索引刷新,大量文件变更会让IDE卡死。建议把worktree目录加入IDE的忽略列表,只对主工作区做完整索引。

6.2 效果量化:并行度、交接成本与回滚率

说了这么多,到底效果如何?我拿我们组一个具体迭代来量化。

之前用传统单分支协作方式,两个Agent同时开发两个模块,实际耗时大约是每个模块3天,加上最后联调集成1.5天,总耗时约6.5天。期间还有大量上下文切换、等待CI、手动解决冲突的时间,实际人月消耗在8到9人日左右。

改用Worktree+蜂群模式后,同样的两个模块,规划Agent花半天拆任务和定契约,然后T2和T3并行开发,各花2.5天。集成合并和修复冲突大约花1天。总耗时从6.5天降到4天。人日消耗也从8.5降到6.5。更关键的是,团队的心理负担明显降低——没人需要担心“我正在改的代码会不会被另一个Agent覆盖”了。

我们还专门统计了交接成本。旧模式里,没有文档说明的情况下,一个Agent要接手另一个Agent的Worktree,平均需要半天到一天来理解上下文。现在因为每个worktree的任务边界清晰、契约明确,新Agent直接看task/t2分支的README和契约文件,交接时间缩短到两小时以内。

回滚率也从一个迭代平均三次紧急回滚降到了不到一次。因为架构守护Agent提前拦住了很多交叉改动,合并后出问题的概率大幅下降。需要注意的是,这里有个前提:我们的契约设计做得足够好,如果契约动不动就被改,这个数字一定会恶化。

6.3 给后来者的三条建议

第一,不要一上来就追求“全自动蜂群”。你至少得先把人工协同的Worktree流程跑熟,让每个开发人员都能熟练创建、合并、清理Worktree。然后,再逐步把“分配任务”“检查范围”“合并结果”这些环节交给Agent。从一个人加一个Agent做起,确认可控后再加第二个。我们吃过一次亏,一开始同时上了五个Agent,结果管理Agent的元工作比手动开发还累。

第二,把“契约守护”当成和“静态检查”同等重要的基础设施来建设。很多团队引入多Agent后,只做了代码风格检查和单元测试,却忽略了架构边界检查。这就好比给了每个人一把锋利的刀,却没有告诉他们哪些区域不能切。你会很快发现,代码风格都是统一的,但架构却悄悄腐烂了。

第三,保持worktree的权重极低。Worktree只是并行开发的一个工作单元,不是永久环境。任务一结束,立刻合并并删除worktree。我们见过有人为了省事把十几个worktree长期挂在仓库里,结果.git/worktrees堆满了陈旧引用,连git status都变慢了。定期执行git worktree prune清理悬挂worktree数据,也是一种好习惯。

最后再分享一个我们内部的小技巧:给每个Agent的worktree配置独立的Git用户名和邮箱,比如user-A.t2@dev.local,这样合并提交历史后,你能一目了然地看出哪些提交来自哪个Agent。排查问题的时候,这个信息往往比注释还有用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询