Claude Code 并行与自动化:worktree、子代理与 headless
Posted on Tue 29 September 2026 in AI 编程 • Sucre Liu
并行的前提是隔离
想同时干两件事,先要保证它们不会互相踩脚。Claude Code 里"并行"有好几种,代价和适用场景完全不同。挑错方式,轻则白忙,重则两个会话改同一堆文件、冲突修到崩溃。
先给结论,再展开:
| 方式 | 隔离粒度 | 适合 |
|---|---|---|
| Subagent | 上下文隔离,同一工作目录 | 一个会话内的侧任务 |
| git worktree | 文件系统隔离,独立分支 | 多个独立会话并行 |
| agent view | 管理多个后台会话 | 同时盯着好几件事 |
| agent teams | 多会话协同、可互相发消息 | 大任务拆分与协调 |
| dynamic workflow | 脚本编排大量子代理 | 代码库级审计、大迁移 |
worktree:并行会话的正统解法
一个 git worktree 是共享仓库历史、但有自己工作目录和分支的独立检出。每个会话一个 worktree,改动就永远不会串。
claude --worktree feature-auth
默认会在仓库根目录的 .claude/worktrees/<name>/ 下创建,开一个新分支 worktree-<name>。另开一个终端换个名字,就是第二个隔离会话:
claude --worktree fix-issue-456
几条必读的规则:
- 把
.claude/worktrees/加进.gitignore,否则这些目录会在主检出里显示为未跟踪文件。 - worktree 是干净检出,
.env之类的未跟踪文件不会自动带过去。要带,在项目根放一个.worktreeinclude(.gitignore语法,且只复制同时命中且被 gitignore 的文件):
text
.env
.env.local
config/secrets.json
- 退出时它会检查 worktree 里有没有未提交的改动:干净就自动删(具名会话会先问),有改动就问你留还是删。
- 想从某个 PR/MR 起头:
claude --worktree "#1234"(记得加引号,#会被 shell 当注释)。
基础分支默认是远程默认分支(worktree.baseRef: "fresh")。如果子代理需要在你当前未推送的工作上操作,把它设成 "head":
{
"worktree": {
"baseRef": "head"
}
}
在会话内拆分:subagent 与它的 worktree
不是所有并行都要开新终端。一个"研究一下 X"的侧任务,用 subagent 更轻——它在独立上下文里跑,主会话只收摘要,工作目录共享也无所谓,因为它多半只读。
如果需要它改文件且要和其他工作并行,就让 subagent 也带 worktree。两种开法:
- 在提示里说"用 worktree 跑你的 agents";
- 给自定义 subagent 加 frontmatter:
```markdown
name: refactorer description: 对大量文件做机械式重构 isolation: worktree
对每个受影响的文件应用指定重构,然后运行测试并汇报结果。 ```
每个 subagent 的临时 worktree 在它无改动结束时自动清理;有改动则留在磁盘上,等周期性清扫在安全时移除。
这里有个容易忽略的坑:进入 worktree 后,钩子里的 ${CLAUDE_PROJECT_DIR} 仍指向主检出,而钩子输入 JSON 里的 cwd 才是 worktree 根。写依赖路径的钩子时要用对字段。
headless:把它当成一个命令
交互式会话适合探索,流水线需要的是"输入提示、输出结果"。-p(print)模式就是干这个的:
claude -p "运行测试套件并总结失败项" \
--permission-mode dontAsk \
--allowedTools "Bash(npm test)" "Read"
要点:
-p时进程跑完就退出,适合脚本调用;--permission-mode dontAsk只放行预先批准的工具,其余一律拒绝——这正是 CI 想要的语义;--allowedTools精确到命令,别用宽泛的Bash(*);- 需要结构化结果时用
--output-format(如 JSON/流式),方便下游程序解析。
把这两条经验记住:CI 里不要用 bypassPermissions,用 dontAsk + 精确 allowlist;需要交互式审批的动作在无人值守环境里应当被拒绝,而不是被放行。
接进代码托管平台
Claude Code 能接进 GitHub Actions 一类流水线,常见用法是响应评论里的 @claude、把 issue 转成 PR、以及自动化的 PR 审查。原则和 headless 一样:最小权限 + 明确触发。它需要有仓库读权限、评论/PR 写权限,以及对应的 API 凭据;这些在 CI 里都该走 secrets,不要硬编码。
定时任务同理:有的形态在本地会话里用调度工具反复运行一个提示(比如轮询状态),有的在云端按计划/事件触发。前者适合"本机上的周期性检查",后者适合"仓库级、离线的例行任务"(每日代码审查、依赖审计)。别把需要你实时判断的事做成定时任务。
后台与协同
当你同时有多个会话在跑,管理它们本身成了问题:
- agent view:一屏看清每个会话在干什么、哪个在等你输入。适合"派出去几件事,隔一会儿回来收"。
- agent teams:多个 Claude 会话作为团队协同,有共享任务和会话间消息,能做集中管理。
- cross-session messaging:让你的会话之间互相传结论——比如 A 会话改了一个接口,直接通知 B 会话"你依赖的那个变了"。
这里有个判断标准:需要人和多个会话来回切,还是会话之间自己协调? 前者用 agent view,后者用 teams / messaging。
dynamic workflow:再大一号
当一件事"超过一把子代理能搞定"的量级,比如全库审计、大迁移、或需要多路交叉验证的调研,就用 dynamic workflow——它由 Claude 写一个脚本、编排大量子代理在后台跑,最后返回一个结果。和 subagent 的区别在于谁决定下一步:subagent 是模型逐轮决定,workflow 是脚本决定。
不要为了炫技上 workflow。先问:这件事需要多路交叉验证吗?需要跑几十个并行单元吗?都不是,就用普通 subagent。
一个可复制的并行节奏
把上面的东西串成一个日常:
- 主会话负责需要你盯着的那件事;
- 顺手能独立完成的小事先
Esc出去,用claude --worktree xxx另起一个; - 会话里"读一堆文件找结论"的侧任务丢给 subagent;
- 收工时用 agent view 统一看一遍哪个卡住了、哪个等你拍板;
- 需要长期自动跑的(每日审查)交给 CI / 定时任务,用
dontAsk+ 精确权限。
小结
- 并行先隔离:会话级并行用 worktree,任务级拆分用 subagent。
- worktree 记得配
.gitignore和.worktreeinclude,注意${CLAUDE_PROJECT_DIR}不跟着走。 - CI 用
-p+dontAsk+ 精确allowedTools,不要开 bypass。 - 多个会话用 agent view 管理,会话间协作用 teams / messaging;超大规模的编排用 dynamic workflow。
下一篇收尾:会话管理(resume / branch / rewind)、成本控制,以及我踩过和见过的那些坑。