git worktree 并行开发:让多个 AI Agent 互不覆盖文件

git worktree 并行开发的做法,是每个 AI Agent 一个 git worktree:仓库里的每个编程 Agent(Claude Code、Codex、OpenCode)各有自己的分支和文件。MXterm Pro 把这件事自动化了:创建工作区时勾选 worktree 隔离,每个 Agent 分屏就会在各自的 worktree 里、基于一条新分支打开,不用手动执行 git worktree add。没有隔离时,一个 Agent 的 git checkout 或 git stash 可能改写另一个 Agent 正在编辑的文件。
哪些情况真正需要为每个 Agent 配一个 worktree
只有一个 Agent 的仓库没有什么可冲突的。用主工作目录就够了,开隔离也没有额外好处。
同时对同一个仓库 运行两个或更多 Agent 时,隔离才有意义。MXterm Pro 的 Swarm Task Orchestrator 带有两个为此准备的预设。“Full Swarm Trio (Lead, QA, Docs)”会同时派出 Claude Code、Codex 和 OpenCode。“Feature Duo (Dev + Tester)”让 Claude Code 与 Codex 搭档。启动这两个预设时,worktree 隔离默认都是开启的。
预设不是必须的。新建标签页,选好 Agent,自己在创建工作区页面勾选“为每个功能使用独立的 git worktree”就行。这个选项默认关闭,只在 git 仓库里有效。之后再拆出来的分屏会在工作区文件夹里打开,不在各自的 worktree 里。
相关指南Mac Docker 构建终端:构建和 SSH 部署并排跑MXterm Pro 如何为每个 Agent 分屏创建 worktree
这个开关出现在两处,作用相同:创建工作区页面(“为每个功能使用独立的 git worktree”),以及派发预设时出现的 Swarm Task Orchestrator 对话框(“为每个功能使用独立的 git worktree”)。Agent 与 Control Room(原 War Room)文档 介绍的是同一个设置。
开启后,每个新的 Agent 分屏都会在仓库的 .worktrees/ 目录里单独检出一份代码。分支是新生成的,名字形如 swarm/<adjective>-<noun>,例如 swarm/brave-otter。没有挂 Agent 的普通终端分屏仍在仓库根目录打开,不受影响。
名字从大约 17,000 种组合里随机选取,不是按编号递增,所以两次运行不会碰巧复用一个过期的 worktree。如果名字已被占用,MXterm 会加数字后缀重试(swarm/brave-otter-2,然后是 -3,依此类推),一共最多尝试五个名字,仍不行就放弃这个分屏的隔离。
MXterm 第一次创建 .worktrees/ 目录时,会自动把它加进仓库自己的 .gitignore。这些临时检出不会作为未跟踪的改动出现在主工作目录里。
如果你给 MXterm 的文件夹不是 git 仓库,就会跳过隔离,不会强行创建。1.0.21 及之前,应用会在这类文件夹上执行 git init、git add . 并提交,这可能把 .env 或私钥卷进一段没人要求过的历史里。从 1.0.22 起,它不再对这类文件夹执行 git init。
创建工作区页面现在会提示“此文件夹不是 git 仓库,因此各 Agent 将直接共享它(无 worktree 隔离)”。这些分屏会在文件夹根目录不隔离地打开,每个分屏上还有一条可关闭的提示,说明原因。想要隔离,就先 git init 并自己做第一次提交。
有一个例外:在已有仓库但还没有任何提交时,创建工作区页面会先创建一个空的 .gitkeep,把文件夹里的所有内容以“Initial commit”提交,然后再创建 worktree,因为 worktree 需要有一个提交才能分出分支。
每个分屏的标题栏会用一个小徽章显示它的 worktree 所在的分支名。不用打开 Git 面板,就能看出 Agent 当前在哪条分支上。
worktree 是一个接一个创建的,这是有意的。对同一仓库并发执行 git worktree add 会争用 git 的锁文件,一次临时失败就会让一个分屏丢掉隔离。如果某个 worktree 创建不了(git 锁错误、磁盘空间不足或其他原因,且名字冲突已重试过),这一个分屏会回退到仓库根目录并记录一条警告。工作区里的其余分屏照常打开。
隔离能防住什么,防不住什么
拿具体的例子来说:派发“Feature Duo”,Claude Code 落在自己的分支和 worktree 上,Codex 落在另一个上。
没有隔离时,两个 Agent 共用一个工作目录。如果 Codex 在任务中途执行 git checkout 或 git stash,Claude Code 在磁盘上打开的文件就会在它不知情的情况下被改掉。它下一次调用工具时,不知道为什么刚写入的文件和读回来的内容对不上。
有了各自的 worktree,每个 Agent 都有自己的一份文件,检出在自己的分支上。这样能降低这种情况的概率:一个 Agent 的 checkout 改写另一个 Agent 正在打开的文件。
隔离不能消除所有冲突。两个 Agent 从不同角度改同一个功能,仍可能产生需要人工审阅、真正去合并的分支,这部分 MXterm 不会自动化。隔离去掉的范围更窄,也纯属机械层面:对同一个共享工作目录的文件系统级争抢。
worktree 不是沙箱。分屏仍是普通 shell,所以 Agent 可以离开自己的文件夹,执行你的账户能执行的任何命令。所有 worktree 还共用仓库背后的同一个 .git。隔离只是把各个 Agent 的文件分开,并不限制它们能做什么。
会话中途添加、合并和删除 worktree
隔离并不只在创建工作区时决定。Agent 可以在会话中途为委派的子任务,用 worktree.spawn 工具新开一个隔离的工作分屏。这只在开启 worktree 隔离创建的工作区里有效。
合并有意保持手动。Agent 的分支就绪后,按常规方式合并:在主 worktree 里执行 git merge swarm/brave-otter,或者推送后开 pull request,团队平时怎么做就怎么做。MXterm 的职责止于创建 worktree 和之后的清理,不决定里面的代码怎么处理。
删除刻意保守,两类调用方走两条不同的路径。Agent 只能删除没有任何未提交改动的 worktree,否则直接拒绝,也无法覆盖。
从界面清理则不同。“清理 worktree…”在 Git 面板的 worktree 列表旁边。它会先清掉过期条目(目录已不存在的 worktree),不需要确认,然后打开一个对话框。
对话框里,有未提交文件的 worktree 按分支列出,并标出各自的文件数。它们默认不勾选,要删哪个就自己勾哪个。没有未提交内容的 worktree 只汇总成一个数量,确认后一并删除。
对话框不会统计尚未合并的提交。确认之前请自己检查分支上的提交,因为删除会用 git branch -D 连分支一起删掉。
两条路径都不会自动运行。关闭分屏、工作区甚至整个应用,都不会自己删除 worktree。只有你,或在严格限制内工作的 Agent,有意去做时才会清理。
有一个限制要先知道:worktree 的目录创建后不会改名,因为 Agent 的会话状态绑定在那个绝对路径上。里面的 git 分支可以随意改名,文件夹不行。
Free 与 Pro:到底限制什么
worktree 隔离不是 Pro 专属开关,两个套餐的用法一样。
受限的是 Control Room 的规模。默认情况下,Free 没有分屏数量限制,但把任意一个 Control Room(把 Agent 组织起来共享跨 Agent 上下文)限制在 2 个成员。Free 的其他限制,5 个已保存的 SSH 主机和 1 个已保存的 MXterm Host,与 worktree 无关。Pro 没有这些限制。
“Feature Duo”预设(2 个 Agent,2 个 worktree)刚好在 Free 的 2 成员 Control Room 上限之内。“Full Swarm Trio”有三个 Agent,所以三个都进同一个 Control Room 需要 Pro。
git worktree 与 iTerm2、Warp、Termius、MobaXterm 的对比
MXterm 自动化的免费替代方案不是换一个应用,而是手动为每个 AI Agent 配一个 git worktree:在你现在用的任何终端里,用普通的 git worktree add 和 git worktree remove 命令。一两个 Agent 的话,这样完全可行。
Agent 变多之后,MXterm Pro 省掉的是那些琐碎的杂活:想一个不重复的分支名、创建 worktree、把分屏的工作目录指到它上面,以及拒绝误删带有未提交改动的 worktree。
iTerm2 是一款出色的 macOS 终端模拟器,脚本化能力很强。和其他普通终端一样,它不会替你创建 git worktree。在那里走这套流程,就得给每个分屏手动输入 git worktree add,之后还得记得自己 git worktree remove 并删除分支。
Warp 同样把 AI Agent 放在终端的核心位置。它可以在不同标签页或分屏里同时运行多个 Agent,它自己的多 Agent 指南也建议每个 Agent 用一个 git worktree(见 MXterm Pro vs Warp)。MXterm Pro 的切入点更窄:开启隔离后,它自己为每个 Agent 分屏创建分支和 worktree。
多分屏 SSH、Command Recipes(Cmd+J)和多 Agent 的 Control Room (原 War Room):先免费用。
常见问题
可以。开启隔离后,MXterm Pro 会规划分支名,并替你执行 worktree add 和 remove 命令。自己输入这些命令是可选的。
什么都不会发生。关闭分屏、工作区,甚至退出 MXterm Pro,都不会删除 worktree。清理要你显式操作,有两种方式。Agent 自己的工具调用只在 worktree 完全干净时才有效。或者在你用完分支后,用 Git 面板 worktree 列表旁边的“清理 worktree…”。
会占一些,但远少于再完整克隆一份。git worktree 通过同一个底层 .git 共享仓库的提交历史和对象。只有检出的文件和少量每个 worktree 的元数据会被复制。所以额外开销跟你的工作目录大小有关,与整个仓库的历史无关。
MXterm Pro 有意不替你合并分支。Agent 的 swarm/<name> 分支就绪后,按常规方式从主 worktree 里合并(git merge swarm/brave-otter),或者推送后开 pull request,团队平时怎么做就怎么做。
会跳过隔离,分屏直接共享这个文件夹,每个分屏上有提示说明原因。MXterm Pro 不会对它执行 git init。先自己 git init 并做第一次提交,再重新创建工作区。