D10 的 subagents 解决「工作怎么拆」,今天解决「文件怎么不打架」:worktree 给每个并行会话一份独立的文件副本,agent view 则是这些会话的总控台——谁在跑、谁在等你、谁完工了,一眼看清。
为什么这天学这个
D10 讲了 subagents:把一个任务拆给多个 agent 并行推进,那是「工作的并行」。但只要它们都在同一个工作目录里写文件,并行就有天花板——两个会话同时改同一个文件,后写的覆盖先写的。本课补上另一个维度,「文件的并行」:官方官方文档明确把几种并行方式分了工——worktree 负责隔离文件改动,subagents 和 agent teams 负责组织工作本身,两者可以叠加使用。
这课也是 D12 agent teams 的地基:多个会话协同的前提是各有各的地盘。而当后台会话多起来,你需要一个面板看住它们——这就是本课第二个主角 agent view。学完想直接上手多会话并行的完整套路,可接着读 Tip B2:用 worktrees 跑并行会话,以及 Tip B1:多会话还是多 agent。
概念讲清楚
git worktree:一个仓库,多张工作台
官方git worktree 是一个独立的工作目录:有自己的文件和自己的分支,但和主 checkout 共享同一份仓库历史和远程。每个 Claude Code 会话跑在自己的 worktree 里,一个会话的编辑就永远碰不到另一个会话的文件——一边开发新功能,另一边同时修 bug。
本站观点类比:仓库的 .git 是图书馆的馆藏,主 checkout 是你常坐的那张阅览桌。worktree 就是多摆几张桌子,每张桌子摊开不同分支的文件——桌面互不干扰,但书都借自同一个馆藏,还书(commit)也都归回同一个馆藏。
误区:worktree 不是 clone
本站观点常见误解是「worktree 就是再 clone 一份」。区别在共享什么:clone 出来的是另一个完整仓库,历史独立,要靠 push/pull 来回同步;worktree 只复制工作文件,官方它里面的 git 命令直接写入主仓库共享的 .git 目录,所以在 worktree 里 commit,主 checkout 立刻能看到那个分支——合并回主分支就是一次本地 merge 或一个 PR,不存在「跨仓库搬运」。除了 .git,worktree 还和主 checkout 共享项目级 plugins 和已保存的权限批准(「Yes, don't ask again」写回主 checkout 的 .claude/settings.local.json,全仓库生效)。
用 --worktree 开一个隔离会话
官方带 --worktree(缩写 -w)和一个名字启动,Claude Code 就创建 worktree 并直接在里面开会话。默认位置在仓库根的 .claude/worktrees/<name>/,新分支名为 worktree-<name>;省略名字会自动起一个(如 bright-running-fox)。在另一个终端换个名字再跑一次,就有了第二个互不干扰的会话。
claude --worktree feature-auth # 终端 1
claude --worktree bugfix # 终端 2,与终端 1 完全隔离
官方几个常用配套:把 .claude/worktrees/ 加进 .gitignore,免得 worktree 内容在主 checkout 里显示成未跟踪文件;worktree 是全新 checkout,.env 这类被 gitignore 的文件默认不在里面,在项目根加一个 .worktreeinclude 文件(gitignore 语法)可让它们被自动复制进每个新 worktree;新 worktree 默认从仓库默认分支(通常 main)切出,把设置 worktree.baseRef 改成 "head" 则从你当前 HEAD 切出、带上未推送的工作;claude --worktree "#1234" 直接从某个 PR 切出。会话中途也可以口头让 Claude「work in a worktree」,它会用 EnterWorktree 工具建一个。桌面版 app 里每个新会话天然就在自己的 worktree 中。
清理与合并
官方退出交互式 worktree 会话时,Claude 会检查里面有没有「删掉就丢」的东西(改动、未跟踪文件、新 commit):
- 干净 + 未命名会话:自动删除 worktree 和分支;命名过的会话会先问你,方便留着以后回来。
- 有工作:询问保留还是删除。保留则目录和分支都在,之后可回来继续;删除则连工作一起删。
-p非交互跑的:没有退出询问,不会清理,自己用git worktree remove删。
本站观点「合并」没有专门命令,因为不需要:工作都在 worktree-<name> 分支上,且历史共享,回主 checkout 直接 git merge worktree-<name>,或推分支走 PR,和平时合并任何分支一样。
官方subagent 也能各领一个 worktree:对 Claude 说「use worktrees for your agents」,或在自定义 subagent 的 frontmatter 里写 isolation: worktree 固定下来(承接 D10)。subagent 的临时 worktree 用完没改动就自动删;有改动的留在盘上,由一个周期清扫按 cleanupPeriodDays 设置回收——清扫会跳过仍有工作的,也永远不碰你用 --worktree 亲手开的。
agent view:所有后台会话,一屏总览
官方agent view 用 claude agents 打开,是所有后台会话的一块屏幕:什么在跑、什么在等你输入、什么已完成。每一行是一个完整的 Claude Code 会话,由一个独立的 supervisor 进程托管,不需要终端挂着也持续运行。会话按状态分组,「Ready for review」(已开 PR)和「Needs input」排最上面;行首图标的颜色与动画表示状态:动画=在干活,黄=等你输入,绿=完成,红=失败。行内的一句话摘要由 Haiku 级模型生成,会话开了 PR 时行尾还会出现按状态着色的 #1234 标签。注意它目前是 research preview,需要 Claude Code v2.1.139 以上,界面和快捷键可能变化。
官方核心操作一圈:在底部输入框敲一句任务按 Enter 就派发一个新后台会话(每敲一句都是新会话,可以连发几个并行);选中某行按 Space 打开 peek 面板看它最近的输出或正在问的问题,直接打字回复;按 Enter 或 → attach 进入完整对话,空输入框按 ← detach 回列表;Esc 退出 agent view,会话照常在跑。已有的前台会话用 /bg(或空输入框按 ←)丢进后台;shell 里 claude --bg "任务" 直接派发,配 claude attach / logs / stop / rm <id> 从命令行管理。两个限制:每个后台会话都独立消耗订阅额度,并行十个就十倍速烧;会话跑在本机,休眠可存活,关机即停。
两者怎么扣在一起
官方agent view 的文件隔离正是靠 worktree:每个后台会话从你的工作目录启动,但动手改文件之前会自动移进 .claude/worktrees/ 下自己的 worktree——并行会话读同一份 checkout,写各写各的。已经身在某个 worktree 里、或目录根本不是 git 仓库(且没配 WorktreeCreate hook)时跳过;想彻底关掉,把项目设置里的 worktree.bgIsolation 设为 "none"。后台会话在 worktree 里改完代码,收尾时会主动保全工作:不问自 commit,仓库有远程就推分支,任务需要时开 draft PR;但绝不 push 到 main/master、不 force-push、不 merge,而且 CLAUDE.md 或任务里你自己的 git 约定优先。在 agent view 里按两次 Ctrl+X 删除会话会连它的 worktree 一起删(未提交的改动也没了),不过有未推送 commit 的 worktree 永远不会被删。
当天能做完的实操
需要一个 git 仓库项目。全程约 25 分钟。
- 跑
claude --version确认版本(agent view 需要 v2.1.139+;本站写作时最新为 2.1.222)。如果这个项目还没跑过 Claude,先在项目根跑一次claude接受 workspace trust,否则--worktree会报错退出。 - 把
.claude/worktrees/加进项目.gitignore。预期:后面开的 worktree 不会污染主 checkout 的git status。 - 跑
claude --worktree demo。预期:会话在.claude/worktrees/demo/里启动,分支是worktree-demo。 - 把下面的 prompt 原样粘贴给它,让它自证隔离:
你现在应该在一个 git worktree 里。请依次:
1. 运行 pwd 和 git branch --show-current,告诉我当前目录和分支;
2. 在 README.md 末尾加一行「worktree 隔离测试」,commit 到当前分支,不要 push;
3. 运行 git worktree list,用一句话解释输出里主 checkout 和当前 worktree 的关系。
- 另开一个终端,在主 checkout 跑
git status和git worktree list。预期:主 checkout 干净、README 没变,但git worktree list列出两行——隔离与共享同时得到验证。 - 退出 worktree 会话。预期:因为里面有新 commit,Claude 询问保留还是删除;选保留。然后在主 checkout 合并并清理:
git merge worktree-demo,再git worktree remove .claude/worktrees/demo。 - 体验 agent view:跑
claude agents,在底部输入框敲一个小任务(如「总结这个仓库的目录结构」)按Enter。预期:出现一行,图标动画表示 Working;按Spacepeek 它的进展,按Enterattach 进完整对话,空输入框按←回列表。完成后按两次Ctrl+X删掉这行(记住:它的 worktree 会一起删)。
验收标准
- 能不看笔记说清 worktree 和 clone 的区别:哪些是隔离的(文件、分支、目录),哪些是共享的(
.git历史、远程、plugins、权限批准)。 - 实操跑通:
--worktree会话里 commit 后,主 checkout 立即能 merge 该分支;退出时见到了清理询问。 - 能说出后台会话什么时候自动进 worktree、什么时候跳过,以及 agent view 里删除会话对 worktree 意味着什么。
- 自测题:你用
claude -p --worktree ci-run跑了个一次性任务,结束后这个 worktree 还在吗?怎么清掉?(答案:在——非交互运行没有退出清理,需自己git worktree remove。)