一个仓库,一支智能体舰队:Bromure Agentic Coding 中的 git worktree
让两个编码智能体针对同一个仓库工作,它们会在同一个工作树上互相冲突。git worktree 通过在同一份共享历史之上建立 N 个独立检出来解决这个问题。Bromure Agentic Coding 把它变成了一键原语:输入一个任务名,就能得到一个独立分支、一个独立检出,以及一个正在其上工作的智能体,每个都在一次性 VM 里拥有自己的标签页。

编码智能体跑得飞快;拖住它们后腿的是你的仓库。Bromure Agentic Coding 让每个任务都拥有自己的分支、自己的检出、自己的 智能体,每个都在自己的标签页里。
编码智能体跑得飞快。拖住它们后腿的是你的仓库。让两个智能体针对同一份检出工作,它们就会冲突:同一个工作树、同一批未提交的文件、同一个分支。一个智能体运行 git checkout,另一个的工作就在脚下被抽走了。
Git 用 worktree 解决了这个问题。Bromure Agentic Coding 把 worktree 变成了一键原语:每个任务都拥有自己的分支、自己的检出、自己的智能体,每个都在自己的标签页里。
首先,什么是 git worktree?
一次 git clone 给你一个工作树:一个装着已检出文件的目录、一个 HEAD、一个索引。要同时在两个分支上工作,你得来回折腾(git stash、切换、干活、再切回来、git stash pop,然后祈祷一切顺利),或者再做一次 clone——那会复制整个对象数据库,而且和你的本地分支毫无共享视图。
git worktree add 是第三种选择。它把一个额外的工作树挂接到你已有的仓库上:
git worktree add -b fix-login ../fix-login HEAD
这会给你一个新目录,里面是一份在新分支上的完整检出,与你的主检出共享同一个 .git 对象存储。每个 worktree 各自保留自己的 HEAD、索引和未提交状态;在一个 worktree 里提交的东西会出现在所有 worktree 中。创建一个 worktree 不复制任何对象,所以几乎没有成本。把工作合并回去只是一次本地 git merge:不用 push,不用 pull,也不用往远端跑一趟。
Worktree 让你在同一份共享历史之上拥有 N 个独立的工作目录。
为什么 worktree 适合 agentic coding
一个自主编码智能体需要一个可以随意折腾的工作树:编辑文件、跑构建、在思考时把半成品状态到处乱丢。这种东西你没法共享。
Worktree 恰好契合你委派任务的方式:
- 一个任务,一个 worktree,一个智能体。"重构网站"和"修复不稳定的测试"各自拿到一份私有检出。谁都无法踩踏另一个的未提交工作,也踩不到你的。
- **便宜到可以随手就用。**因为 worktree 不复制历史,为一个 20 分钟的任务临时开一个是很划算的。你可不会为这点事去 clone 整个仓库。
- **就地合并。**所有 worktree 共享一个仓库,所以整合一个智能体完成的工作就是对一个本地分支做本地合并。你审查的是一份 diff,而不是一条 pull-request 流水线。
Claude Code、Codex 以及其他工具在 worktree 里都跑得很好。真正的摩擦在于那套繁文缛节:挑一个目录、想一个分支名、git worktree add、把 .env 复制过去(被 gitignore 的文件不会跟着来)、cd、启动智能体、粘贴任务。事后还得把这一切清理干净。
Bromure Agentic Coding 去掉了这套繁文缛节。
Bromure Agentic Coding 中的 worktree
给新读者快速回顾一下:Bromure Agentic Coding 在 Apple 的 Virtualization.framework 上、于一次性的 Ubuntu VM 里运行你的编码智能体。一个**工作区(workspace)就是一个 VM;它通过 virtiofs 挂载你的项目文件夹(不做复制);工作区里的每个标签页(tab)**是一个运行任何你想运行的东西的终端,通常是一个智能体。VM 边界让处于全自主模式的智能体可以随意 rm -rf 或 curl | bash,而不会碰到你的 Mac。
Worktree 增加了第二个隔离维度。VM 隔离机器;worktree 隔离工作树,于是多个智能体可以共享一个工作区和一个仓库,而不共享状态。

创建一个
从任何目录是 git 仓库的标签页出发,你可以:
- 右键点击该标签页并选择 New worktree…,或者
- 按 ⇧⌘G(Workspaces 菜单里也列着它,就在 Merge worktree ⇧⌘M 旁边)。
即使 VM 正占用着你的键盘,这些快捷键也照样有效:客户机的窗口管理器会捕获这个组合键并把它交还给应用。


你会看到一个小对话框:一个任务名、一个工具选择器(claude、codex 或 grok,默认使用工作区的工具),以及一个可选的初始提示词。

