Claude Code 配 git worktree 并行多开实战
很多人用 Claude Code 时只开一个终端、跑一个任务,等它写完才能干下一件事——这其实是巨大的浪费。git worktree 能让同一个仓库同时签出多个分支到不同目录,于是你可以开多个终端、每个终端各跑一个 Claude Code 实例,并行处理不同任务,彼此完全隔离、互不污染。
这篇讲清楚:worktree 到底解决什么问题、完整的创建与清理命令、以及多开时最容易踩的坑怎么排。命令以官方 git 文档为准,但机制是长青的。如果你还没装好 Claude Code,先看 Claude Code 入门教程。
为什么要用 worktree 而不是反复切分支
平时一个仓库一个工作目录,要换分支只能 git checkout。问题是:
- 切分支会打断手头的工作:未提交的改动得 stash,回来还得 pop,状态容易丢。
- AI 同时改一堆文件,切分支风险更大:Claude Code 一次可能动十几个文件,半路切分支极易冲突或丢改动。
- 真正的并行做不到:单目录里只能有一个”当前分支”,你没法让 A 任务和 B 任务在同一时刻各自跑。
举个我自己踩过的场景:接了个需求要同时改「登录页」和「支付回调」,图省事就在一个目录里来回切分支,结果改到一半 Claude Code 提示”检测到未跟踪文件冲突”——原来上一次 stash 的改动还压在栈里没弹出来,两拨改动混在一起,最后花了二十分钟对比 diff 才理清楚谁改了什么。这类问题的根源不是 Claude Code 不靠谱,而是”单工作区多任务”这个操作方式本身就不安全。
git worktree 的思路是:一个 .git 仓库,挂多个工作目录。每个目录签出一个独立分支,有自己的工作区和暂存区,但共享同一份提交历史和对象库。于是每个目录可以独立地跑一个 Claude Code,互不干扰。
打个比方:主仓库是一栋楼的”中央档案室”,每个 worktree 是一间独立办公室。大家共用档案室的资料(提交历史),但各自桌面(工作区)的草稿互不影响。
原理:worktree 共享什么、隔离什么
理解这两条,后面所有操作都顺了:
| 维度 | 是否共享 | 说明 |
|---|---|---|
| 提交历史 / 对象库 | 共享 | 一处提交,各 worktree 都能看到 |
| 远程配置 / 大部分 config | 共享 | 同一个 origin,不用重配 |
| 工作区文件 | 隔离 | 各目录的代码改动互不影响 |
| 暂存区(index) | 隔离 | 各自 git add 互不干扰 |
| 当前签出的分支 | 隔离 | 且同一分支不能在两个 worktree 同时签出 |
最后一条是关键约束:一个分支只能被一个 worktree 占用。所以并行的前提是——每个任务一个独立分支。这恰好和”每个任务一个 Claude Code”完美对齐。
完整操作:从创建到并行跑
假设你在主仓库目录下,要并行做”加登录功能”和”修支付 bug”两件事。
第一步:为每个任务建一个 worktree(顺带建新分支)
# 在仓库同级建目录,各自基于 main 切出新分支
git worktree add ../proj-login -b feature/login main
git worktree add ../proj-payfix -b fix/payment main
-b feature/login 表示新建分支并签出;main 是起点。执行完会多出 ../proj-login、../proj-payfix 两个目录。
第二步:每个目录各开一个终端,各跑一个 Claude Code
# 终端 A
cd ../proj-login && claude
# 终端 B(另开一个终端窗口)
cd ../proj-payfix && claude
现在两个 Claude Code 实例在物理上隔离的目录里并行工作,A 改登录、B 修支付,谁也看不见谁的草稿,不会互相覆盖文件。
第三步:各自完成后正常提交、推送
# 在 proj-login 目录
git add -A && git commit -m "feat: 登录功能"
git push -u origin feature/login
因为对象库共享,推送、开 PR、合并的流程和平时完全一样。
查看当前所有 worktree:
git worktree list
会列出每个 worktree 的路径、HEAD 和所在分支,一目了然。
多开 Claude Code 的几个实战配置
并行不是简单复制,几处细节决定体验:
- 每个 worktree 单独建 AGENTS.md / CLAUDE.md:可以在每个工作目录放各自的上下文说明,让对应实例聚焦本任务。共享的全局规则放仓库根或用户级配置。
- 依赖各装各的:worktree 共享 git 历史,但不共享
node_modules、.venv这类被 gitignore 的产物。新 worktree 里要重新npm install/pnpm install,否则跑不起来。 - 端口要错开:两个实例都启本地 dev server 时,记得让它们监听不同端口,否则第二个起不来。
- 别让两个实例改同一批文件:worktree 隔离的是磁盘文件,但合并时仍可能冲突。按功能边界拆任务(一个动前端、一个动后端),冲突概率最低。
.git/hooks是共享的:如果你用 husky、lint-staged 之类的 pre-commit 钩子,改动一次对所有 worktree 都生效,别指望每个 worktree 能跑不同版本的钩子逻辑。- 锁文件(lockfile)容易打架:
package-lock.json/pnpm-lock.yaml这类文件如果两个 worktree 都装了依赖并各自提交,合并时大概率冲突。建议约定一个 worktree 负责升级依赖,其余的只装不改锁文件。 - 终端管理建议用 tmux 或 zellij 开窗格:与其开一堆独立终端窗口找起来费劲,不如用
tmux new -s login/tmux new -s payfix建两个会话,Ctrl+b s一键切换,哪个任务卡住了一眼就能定位。
怎么验证并行真的隔离了
简单自检三步:
- 在 worktree A 里随便改个文件但先不提交,到 worktree B 用
git status看——B 应当完全干净,证明工作区隔离。 - 在 A 提交一笔,到 B 跑
git log --oneline -1 <A的分支>,能看到这笔提交,证明历史共享。 git worktree list里每个目录的分支各不相同,证明分支占用没冲突。
三条都对,说明并行环境搭对了。
用完怎么清理(别留垃圾目录)
任务合并后要及时回收,否则磁盘和 worktree list 会越来越乱:
# 1. 删除 worktree 目录(推荐用 git 命令,会同步登记信息)
git worktree remove ../proj-login
# 2. 若目录已被手动删掉,清理失效登记
git worktree prune
# 3. 分支合并后可单独删分支
git branch -d feature/login
切记:直接 rm -rf 删目录会留下失效的 worktree 登记,必须再跑一次 git worktree prune 才干净。优先用 git worktree remove。
常见坑与排查
| 报错 / 现象 | 原因 | 解法 |
|---|---|---|
fatal: '<分支>' is already checked out | 该分支已被另一个 worktree 占用 | 换个分支,或先在占用方切走;并行就是每任务一分支 |
| 新 worktree 里项目跑不起来 | 缺 node_modules 等 gitignore 产物 | 在新目录重新装依赖 |
rm 删了目录后 list 还显示 | 失效登记没清 | 跑 git worktree prune |
| 两个实例改同一文件后合并冲突 | 任务边界没拆开 | 按功能拆任务,或串行处理重叠部分 |
| 想删的 worktree 有未提交改动删不掉 | git 保护未保存内容 | 确认可丢弃后用 git worktree remove --force |
具体命令的可选参数以官方 git 文档为准,但上面这套”创建—并行—清理”的骨架不会变。
常见问题
worktree 会不会占很多硬盘?
对象库(提交历史)是共享的,不重复占。额外占用的主要是各 worktree 工作区的文件副本和各自的依赖(如 node_modules),按项目大小算,通常可接受。
能开几个 Claude Code 一起跑? git 层面对 worktree 数量没硬限制,真正的瓶颈是你的注意力和机器资源。建议同时盯 2-3 个,超过就容易顾此失彼、合并也乱。
worktree 和直接克隆多份仓库有什么区别? 克隆多份会复制整个历史、各自独立的远程配置,占空间且容易不同步。worktree 共享一份历史和远程,更轻量、提交互通,专为”同仓库多分支并行”设计。
多个实例会不会改乱同一个分支? 不会,因为同一分支不能被两个 worktree 同时签出——git 会直接报错拦住你。这恰恰逼着你做到”一任务一分支”,反而更安全。
Windows 上能用吗?
能。git worktree 是 git 自带功能,跨平台一致;路径用对应系统的写法即可。多终端就是多开几个终端窗口或终端标签页。用 Git Bash 或 PowerShell 都行,命令完全一样,不需要额外装东西。
IDE 里怎么配合使用?
用 VS Code 的话,每个 worktree 用独立窗口打开(code ../proj-login、code ../proj-payfix),而不是在同一个窗口里用多根工作区(multi-root),否则容易搞混当前生效的是哪个目录的设置和插件状态。习惯了之后,一个窗口对应一个任务、一个终端跑一个 Claude Code,脑子里的心智负担反而更小。
worktree 目录要不要加进 .gitignore?
如果你按惯例把 worktree 建在仓库同级目录(比如 ../proj-login),本身就在仓库之外,不需要处理。但如果图方便建在仓库内部的子目录里,一定要把这个子目录加进 .gitignore,否则主分支会把其他 worktree 的文件当成待提交的新文件,状态会乱成一团。
👉 看看我们的 AI 编程实战体系课,或逛 AI 编程教程大全 把基本功打扎实。