Claude Code 多开:用 git worktree 同时跑多个 AI

· DobbyLab · claude-codegit-worktreeparallel-agents

想在同一个仓库里同时开好几个 Claude Code,最稳的做法是每个会话一个 git worktree。worktree 是同一个仓库的另一份工作目录,签出自己的分支,但和主目录共用同一份 .git 历史。用 git worktree add ../myapp-fix-login -b fix-login 建一个,进去跑 claude,每个任务重复一遍,几个 AI 就能各改各的、各跑各的测试,谁也不会覆盖谁的文件。

原理就这么简单。下面讲实际要敲的命令、第一周最容易踩的坑,以及 gtree 怎么把这些重复操作省掉。

gtree 中 export-pdf 这条线的开始页:「1 个提交还没推送 [推送]」「MR #42 未合并 [打开 MR]」「比 main 落后 4 个提交 [变基到 main]」;左侧侧栏列着 nimbus-notes 的各条线,每条行尾一个状态标记
在侧栏选一条线,开始页告诉你下一步做什么

为什么不直接在同一个目录里开两个 Claude Code?

能开,只问问题不改代码的话也没事。可两个会话一旦都开始改文件,就是在共用一个没有任何隔离的工作目录:

  • 会话 A 刚改完 auth.ts,会话 B 拿着之前读到的内容又改了一遍;
  • A 改到一半编译不过,B 跑的每次测试都跟着失败,B 却不知道原因;
  • 到提交的时候,两个任务的改动搅在同一份 diff 里,拆都拆不开。

光靠分支解决不了,因为一个目录同一时间只能签出一个分支。worktree 可以:每个 worktree 都是一个真实的目录,有自己的分支、自己的未提交改动、自己的编译产物,而提交、分支、远程仓库全部共用。

怎么用 git worktree 给 Claude Code 分开工作区?

在主目录里执行:

# 1. 在仓库旁边建一个 worktree,同时新建分支
git worktree add ../myapp-fix-login -b fix-login

# 2. 进去启动 Claude Code
cd ../myapp-fix-login
claude

再开一个终端,给下一个任务也来一遍:

git worktree add ../myapp-search -b search-box
cd ../myapp-search
claude

常用的几条命令:

命令 作用
git worktree list 列出所有 worktree 的路径、提交和分支
git worktree add <路径> -b <新分支> 新目录 + 新分支
git worktree add <路径> <已有分支> 新目录,签出一个已有的分支
git worktree remove <路径> 删掉这个 worktree(有未提交改动时会拒绝,加 --force 强删)
git worktree prune 清理已经被手动删掉目录的 worktree 记录

任务做完,照常合并或者提 MR / PR,再把 worktree 删掉。

git worktree 有哪些坑?

大部分麻烦都来自一点:新 worktree 里只有被 git 跟踪的文件。

  1. 依赖不会跟过去。 node_modules、target/、.venv 这些都在 .gitignore 里,每个 worktree 都得自己装一遍、编一遍。磁盘空间和首次编译时间要算进去。
  2. 本地配置也不会跟过去。 .env 之类被忽略的配置文件,要手动复制或软链到每个 worktree。
  3. 一个分支只能在一个 worktree 里签出。 git worktree add 报「分支已经被签出」时,换个新分支名就行。
  4. 端口会冲突。 两个 worktree 各起一个 dev server,默认端口会撞,得改掉其中一个。
  5. 目录越堆越多。 直接 rm -rf 删目录的话,git 还记着它,要跑一次 git worktree prune。

都不是大问题,只是每次都得记着。

真正的麻烦:五个终端,你盯不过来

环境搭好以后,新的问题才出现。五个 agent 开在五个终端标签里,意味着:

  • 哪个在等你授权,得一个个标签翻过去才知道;
  • 哪个已经做完了、该你验收,也不知道;
  • 哪个 worktree 在哪个分支、离 main 差多少,慢慢就记不清了;
  • 两个 agent 可能在不同 worktree 里改同一个文件,要到合并时才发现。

tmux 这类工具能把窗口排整齐,但它不知道窗口里的 agent 在干什么。gtree 补的就是这一层。

gtree 怎么管多个 Claude Code

gtree 是一个围绕 worktree 设计的 macOS 原生应用,现在支持 Claude Code 和 Codex(最先支持、集成最深的是 Claude Code)。打开仓库,所有 worktree 都会出现在侧栏的项目下面,包括你在命令行里建的。点一条,就进到它的主页:开着会话就是对话,没有会话就是这条线的开始页,告诉你下一步该做什么。

建 worktree: 在侧栏右键任意一条线,选「新建 worktree…」,输入分支名。gtree 替你执行 git worktree add,新目录放在仓库旁边,命名为「<仓库名>-<分支名>」。「删除 worktree…」在同一个右键菜单里,会先让你确认;分支合并过的线,开始页直接给出「删除 worktree」按钮。