按下 Create,在 VM 内部,Bromure 会:
- 从该标签页的当前提交切出一个分支
wt/<slug>(任务名 "Website refactoring" → 分支wt/website-refactoring), - 把它检出到
~/.bromure/worktrees/<repo>/<slug>下, - 复制进你仓库在
.worktreeinclude中列出的任何被 gitignore 的文件(详见下文), - 在该目录里打开一个新标签页,并且
- 启动你选择的工具,如果 VM 里没有就先安装它,并用你的初始提示词作为起点。
输入任务名几秒钟后,一个智能体就已经在它自己的分支上着手处理了。
观察一支舰队
每个 worktree 都是工作区源列表里的一个标签页,带有一个分支图标,并缩进在它所源自的标签页之下。图标显示正在运行的是哪个智能体,一个状态圆点显示它的状态:工作时闪烁橙色,完成时变绿,需要你介入时变红。扫一眼侧边栏就能回答"谁被卡住了?",无需打开任何东西。

Worktree 可以嵌套。一个 worktree 标签页本身就是一个 git 检出,所以 New worktree… 在那里同样有效。正在重构网站的智能体可以派生一个子智能体,在 wt/website-refactoring 的一个子分支上尝试某个有风险的变体,缩进得更深一层。
合并回去
当一个 worktree 的状态圆点变绿,右键点击它并选择 Merge…(或 ⇧⌘M)。因为 worktree 可以嵌套,对话框会问要合并到哪里:目标弹出菜单会列出祖先链,从直接父分支一直到仓库的根检出,任何跳过中间层级的选项都会带有一个警告后缀。


合并不会隐藏任何东西。它在目标检出中的一个新标签页里运行,所以你能亲眼看着它发生。只有 worktree 分支上已提交的工作才会合并过去。两种结果:
- **干净:**标签页打印
bromure: merged wt/website-refactoring into main.并等待你按 Enter。 - **冲突:**标签页打印
bromure: merge conflicts — starting claude to resolve…并就在那个有冲突的检出里启动智能体,附带指令让它解决冲突、暂存改动、总结它做了什么,并且只有在你确认之后才提交。想亲手解决、之后再改主意?合并标签页的右键菜单里保留了一个 Have the agent resolve conflicts(让智能体解决冲突)操作。


合并会把 worktree 原地保留。你可能还想再改一轮,或者把同一个分支合并到链条更上层。等你彻底完成,右键点击 → Discard worktree。那是有破坏性的那一个,它也直说了:它会移除检出、删除 wt/ 分支,并警告你会丢失任何未合并的提交。

让它真正好用的那些细节
**被 gitignore 的文件会跟着来,只要你要求。**一个全新的 worktree 是一份干净的检出,所以你的 .env、本地证书和工具令牌都不在里面,而一个连开发服务器都启动不了的智能体也没什么用。在你的仓库根目录放一个 .worktreeinclude 文件(每行一个相对路径,与 Claude Code 采用的约定相同),Bromure 就会把这些文件从主检出复制到每一个新 worktree 里。
**你未提交的改动仍然是你的。**Bromure 从标签页的当前提交切出 worktree,而不是从它的脏状态切出。父标签页里的半成品工作不会进入智能体的检出,反过来也一样。
**Worktree 能挺过重启。**标签页是临时的,但检出和分支存活在磁盘上,而且 Bromure 会维护一个小型的按仓库划分的注册表。关闭工作区,一周后再启动,你的 worktree 标签页会带着相同的分支、相同的标签重新出现,智能体也会重新启动。
**它支持 SSH。**你可以远程访问每一个工作区,而且终端 UI 拥有完整的 worktree 对等能力:一个 🌿 Worktrees… 菜单列出仓库里的每一个 worktree 和合并标签页,你可以通过 SSH 从手机上创建、合并、解决冲突和丢弃,就像在 Mac 上一样。
**失败不会把应用搞崩。**Worktree 操作在客户机内部运行。如果某个操作失败(目录消失了、不是 git 仓库、tmux 卡了一下),你会得到一条日志记录和工作区窗口上一个非阻塞的浮层,而不是一个冻结其他一切的模态框。
两种隔离,一个工作流
Worktree 和 VM 解决的是同一个问题的不同两半。Worktree 隔离仓库状态,于是并行的智能体不会破坏彼此的工作。VM 隔离其他一切,从文件系统到网络再到凭据,于是你可以让这些智能体无人值守地运行。Bromure Agentic Coding 把两者组合在一起:输入一个任务名、挑一个智能体,就能得到一个独立分支、一个独立检出和一台独立机器,全都藏在一个标签页背后。
整个流程深不过三次按键:⇧⌘G 委派任务,一个绿点表示完成,⇧⌘M 合并。剩下的就是 git,那种无聊而可靠的东西。
Worktree 需要 Bromure Agentic Coding 4.0.8 或更高版本。Bromure Agentic Coding 作为 Bromure 的一部分发布——在 bromure.io/download 下载它。Worktree 支持还需要一个运行着当前 VM 内智能体的工作区,所以旧的工作区要重启一次以启用它。