1. 多分支并行开发时,Claude Code 会话为什么会互相打架
如果你同时推进两个需求,一个在feature-a上写接口,另一个在bugfix-123上修线上问题,最省事的做法通常是来回git stash、git checkout。但只要 Claude Code 介入,这套流程很快就会失控:你在 A 分支让 Claude 改了一个文件,切到 B 分支时它读到的还是同一份工作目录,上下文、未提交改动、临时文件全混在一起,最后连自己都分不清哪次修改属于哪个任务。
Git 工作树(worktree)解决的正是这个问题。它允许同一个仓库同时检出多个分支到不同目录,每个目录有独立的工作区文件状态,但共享同一份 Git 历史和远程配置。换句话说,你可以在../project-feature-a里跑一个 Claude Code 会话,在../project-bugfix里跑另一个,两边互不干扰,谁也不会覆盖谁的未提交改动。
这篇内容面向的是已经在用 Claude Code、并且需要并行处理多任务的开发者。核心交付三样东西:一套可复制的 Git 工作树操作流程、一份通过 TaoToken 统一 Key 接入的settings.json与config.toml骨架、以及会话隔离和配置生效的验证动作。TaoToken 在这里的角色是统一 API 通道,让你多个工作树里的 Claude Code 会话共用同一个 Key 和接入地址,不用每个目录单独配一遍。
2. 前置准备:TaoToken 统一 Key 与工作树环境
在动手建工作树之前,先把两件事准备好:Git 版本和 TaoToken 的接入凭证。
Git 工作树功能从 2.5 版本开始支持,先确认一下:
git --version # 期望输出类似 git version 2.40.0如果低于 2.5,升级 Git 即可。接着开启工作树独立配置,这一步很关键,因为后面每个工作树要能读取自己的配置:
git config extensions.worktreeConfig true然后是 TaoToken 侧的准备。访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 了解接入方式,然后到控制台创建 API Key:
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Key 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
创建好 Key 之后先记下来,后面配置里要用。API 基础地址统一用https://taotoken.net/api,注意这个地址不带 UTM 参数,是纯接口地址。
提示:TaoToken 是统一的 API 接入通道,多个工作树里的 Claude Code 会话共用同一个 Key 即可,不需要为每个目录单独申请。这样做的直接好处是配额和调用记录集中在一处,排查问题时不用在多个 Key 之间来回切换。
环境准备好后,进入下一步建工作树。
3. 可复制配置:工作树创建 + settings.json + config.toml
3.1 创建隔离的工作树目录
假设主仓库在~/projects/myapp,当前在main分支。为两个并行任务各建一个工作树:
cd ~/projects/myapp # 用新分支创建 feature-a 工作树 git worktree add ../myapp-feature-a -b feature-a # 用已有分支创建 bugfix 工作树 git worktree add ../myapp-bugfix bugfix-123 # 查看所有工作树 git worktree list输出会类似:
/home/you/projects/myapp abc1234 [main] /home/you/projects/myapp-feature-a def5678 [feature-a] /home/you/projects/myapp-bugfix aaa1111 [bugfix-123]每个目录都是独立的文件工作区,改动互不影响。接下来在每个工作树里初始化开发环境,比如 Node 项目:
cd ../myapp-feature-a npm install3.2 Claude Code 的 settings.json 骨架
Claude Code 的配置分两层:全局配置和项目级配置。项目级配置放在工作树目录下的.claude/settings.json,这样每个工作树可以有自己的行为设置,但 API 接入统一走 TaoToken。
在myapp-feature-a/.claude/settings.json写入:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "你的_TaoToken_API_Key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "Read", "Edit", "Bash(git status)", "Bash(git diff:*)" ], "deny": [ "Bash(rm -rf:*)", "Bash(git push:*)" ] } }几个要点说明:
ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,这是所有会话共用的通道。ANTHROPIC_AUTH_TOKEN填你在控制台创建的 Key。permissions里我特意把git push放进 deny,因为并行会话里最怕的就是某个 Claude 实例自作主张推代码,隔离环境里先禁掉更稳妥。
同样的文件复制到myapp-bugfix/.claude/settings.json,内容可以完全一致,因为 Key 和通道是统一的。如果你希望两个工作树用不同的模型,只改ANTHROPIC_MODEL即可。
3.3 config.toml 骨架
如果你用的是支持config.toml的客户端形态(比如某些 CLI 封装或本地代理层),配置骨架如下:
[api] base_url = "https://taotoken.net/api" api_key = "你的_TaoToken_API_Key" model = "claude-sonnet-4-20250514" timeout_seconds = 120 [session] # 每个工作树独立会话,避免上下文串台 isolate = true workdir = "." [permissions] allow = ["Read", "Edit", "Bash(git status)", "Bash(git diff:*)"] deny = ["Bash(rm -rf:*)", "Bash(git push:*)"]isolate = true是并行场景的关键,它保证每个工作树目录下的会话上下文独立。workdir = "."表示以当前工作树根目录为工作区,这样 Claude 读写的文件天然被限制在本工作树内。
注意:
config.toml和settings.json不要同时配同一项,否则可能出现优先级冲突。选一种你实际使用的形态即可,本文两种都给出来是为了覆盖不同客户端。
4. 验证请求:确认会话隔离与配置生效
配置写完不代表生效,必须验证。分三步走。
4.1 验证工作树隔离
在两个工作树里各制造一个改动,确认互不影响:
# 在 feature-a 工作树 cd ~/projects/myapp-feature-a echo "feature a change" >> README.md git status # 切到 bugfix 工作树 cd ~/projects/myapp-bugfix git status预期结果:myapp-bugfix的git status里看不到README.md的改动。如果看到了,说明你其实还在同一个工作目录里,检查pwd确认路径。
4.2 验证 TaoToken 配置生效
在每个工作树里启动 Claude Code,然后发一个最小请求确认通道打通:
cd ~/projects/myapp-feature-a claude进入会话后输入一句简单指令,比如让它读取当前目录的package.json并总结依赖。如果配置正确,Claude 会正常返回内容;如果 Key 或地址有问题,会直接报鉴权或连接错误。
你也可以用 curl 单独验证 API 通道,不依赖 Claude Code:
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": "ping"}] }'返回里带content字段就说明通道正常。这一步能快速区分是「Key 问题」还是「Claude Code 配置问题」。
4.3 验证并行会话不串台
同时开两个终端,分别进入两个工作树启动 Claude Code:
# 终端 1 cd ~/projects/myapp-feature-a && claude # 终端 2 cd ~/projects/myapp-bugfix && claude在终端 1 里让 Claude 修改feature-a相关的文件,在终端 2 里让它修改bugfix相关文件。完成后各自git diff,确认改动只出现在对应工作树里。这一步通过,说明会话隔离和配置生效都到位了。
如果你更想先在网页端验证模型通道是否正常,可以直接用模型对话入口试一句:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
5. 本篇常见错排查
5.1 工作树创建报「already exists」
fatal: '../myapp-feature-a' already exists原因通常是目录已存在但没被 Git 识别为工作树。先确认:
git worktree list如果列表里没有这个路径,说明是残留目录,删掉再建,或者用-f强制:
git worktree add -f ../myapp-feature-a feature-a5.2 手动删目录后git worktree list显示 prunable
直接rm -rf删工作树目录,Git 元数据还在。清理:
git worktree prune5.3 配置改了但 Claude Code 没生效
最常见的原因是配置文件放错位置。项目级配置必须在工作树根目录下的.claude/settings.json,不是主仓库的。确认:
cat ~/projects/myapp-feature-a/.claude/settings.json另外检查环境变量有没有被 shell 里的旧值覆盖:
echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_AUTH_TOKEN如果 shell 里设了旧值,会优先于配置文件。清掉再试:
unset ANTHROPIC_BASE_URL unset ANTHROPIC_AUTH_TOKEN5.4 报鉴权失败 401
先确认 Key 没写错、没多空格。然后用 4.2 的 curl 单独测通道。如果 curl 也 401,去控制台确认 Key 状态是否正常:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
5.5 两个会话仍然互相影响
检查是不是两个终端其实指向了同一个目录。用pwd确认。另外确认config.toml里isolate = true已设置,或者settings.json里没有把工作目录指向主仓库。
5.6 工作树路径迁移后失效
手动移动过工作树目录,Git 找不到链接关系。修复:
git worktree repair /new/path/to/worktree想避免这个问题,可以开启相对路径:
git config worktree.useRelativePaths true6. 长期并行编码:把统一 Key 和 Coding Plan 用起来
工作树 + 统一 Key 这套组合,短期看是解决多分支并行时的会话隔离,长期看是让多个 Claude Code 会话共享同一条 API 通道和配额。如果你经常同时跑三四个任务,建议把接入方式固定下来,避免每次新建工作树都重新配一遍。
对于需要长期跑编码任务、或者把 Claude Code 接入 Agent 工作流的场景,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
接入细节和参数说明统一看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
如果你用的是 Claude Code 的 Anthropic 兼容接入形态,这个入口有专门说明:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite
我自己的习惯是:主仓库只用来做合并和发布,所有实际开发都在工作树里进行,每个工作树配一份.claude/settings.json,Key 和地址统一指向 TaoToken。这样即使同时开四个会话,也不会出现「改了 A 分支结果 B 分支跟着变」的情况。工作树用完及时git worktree remove,保持目录干净,比攒一堆残留目录再prune省心得多。