在里面跑 agent: 在开始页点「新开 Claude Code」,或者按 ⌘T(装了 Codex 的话可以选用哪个)。gtree 的内嵌终端里跑的就是真正的 agent CLI,和你在 iTerm 里用的 Claude Code、Codex 完全一样:/ 命令、plan mode、授权确认、MCP 都在。同一个 worktree 也可以开好几个会话。只是点进来看看的话,不会自动起会话。

一眼看清每个会话: 在设置里连上 Claude Code(或 Codex)之后,侧栏每条线的行尾只放一个状态标记:紫色转圈 = 它的 agent 在干活,红色铃铛一闪一闪 = 在等你。悬停能看详情。不用读字,找红铃铛就行。下一篇会细讲。

每条分支的状态: 开始页只列要处理的事,每种状况一行,各带一个按钮:

开始页上写的 按钮
这条分支已经合并了 删除 worktree / 换一条新分支
N 个文件别处也在改 看是哪些
N 个文件没提交 看改动
远端有 N 个新提交 拉取
N 个提交还没推送 推送
变基后和远端的这条分支不一致了 推送(覆盖远端)
MR #N 未合并 / 还没有 MR 打开 MR / 创建 MR
比 main 落后 N 个提交 变基到 main

没有要处理的事时,开始页会显示「这条线是最新的,没有要处理的事」。侧栏里每条分支后面还有 MR 状态:MR 开着是一个 MR 图标,合并后变成浅色的合并图标。数据来自你本机已经登录的 glab 或 gh,GitHub、GitLab(包括自建)都行。完整的 Git 菜单(提交、拉取、推送、变基、切分支等)在右键菜单里,所有写操作走你自己机器上的 git,SSH key 和 hook 照常生效。所有分支的全貌在「提交历史」(⌘3)里:每条分支一条泳道,标着它签出在哪个 worktree。

「提交历史」(⌘3):最上面是 AI 检查点,下面每条分支一条彩色泳道,比如 feat/export-pdf、refactor/api-retry、fix/login、feat/search
「提交历史」(⌘3):所有分支画在一张图里,每条分支一条泳道

看改了什么: 开始页的「看改动」直接在中间打开 diff,左边是改了的文件,右边是内容。合并前想审整条分支,「提交历史 › 对比」默认就是「主分支 → 当前 worktree」,不用敲 git diff。

撞车提醒: 两个 worktree 改了同一个文件,(那条线上没有会话状态图标时)侧栏行尾会出现琥珀色 △;开始页一定会写明有几个文件别处也在改,点「看是哪些」列出来;两边都还没提交的,还会出现在「待处理」的「也许要留意」里。同一个 worktree 里做得更多:两个 agent 要改同一个文件时,会先知道对方的存在,还能互相留话、商量谁先改。具体怎么回事见两个 AI agent 改同一个文件。

手动 vs gtree

终端 + git gtree
建 worktree git worktree add ../x -b x 右键 →「新建 worktree…」
启动 agent 新标签里 cd + claude 开始页 → 新开会话(⌘T)
谁在等你? 挨个标签翻 侧栏铃铛 + 系统通知
分支状态 每个目录跑 git status / git log 开始页 + 侧栏行尾标记
两边改了同一个文件 合并时才知道 两边都改了就标出来

一套能撑到五个会话的工作流

  1. 主目录始终签出 main(或你的默认分支),不让 AI 在这里干活;
  2. 一个任务 = 一个 worktree = 一个分支,分支名照任务起;
  3. 给每个 agent 的提示词写清它负责哪些文件、哪块功能;
  4. 合并前把分支和 main 对比一遍,合完删掉 worktree;
  5. 勤合并。两条分支活得越久,差得越远。

常见问题

最多能同时开几个 Claude Code?

git 本身没有上限。实际受限于你的注意力、机器性能(每个 worktree 可能都要装依赖、编译)和你所用套餐的用量额度。

git worktree 和分支有什么区别?

分支是一串提交;worktree 是签出了某个分支的一个目录。一个目录同一时间只能签出一个分支,worktree 让你有好几个目录,各自签出自己的分支,共用同一份历史。

worktree 占磁盘多吗?

git 历史是共用的,一个 worktree 只多占签出文件的大小,再加上你在里面装的依赖和编译产物。大头通常是 node_modules 这类依赖目录。

不用 gtree 能用 worktree 跑 Claude Code 吗?

当然能,上面的命令只需要 git 和终端。gtree 省掉的是那些琐事:建 worktree、找到在等你的那个会话、发现两边改了同一个文件。

gtree 会替代 Claude Code 吗?

不会。gtree 在自己的终端里跑真正的 agent CLI(Claude Code 或 Codex),再读出它的状态。你的 Claude Code 配置、设置和订阅都原样不动。

gtree 本地功能免费、不用注册;gtree 不上传你的代码。在这里下载,打开你正在做的仓库,已有的 worktree 都会出现在侧栏里。

本文已按 gtree 0.3.14 更新(2026 年 10 月)。