Claude Code 学习站

Claude Code Worktree 并行会话全指南:`--worktree` 隔离与子代理协同

通过 `--worktree` 标志让多个 Claude Code 会话在独立 git worktree 中并行运行,实现文件级隔离;涵盖基础分支选择、gitignored 文件复制、子代理隔离、自动清理及非 git VCS 扩展。

本页目录8
要点速览
  • `claude --worktree <name>` 在独立分支和目录中启动 Claude,多终端并行编辑互不干扰
  • `.worktreeinclude` 文件声明哪些被 gitignore 的本地配置(如 `.env`)需自动复制进每个新 worktree
  • 子代理可通过 `isolation: worktree` frontmatter 或口头指令在独立 worktree 中并行运行,消除文件冲突
  • 会话退出时无变更自动清理(命名会话则改为提示保留),有变更则提示保留;非交互式 `-p` 模式需手动 `git worktree remove`
  • 可通过 `WorktreeCreate` / `WorktreeRemove` hooks 支持 SVN、Perforce 等非 git 版本控制系统

本文是对官方文档《Run parallel sessions with worktrees》的中文要点摘要,完整内容以原文为准。原文链接:https://code.claude.com/docs/en/worktrees

什么是 Worktree 及为何使用

git worktree 允许同一个仓库拥有多个独立的工作目录,各目录拥有独立文件和分支,但共享同一份历史与远端。在 Claude Code 中,每个会话运行在独立 worktree 里,不同终端的编辑互不干扰——可以在一个终端开发新功能,同时在另一个终端修复 Bug,两者完全隔离。

桌面版 Claude Code 为每个新会话自动创建 worktree;本文重点介绍 CLI 的手动用法。

启动 Worktree 会话

使用 --worktree(简写 -w)标志启动 Claude,自动创建隔离 worktree:

claude --worktree feature-auth

默认情况下,worktree 创建于仓库根目录的 .claude/worktrees/<name>/,同时新建名为 worktree-<name> 的分支。省略名称时 Claude 自动生成(如 bright-running-fox)。在会话进行中也可以直接告诉 Claude「在 worktree 中工作」,Claude 会调用 EnterWorktree 工具创建一个新的 worktree;进入某个 worktree 后,可通过 EnterWorktree 传入目标路径,直接切换到 .claude/worktrees/ 下的其他 worktree,原 worktree 在磁盘上保持不变。

建议:将 .claude/worktrees/ 加入 .gitignore,避免 worktree 内容出现在主检出的未跟踪文件列表中。

首次在某目录使用 --worktree 前,需先运行一次 claude 接受工作区信任对话框;非交互式 -p 模式跳过信任检查,可直接使用 claude -p --worktree

指定基础分支

默认从 origin/HEAD(远端默认分支)创建 worktree,起点干净;若未配置远端或拉取失败,则回退到当前本地 HEAD。若需始终从本地 HEAD(含未推送提交)分支,可在 settings 中配置:

{
  "worktree": {
    "baseRef": "head"
  }
}

baseRef 只接受 "fresh"(默认)或 "head" 两个值,不支持任意 git ref。也可传入 PR 编号(前缀 #)或完整 GitHub PR URL 直接检出对应拉取请求,worktree 创建于 .claude/worktrees/pr-<number>

claude --worktree "#1234"

复制被 gitignore 的文件

Worktree 是全新检出,.env.env.local 等未跟踪的本地文件默认不存在。在项目根目录创建 .worktreeinclude 文件(语法同 .gitignore),即可在创建 worktree 时自动复制指定文件:

.env
.env.local
config/secrets.json

只有「匹配规则 已被 gitignore」的文件才会被复制,已跟踪文件不会重复。此机制同样适用于子代理 worktree 和桌面版并行会话。

子代理 Worktree 隔离

多个子代理并行运行时,可让每个代理拥有独立 worktree 来避免文件冲突:

  • 临时:对话中告诉 Claude「为你的代理使用 worktree」
  • 永久:在自定义子代理的 frontmatter 中添加 isolation: worktree

每个子代理获得一个临时 worktree,完成后若无变更则自动删除。子代理 worktree 使用与 --worktree 相同的基础分支配置。

清理机制

场景行为
无未提交变更、无未跟踪文件、无新提交自动删除 worktree 及其分支;但若会话已命名,则改为提示,便于保留以备后用
有未提交变更、未跟踪文件或新提交提示保留或删除(删除会丢弃所有未提交变更、未跟踪文件及提交)
非交互式(-p)模式不自动清理,需手动运行 git worktree remove

Claude 为子代理及后台会话创建的 worktree,在超过 cleanupPeriodDays 设置的天数、且无未提交变更、无未跟踪文件、无未推送提交时自动清理。代理运行期间 Claude 执行 git worktree lock 防止并发清理,完成后释放锁。强制删除含未提交变更或未跟踪文件的 worktree 时需加 --force

注意:通过 --worktree 手动创建的 worktree 不受自动清理扫描影响,只有子代理及后台会话的 worktree 才会被自动扫描清理。

手动管理 Worktree

需要精确控制 worktree 位置或分支时,可直接用 git 命令操作:

# 新建分支并创建 worktree
git worktree add ../project-feature-a -b feature-a

# 从已有分支创建
git worktree add ../project-bugfix bugfix-123

# 在 worktree 中启动 Claude
cd ../project-feature-a && claude

# 列出所有 worktree
git worktree list

# 完成后删除
git worktree remove ../project-feature-a

注意:每个新 worktree 需独立初始化开发环境(安装依赖、配置虚拟环境等)。

非 git 版本控制系统

对于 SVN、Perforce、Mercurial 等,可配置 WorktreeCreateWorktreeRemove hooks 完全替代默认的 git 逻辑。Hook 从 stdin 读取 worktree 名称,完成自定义检出后将目录路径打印到 stdout,Claude Code 将其作为会话工作目录。

使用 hooks 时 .worktreeinclude 不会自动处理,需在 hook 脚本内手动复制本地配置文件。官方提供了 SVN svn checkout 的完整示例,配合 WorktreeRemove hook 可实现完整的创建与清理闭环。详细输入 schema 见官方 hooks 参考文档。