ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Claude Code中英文系列教程:用 Git worktrees 在同一个项目里并行跑多个 Claude Code 的配置与验证

2026/10/4 18:59:45 拓冰建站 浏览量
Claude Code中英文系列教程:用 Git worktrees 在同一个项目里并行跑多个 Claude Code 的配置与验证 1. 同一仓库多任务并行时Claude Code 会话为什么会互相踩脚如果你已经在日常开发里用 Claude Code 帮忙写代码大概率遇到过这种场景手头一个功能还没写完线上突然报了个 bug 要紧急修同时还有个同事提的 PR 等着你 review。三个任务都指向同一个仓库但你只有一个工作目录。这时候常见的做法是git stash暂存当前改动切到 hotfix 分支改完再切回来。问题是 Claude Code 的会话是绑定在目录上的——你在my-project/里启动的 Claude Code它读的是这个目录的文件状态。一旦你切了分支Claude Code 之前建立的上下文里那些文件路径、代码内容全都变了它给出的建议可能直接对不上号。更麻烦的是如果你同时开两个终端窗口跑 Claude Code两个会话操作的是同一份工作目录A 会话改了src/api.tsB 会话读到的就是被改过的版本代码隔离完全无从谈起。我试过最笨的办法是git clone整个仓库到不同目录但这样每个副本都要重新npm install磁盘占用翻倍而且远程分支的同步还得手动处理。后来发现 Git 自带的 worktrees 功能正好解决这个问题它允许你从同一个仓库检出多个分支到不同目录每个目录有独立的工作区文件但共享同一份 Git 历史和远程连接。这意味着你可以在project-feature-a/里让 Claude Code 写新功能同时在project-bugfix/里让另一个 Claude Code 会话修 bug两边互不干扰。这篇文章会从零开始给出可复制的 worktree 创建命令、Claude Code 的启动参数、目录约定以及两个会话同时改不同分支后如何做合并前冲突检查的完整验证流程。适合已经在用 Claude Code 做日常开发、想提升多任务并行效率的工程师。核心检索词就是 Claude Code 配合 Git worktrees 实现并行会话与代码隔离下面所有操作都围绕这个场景展开。2. 前置准备TaoToken 接入与 Claude Code 环境确认在开始配置 worktrees 之前需要先确保你的 Claude Code 能正常调用模型。这里以 TaoToken 作为 API 接入层来说明它的 Base URL 是https://taotoken.net/api你需要先在控制台创建一个 API Key。打开浏览器访问 TaoToken 控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole注册或登录后进入 API Keys 页面点击创建新密钥。复制生成的 Key格式类似sk-xxxxxxxx。这个 Key 后面会写入 Claude Code 的配置文件。Claude Code 的配置方式取决于你用的版本。较新的版本支持通过环境变量或配置文件指定 Base URL 和 API Key。以 macOS/Linux 为例你可以在~/.claude/settings.json中写入以下内容{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的实际Key } }如果你用的是 Windows路径通常是C:\Users\你的用户名\.claude\settings.json内容格式一致。写入后保存Claude Code 启动时会自动读取这个配置。验证配置是否生效可以在终端执行claude --version确认版本号正常输出后进入任意一个 Git 仓库目录运行claude进入交互模式输入一句简单的测试指令比如「帮我看看当前目录下有哪些文件」如果 Claude Code 能正常返回结果说明 API 接入已经通了。这里有个细节需要注意Claude Code 的会话是绑定在当前工作目录的。你在哪个目录启动claude它就把那个目录当作项目根目录来读取文件。这正是 worktrees 能发挥作用的前提——每个 worktree 是一个独立目录所以在每个 worktree 里启动的 Claude Code 会话天然就是隔离的。另外如果你还没有安装 Claude Code可以通过 npm 全局安装npm install -g anthropic-ai/claude-code安装完成后claude命令就可以在任意目录使用了。确保你的 Node.js 版本在 18 以上否则可能遇到兼容性问题。3. 可复制配置worktree 创建、Claude Code 启动参数与目录约定这一节给出完整的操作步骤和配置文件片段。假设你的主项目目录是~/projects/my-project当前在feature/login分支上开发。3.1 创建 worktree 的三种典型场景Git worktree 的基本语法是git worktree add 新目录路径 分支名。路径建议放在项目同级目录用../开头这样目录结构清晰不会和项目内部文件混淆。场景一紧急修 bug基于已有远程分支创建 worktree。cd ~/projects/my-project git worktree add ../my-project-hotfix release/v15_3_0执行后会输出类似Preparing worktree (new branch release/v15_3_0) branch release/v15_3_0 set up to track origin/release/v15_3_0.场景二快速新建一个实验分支不指定分支名时 Git 会自动创建同名分支。git worktree add ../my-project-experiment -b experiment/new-api场景三review 同事的 PR假设远程已有pr-456分支。git worktree add ../my-project-review-pr456 pr-456创建完成后用git worktree list查看当前所有 worktreegit worktree list输出示例~/projects/my-project abc1234 [feature/login] ~/projects/my-project-hotfix def5678 [release/v15_3_0] ~/projects/my-project-experiment ghi9012 [experiment/new-api]3.2 在每个 worktree 中初始化开发环境worktree 创建后目录里只有 Git 跟踪的文件node_modules、虚拟环境、构建缓存都不在。你需要根据项目类型初始化。以 JavaScript 项目为例cd ../my-project-hotfix npm installPython 项目则创建虚拟环境cd ../my-project-experiment python -m venv .venv source .venv/bin/activate pip install -r requirements.txt这一步不能省否则 Claude Code 在分析依赖或运行测试时会报模块找不到的错误。3.3 Claude Code 启动参数与目录约定在每个 worktree 目录下直接运行claude即可启动一个独立会话。如果你想让 Claude Code 明确知道当前工作目录可以在启动时加上--cwd参数部分版本支持cd ../my-project-hotfix claude --cwd $(pwd)更常见的做法是直接cd进去再运行claude因为 Claude Code 默认就以当前目录为项目根。目录命名建议遵循「项目名-任务类型-标识」的格式比如my-project-hotfix、my-project-feature-a、my-project-review-pr456。这样在终端标签页或 IDE 窗口切换时一眼就能看出每个目录对应什么任务。如果你使用 VS Code可以在每个 worktree 目录下单独打开一个窗口然后在集成终端里启动 Claude Code。这样每个窗口就是一个完整的隔离环境。3.4 配置文件片段settings.json 与 .claude 目录Claude Code 支持项目级的.claude/settings.json你可以在每个 worktree 里放一份相同的配置确保 API 接入一致。内容如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的实际Key }, permissions: { allow: [ Read, Write, Bash(git:*), Bash(npm:*) ] } }注意.claude/settings.json如果被 Git 跟踪可能会把 Key 提交到仓库。建议把.claude/settings.local.json加入.gitignore本地配置写在这个文件里项目级配置只保留非敏感项。如果你用的是 Codex 或 Cline MCP 这类工具配置逻辑类似都需要三件套Base URL 填https://taotoken.net/apiAPI Key 填你创建的那个Model ID 根据你使用的模型填写比如claude-sonnet-4-20250514。这三项缺一不可少填一个就会报 401 或 model not found。4. 验证请求两个会话同时改不同分支与合并前冲突检查配置完成后最关键的是验证两个 Claude Code 会话确实互不干扰。下面用一个具体场景来演示。假设你有两个 worktree~/projects/my-project-feature-a分支feature-a任务是在src/utils.ts里新增一个formatDate函数。~/projects/my-project-bugfix分支bugfix-123任务是修复src/api.ts里的超时处理逻辑。4.1 启动两个独立会话打开两个终端窗口。第一个窗口cd ~/projects/my-project-feature-a claude第二个窗口cd ~/projects/my-project-bugfix claude在两个会话中分别输入任务指令。第一个会话输入「在 src/utils.ts 中新增 formatDate 函数接收 Date 对象返回 YYYY-MM-DD 格式字符串」。第二个会话输入「修复 src/api.ts 中 fetchWithTimeout 函数的超时逻辑确保超时后正确抛出错误」。4.2 验证代码隔离等两个会话都完成修改后分别在各自目录下执行git status git diff你会看到feature-a目录下只有src/utils.ts的改动bugfix-123目录下只有src/api.ts的改动。两个目录的文件状态完全独立一个会话的修改不会出现在另一个目录里。再验证一下 Git 历史共享git log --oneline -3两个 worktree 看到的提交历史是一致的因为它们共享同一个.git对象库。4.3 合并前冲突检查当两个任务都完成后你需要把分支合并回主分支。在合并之前先做冲突预检。回到主项目目录cd ~/projects/my-project git checkout main git merge --no-commit --no-ff feature-a--no-commit让 Git 执行合并但不自动提交这样你可以检查是否有冲突。如果没有冲突输出会显示Automatic merge went well。然后执行git merge --abort取消这次预合并回到干净状态。再用同样方式检查bugfix-123git merge --no-commit --no-ff bugfix-123 git merge --abort如果两个分支修改了同一个文件的同一区域预合并时会提示CONFLICT。这时候你需要决定合并顺序或者先在其中一个 worktree 里手动解决冲突。另一种更直观的方式是用git diff对比两个分支的改动范围git diff main...feature-a --stat git diff main...bugfix-123 --stat如果两个分支改动的文件列表没有交集那合并基本不会冲突。如果有交集就需要重点关注。4.4 成功结果说明当两个会话都顺利完成、代码隔离验证通过、合并预检无冲突后你就可以按顺序合并分支。合并完成后用git worktree remove清理不再需要的 worktreegit worktree remove ../my-project-feature-a git worktree remove ../my-project-bugfix注意git worktree remove只会删除 worktree 的注册信息目录里的未跟踪文件比如node_modules需要手动删除。如果你想强制删除有未提交改动的 worktree可以加--force参数但这样会丢失未提交的修改慎用。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错这一节整理实际操作中最容易遇到的几类报错和对应的排查方法。5.1 401 Unauthorized这是最常见的接入错误。Claude Code 启动后调用 API 返回 401说明 API Key 无效或没有正确传递。排查步骤第一检查~/.claude/settings.json里的ANTHROPIC_API_KEY是否填写正确注意不要有多余空格或换行。第二确认 Base URL 是https://taotoken.net/api不要写成https://taotoken.net/api/带尾部斜杠有些版本对斜杠敏感。第三在 TaoToken 控制台确认这个 Key 的状态是「启用」而不是「禁用」或「过期」。第四如果你用的是环境变量方式检查终端里echo $ANTHROPIC_API_KEY是否有输出。如果以上都正常但还是 401尝试在终端直接 curl 测试curl -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-20250514,max_tokens:10,messages:[{role:user,content:hi}]}如果 curl 返回正常而 Claude Code 报 401说明是 Claude Code 的配置读取问题检查配置文件路径是否正确。5.2 local proxy failed这个报错通常出现在你配置了本地代理但代理服务没有启动的情况下。Claude Code 会尝试连接http://localhost:xxxx但连接被拒绝。排查方法检查你的settings.json里是否有ANTHROPIC_BASE_URL指向了本地地址。如果有改成https://taotoken.net/api。另外检查系统环境变量里是否有HTTP_PROXY或HTTPS_PROXY指向了不可用的本地端口用env | grep -i proxy查看如果有就 unset 掉。5.3 reading choices 报错这个错误通常出现在模型返回的响应格式不符合预期时。可能原因是你使用的 Model ID 不正确导致 API 返回了错误格式的响应。确认你的 Model ID 是有效的比如claude-sonnet-4-20250514或claude-opus-4-20250514。如果你在配置里写了不存在的模型名API 会返回错误信息Claude Code 解析时就报 reading choices 错误。5.4 OAuth 相关报错如果你之前用 OAuth 方式登录过 Claude Code配置文件里可能残留了 OAuth token。当你切换到 API Key 方式时两者可能冲突。解决方法是删除~/.claude/下的 OAuth 缓存文件通常叫credentials.json或auth.json。然后重新用 API Key 方式配置。如果你用的是 Codex 的auth.json确保里面的api_key字段填的是 TaoToken 的 Keybase_url填https://taotoken.net/api。5.5 worktree 相关错误git worktree add时报fatal: branch is already checked out at path说明这个分支已经在另一个 worktree 里被检出了。Git 不允许同一个分支在多个 worktree 同时检出。解决办法是换一个分支名或者先移除已有的 worktree。git worktree remove时报fatal: path contains modified or untracked files说明目录里有未提交的改动。先提交或 stash或者加--force强制删除。6. 把并行会话变成日常开发习惯worktrees 配合 Claude Code 的价值在于它把「多任务并行」从一种需要小心翼翼操作的状态变成了默认的工作方式。你不再需要为了修一个 bug 而中断当前功能开发也不需要担心两个 Claude Code 会话互相覆盖文件。实际使用中我建议给每个长期任务固定一个 worktree 目录比如my-project-feature-auth、my-project-refactor-db这样 Claude Code 的会话上下文可以持续积累不用每次重新解释项目背景。短期任务比如 review PR 或紧急 hotfix用完就git worktree remove清理掉保持目录整洁。如果你需要更系统地管理多个项目的 API 接入和模型调用可以到 TaoToken 的接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc查看完整的参数说明。对于长期编码和 Agent 类任务Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding-plan提供了更稳定的调用额度。如果你想先快速验证模型对话效果可以直接在模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentchat测试。最后提醒一个细节worktree 目录里的.env文件、本地数据库连接串这类环境相关配置不会自动从主目录同步过来。你需要在每个 worktree 里单独创建或复制一份。如果项目用.env.example作为模板记得在每个 worktree 里执行cp .env.example .env并填入对应值。这个步骤看起来琐碎但漏掉的话 Claude Code 在运行测试时会报连接错误排查起来反而更费时间。