ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Claude Code Worktree 工作流:多分支并行开发配置指南

Claude Code Worktree 工作流:多分支并行开发配置指南 1. 为什么单工作区跑 Claude Code 会越跑越乱如果你已经用 Claude Code 写过一段时间代码大概率遇到过这种场景手上正在写feature/payment的支付回调逻辑测试还没跑通产品突然说线上登录挂了要立刻修。你只能git stash把半成品存起来切到main拉一个fix/login-timeout修完提交、切回来、git stash pop然后发现 stash 里混进了刚才调试用的临时日志冲突还得手动解。这套流程本身没错但问题在于 Claude Code 是「跟着当前工作目录走」的。你在哪个目录启动它它就读哪个目录的代码、改哪个目录的文件。单工作区意味着同一时刻只能有一个分支处于「可被 AI 操作」的状态多任务并行时你其实是在反复打断 AI 的上下文也在反复打断自己的思路。Git Worktree 解决的正是这件事同一个仓库可以同时检出多个分支到不同目录每个目录是一份独立的工作区有独立的文件状态、独立的node_modules、独立的 Claude Code 会话。你在 A 目录让 Claude 改认证逻辑在 B 目录让它修 bug两边互不干扰谁也不用 stash。这篇聚焦的是「Claude Code Worktree 多分支并行开发」的落地配置怎么放 worktree、怎么写settings.json和config.toml骨架、怎么让所有 worktree 共用一条统一的 Key/API 通道接入 TaoToken最后给出验证并行任务隔离与切换是否真的生效的具体步骤。适合已经在用 Claude Code、但被多分支切换折磨过的开发者。2. 前置准备Worktree 目录规划与 TaoToken 统一通道2.1 Worktree 放哪里默认情况下git worktree add会把新工作区放在仓库同级目录比如my-project和my-project-feature-auth并排。这种布局在只有两三个 worktree 时还行一旦到五六个你的父目录就会被一堆my-project-xxx塞满找起来很烦。更推荐的做法是统一收进仓库内的隐藏目录比如.claude/worktrees/my-project/ # 主工作区通常停在 main ├── .git/ ├── .claude/ │ ├── settings.json │ └── worktrees/ # 所有 worktree 集中在这里 │ ├── feature-payment/ │ ├── fix-login-timeout/ │ └── review-pr-123/ ├── src/ └── package.json好处是路径可预测、便于加进.gitignore、清理时一眼能看全。注意.claude/worktrees/要写进.gitignore否则主工作区会把这些目录当成未跟踪文件。# 在主工作区执行 echo .claude/worktrees/ .gitignore mkdir -p .claude/worktrees2.2 为什么需要统一 Key/API 通道多 worktree 并行时每个目录都可能启动一个 Claude Code 会话。如果每个会话各自配一套 Key管理成本会迅速失控轮换要改 N 处、额度分散看不清、某个 worktree 里配错了还很难排查。更省心的方式是把模型访问收敛到一条统一通道所有 worktree 读同一份配置。TaoToken 提供的就是这样一个统一入口官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 。你只需要在 TaoToken 控制台创建一个 Key然后让所有 worktree 的配置都指向它。先去控制台拿 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到形如sk-xxxx的字符串后不要硬编码进任何提交到仓库的文件用环境变量注入。# 写进 ~/.zshrc 或 ~/.bashrc全局生效 export TAOTOKEN_API_KEYsk-你的key export ANTHROPIC_BASE_URLhttps://taotoken.net/api这样无论你在哪个 worktree 目录启动 Claude Code它读到的都是同一套环境变量Key 只有一份轮换时改一处即可。3. 可复制配置settings.json 与 config.toml 骨架3.1 .claude/settings.json 骨架Claude Code 的项目级配置放在.claude/settings.json。下面这份骨架覆盖了 worktree 目录、自动清理、以及模型通道三块可以直接抄{ worktree: { directory: .claude/worktrees, autoCleanup: true, maxAge: 7, autoCreate: { onNewBranch: true, onPRReview: true, prefix: wt } }, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: ${TAOTOKEN_API_KEY} }, permissions: { allow: [ Bash(git worktree:*), Bash(git status:*), Bash(git diff:*) ] } }几个字段说明一下。worktree.directory决定新 worktree 落在哪配合前面的目录规划填.claude/worktrees。autoCleanup和maxAge让 Claude Code 在启动时提示清理超过 7 天且已合并的 worktree避免目录越堆越多。autoCreate.onNewBranch表示当你让 Claude 开新分支时它顺手建一个对应 worktree不用你手动git worktree add。env里的${TAOTOKEN_API_KEY}是引用环境变量不是字面量。这样配置文件可以安全提交到仓库Key 留在本地环境里。注意ANTHROPIC_BASE_URL指向的是https://taotoken.net/api不带任何查询参数。3.2 config.toml 骨架如果你用的是支持 TOML 配置的客户端或工具链等价配置可以写成这样[worktree] directory .claude/worktrees auto_cleanup true max_age_days 7 [worktree.auto_create] on_new_branch true on_pr_review true prefix wt [api] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY timeout_seconds 120 [api.retry] max_attempts 3 backoff_seconds 2api_key_env表示从哪个环境变量读 Key和 JSON 版本思路一致。timeout_seconds给到 120 是因为并行跑多个 worktree 时某些请求可能排队超时太短会误报失败。3.3 手动创建 worktree 的命令自动创建之外你也可以手动建命令很直接# 基于 main 创建新分支并检出到指定目录 git worktree add -b feature/payment .claude/worktrees/feature-payment main # 检出一个已存在的远程分支用于审查 git worktree add .claude/worktrees/review-pr-123 origin/feature/new-api # 查看当前所有 worktree git worktree listgit worktree list的输出会列出每个工作区的路径、当前 commit 和分支这是后面验证隔离是否生效的关键命令。4. 验证请求确认并行隔离与切换真的生效配置写完不代表生效得实际验证。下面这套步骤我实测下来能覆盖「隔离」和「切换」两个核心点。4.1 验证多 worktree 文件隔离先建两个 worktree分别改同一个文件的不同部分看改动是否互不影响# 建两个 worktree git worktree add -b feature/auth .claude/worktrees/feature-auth main git worktree add -b feature/order .claude/worktrees/feature-order main # 在 auth 工作区改文件 cd .claude/worktrees/feature-auth echo // auth change src/services/common.ts git status # 回到主工作区看同一个文件 cd ../../.. git status预期结果feature-auth里git status显示src/services/common.ts被修改主工作区里git status显示干净那个文件没有任何改动。如果主工作区也显示被改说明你其实在同一个工作区操作worktree 没建对。4.2 验证 Claude Code 会话隔离在两个 worktree 目录分别启动 Claude Code让它们各自读当前目录的文件# 终端 1 cd .claude/worktrees/feature-auth claude # 在会话里问当前工作目录是哪个分支列出 src/services 下的文件 # 终端 2 cd .claude/worktrees/feature-order claude # 同样的问题两个会话应该分别报告feature/auth和feature/order列出的文件列表也各自独立。这一步验证的是 Claude Code 确实跟着工作目录走而不是共享某个全局状态。4.3 验证统一 Key 通道生效在任意一个 worktree 里发一条最小请求确认走的是 TaoToken 通道curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: 回复 OK 两个字母}] }返回体里能看到正常的content字段就说明通道通了。如果返回 401检查TAOTOKEN_API_KEY是否在当前 shell 里生效echo $TAOTOKEN_API_KEY如果返回 404检查ANTHROPIC_BASE_URL是不是写成了带路径的地址正确值是https://taotoken.net/api。4.4 验证切换与清理# 列出所有 worktree确认路径和分支对应 git worktree list # 删除一个已合并的 worktree git worktree remove .claude/worktrees/feature-auth # 如果目录被手动删了但引用还在修复引用 git worktree prunegit worktree remove成功后再git worktree list对应条目应该消失。如果提示「contains modified or untracked files」说明还有未提交改动加--force前先确认真的不要了。5. 本篇常见错排查5.1 worktree 目录被删引用失效手动rm -rf了某个 worktree 目录但git worktree list还显示它后续操作报fatal: not a valid object name。这是引用没清。执行git worktree prune它会清理所有指向不存在目录的引用。如果只想修某一个用git worktree repair .claude/worktrees/xxx。5.2 删除 worktree 时提示分支被占用git worktree remove报分支还在被使用通常是因为你还在那个目录里或者有进程占着。先cd出来再删。如果分支确实要保留先删 worktree 再单独处理分支git worktree remove .claude/worktrees/feature-auth git branch -d feature/auth # 已合并用 -d未合并用 -D5.3 每个 worktree 的 node_modules 缺失Worktree 是独立目录node_modules不会自动共享。新 worktree 里跑测试报模块找不到进目录装一次即可cd .claude/worktrees/feature-payment npm install如果嫌每个都装太慢可以用 pnpm 的全局 store 或 npm 的--prefer-offline能省不少时间。5.4 配置里 Key 没生效settings.json里写了${TAOTOKEN_API_KEY}但请求还是 401多半是环境变量没导出到启动 Claude Code 的那个 shell。检查顺序echo $TAOTOKEN_API_KEY有没有值 → 是不是在新开的终端里没 source 配置文件 → 是不是用了 sudo 导致环境变量丢失。确认后重新source ~/.zshrc再启动。5.5 并行请求偶发超时同时跑三四个 worktree 时个别请求超时。这通常是并发上来了把config.toml里的timeout_seconds调到 180retry.max_attempts调到 3基本能覆盖。如果还是频繁超时去 TaoToken 控制台看下当前额度与并发情况https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。6. 把通道固定下来再谈并行Worktree 的价值在于「隔离」而隔离要真正好用前提是每个隔离环境访问模型的方式是一致的、可预测的。如果每个 worktree 各配各的 Key、各写各的 base_url那隔离带来的清爽很快会被配置混乱抵消掉。所以我的建议是先把统一通道固定下来——一个 TaoToken Key、一个https://taotoken.net/api端点、一份环境变量所有 worktree 共用。接入细节可以对照文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Key 在 API Keys 页面管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。通道固定之后再往上叠 Worktree 的并行能力就顺了。如果你后面要让 Claude Code 长时间跑编码任务、或者挂 Agent 做多轮重构可以考虑 Coding Plan 这种更适合持续调用的方式https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先在对话里验证模型行为再接进 worktree用模型对话页试https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。最后补一个我踩过的坑.claude/worktrees/一定要在第一次建 worktree 之前就写进.gitignore。我有次忘了主工作区git status里冒出一堆 worktree 目录差点误提交。加进去之后主工作区永远干净git worktree list才是你唯一需要看的清单。
返回列表