Claude Code 多开:用 git worktree 同时跑多个 AI
想在同一个仓库里同时开好几个 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 的各条线,每条行尾一个状态标记](/media/app/start-page-zh-light.webp)
为什么不直接在同一个目录里开两个 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 跟踪的文件。
- 依赖不会跟过去。
node_modules、target/、.venv这些都在.gitignore里,每个 worktree 都得自己装一遍、编一遍。磁盘空间和首次编译时间要算进去。 - 本地配置也不会跟过去。
.env之类被忽略的配置文件,要手动复制或软链到每个 worktree。 - 一个分支只能在一个 worktree 里签出。
git worktree add报「分支已经被签出」时,换个新分支名就行。 - 端口会冲突。 两个 worktree 各起一个 dev server,默认端口会撞,得改掉其中一个。
- 目录越堆越多。 直接
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。

看改了什么: 开始页的「看改动」直接在中间打开 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 |
开始页 + 侧栏行尾标记 |
| 两边改了同一个文件 | 合并时才知道 | 两边都改了就标出来 |
一套能撑到五个会话的工作流
- 主目录始终签出
main(或你的默认分支),不让 AI 在这里干活; - 一个任务 = 一个 worktree = 一个分支,分支名照任务起;
- 给每个 agent 的提示词写清它负责哪些文件、哪块功能;
- 合并前把分支和
main对比一遍,合完删掉 worktree; - 勤合并。两条分支活得越久,差得越远。
常见问题
最多能同时开几个 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 月)。