☰
Claude Code中英文系列教程:用 Git worktrees 在同一个项目里并行跑多个 Claude Code 的配置与验证
2026/10/4 18:59:41 网站建设 项目流程

1. 同一仓库多任务并行时,Claude Code 会话为什么会互相踩脚

如果你已经在日常开发里用 Claude Code 帮忙写代码,大概率遇到过这种场景:手头一个功能还没写完,线上突然报了个 bug 要紧急修,同时还有个同事提的 PR 等着你 review。三个任务都指向同一个仓库,但你只有一个工作目录。

这时候常见的做法是git stash暂存当前改动,切到 hotfix 分支改完再切回来。问题是 Claude Code 的会话是绑定在目录上的——你在my-project/里启动的 Claude Code,它读的是这个目录的文件状态。一旦你切了分支,Claude Code 之前建立的上下文里那些文件路径、代码内容全都变了,它给出的建议可能直接对不上号。更麻烦的是,如果你同时开两个终端窗口跑 Claude Code,两个会话操作的是同一份工作目录,A 会话改了src/api.ts,B 会话读到的就是被改过的版本,代码隔离完全无从谈起。

我试过最笨的办法是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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console),注册或登录后进入 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查看当前所有 worktree:

git 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 install

Python 项目则创建虚拟环境:

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/api,API 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-123:

git 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清理不再需要的 worktree:

git 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 的 Key,base_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_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc)查看完整的参数说明。对于长期编码和 Agent 类任务,Coding Plan(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan)提供了更稳定的调用额度。如果你想先快速验证模型对话效果,可以直接在模型对话页面(https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=chat)测试。

最后提醒一个细节:worktree 目录里的.env文件、本地数据库连接串这类环境相关配置,不会自动从主目录同步过来。你需要在每个 worktree 里单独创建或复制一份。如果项目用.env.example作为模板,记得在每个 worktree 里执行cp .env.example .env并填入对应值。这个步骤看起来琐碎,但漏掉的话 Claude Code 在运行测试时会报连接错误,排查起来反而更费时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询