← 博客

用法约 3 分钟

在同一个仓库里同时跑两个编程智能体

同一份检出上跑两个 Claude Code 或 Codex 会话,改动会互相覆盖。用 git worktree,每条 Mirasim 会话都能起在自己的 worktree 里。

Mirasim 的一个会话,带着它所在工作区的文件树和编辑器Mirasim 的一个会话,带着它所在工作区的文件树和编辑器

两个智能体共用工作树时实际会出什么问题

在同一个仓库里运行一个编程智能体已经不成问题,但同时运行两个就会出乱子。两个智能体操作同一份工作树,却不知道对方的存在,改动会混在一起。整个过程不会报错,但结果比报错更隐蔽、更棘手:你最后会拿到一份哪个智能体都没打算写成、也没人解释得清来源的 diff。

  1. 智能体 A 正在修改文件

    两个智能体共用同一个工作树目录

  2. 智能体 B 切换了分支

    智能体 B 也可能把智能体 A 刚改写的文件加进暂存区

  3. 测试读到改了一半的代码

    两边的改动混在一起,但 Git 不会报错

  4. 得到谁都没打算做出的 diff
给每个智能体各克隆一份仓库
重复复制历史,且互相看不到分支
让多个智能体排队依次运行
失去了同时用两个智能体的意义
叮嘱智能体「只准改这几个」
没有强制力,智能体随时会越界

在同一个仓库里跑两个智能体时,分别克隆仓库、排队运行或口头约定文件范围这三种常见绕法,实际效果都比看起来更糟。

Linked worktree:让一个仓库拥有多份独立检出

Git 从 2.5 版本起就提供了解决办法。运行 git worktree add 会创建另一个工作目录,背后共用同一个对象库和同一套引用——它只是第二份检出,而不是第二个仓库。每份 worktree 都在独立的分支上,拥有各自的索引和 HEAD,因此分别在两份 worktree 里改代码的两个智能体看不到对方未提交的改动,不会把对方的文件加进暂存区,也切不动对方的分支。

同一个底层 Git 仓库所有 worktree 共享对象、历史、远端和所有分支
  • ../feature-a
    1. 检出在独立分支 feature-a 上的工作树
    2. 拥有独立的暂存区索引和 HEAD
    3. 智能体 A 在这里独立修改代码
  • ../feature-b
    1. 检出在独立分支 feature-b 上的工作树
    2. 拥有独立的暂存区索引和 HEAD
    3. 智能体 B 在这里独立修改代码
两份 worktree 共享复制最贵的部分,A 能从 B 一小时前推送的代码起分支,两份 diff 也能对照同一基线审阅。
你也可以在终端里手动运行命令,为两个编程智能体分别创建独立的 worktree 和分支来实现隔离。
# one repository, two checkouts, two branches
git worktree add ../feature-a -b feature-a
git worktree add ../feature-b -b feature-b

# each has its own HEAD and index; the objects are shared
git worktree list

为什么 Mirasim 把 linked worktree 内置到会话里

手动管理 worktree
使用 Mirasim 会话
创建独立的 worktree
为每个分支手动执行 git worktree add
选好基线分支,会话直接启动在独立的 worktree 里
分辨当前所在的分支与目录
要靠你自己记住哪个终端对应哪个分支和目录
面板展示该 worktree 的文件、终端、diff 和提交
智能体之间如何隔离
靠口头规定让智能体自觉不碰其他目录,随时可能越界
每个面板对应独立的 worktree 目录,天然互不干扰
合并多个智能体的改动
由你在审阅完 diff 后手动合并分支
仍然由你在审阅完各面板的 diff 后手动合并
手动管两个分支还行,管六个就太繁琐;而在 Mirasim 里,多条会话可以同时在各自的 worktree 中独立运行。

Mirasim 里的并行会话是指多个编程智能体同时运行、各自处理独立的任务,而不是由一个编排器把同一个任务拆给多个下属去执行。系统不会跨面板替你做任务规划,也不会自动合并它们生成的代码。合并代码这件事仍然由你在审阅时对照面前的几份 diff 亲自完成。

接着读