12 个 AI 实例,零文件冲突:Git Worktrees 如何实现
Source: Dev.to
(请提供您希望翻译的正文内容,我将把它翻译成简体中文并保持原有的格式、Markdown 语法以及技术术语不变。)
问题:多个 AI 同时操作同一个仓库
Instance A: editing lib/pages/landing_page.dart
Instance B: editing the same file differently → merge conflict
Instance C: git pull on main → picks up A's WIP → deploys broken state
仅靠分支策略无法解决此问题。多个 AI 在同一个 main 分支上工作时会不断冲突。
解决方案:使用 git worktree 实现物理隔离
# Create a dedicated worktree per instance
git worktree add .claude/worktrees/instance-ps1 -b claude/ps1-wip
git worktree add .claude/worktrees/instance-ps2 -b claude/ps2-wip
git worktree add .claude/worktrees/instance-vscode -b claude/vscode-wip
# ... 12 instances total
结果
instance-ps1/拥有自己的工作文件instance-ps2/拥有自己的工作文件- 相同文件,不同 worktree = 没有冲突
工作树的工作原理
my_web_app/ # main repo (integration/review only)
.claude/
worktrees/
instance-ps1/ # PS#1 workspace
lib/ → real files
branch: claude/ps1-wip
instance-ps2/ # PS#2 workspace
lib/ → real files
branch: claude/ps2-wip
instance-vscode/ # VSCode workspace
lib/ → real files
branch: claude/vscode-wip
每个工作树都有一个 独立的分支。git add/commit 完全在每个工作树内部独立进行。
会话启动协议
# Every instance runs this at session start
cd C:/Users/kanta/GitHub/my_web_app/.claude/worktrees/instance-ps2
# Pull latest main
git pull --rebase origin main
# Check assigned tasks, then start working
git stash 已被禁止。在多工作树环境中,stash 是工作树本地的。如果另一个实例进入同一工作树,stash 将消失。改用 WIP 提交 (git commit -m "WIP")。
推送流程
# 完成工作后
git add
git commit -m "feat: ..."
# 推送前进行 rebase
git pull --rebase origin main
git push origin HEAD:main
git push origin HEAD:main 是关键。普通的 git push 会发送到 claude/ps2-wip,而不是 main。
当冲突仍然发生
唯一的情况是:两个实例在同一天编辑同一个文件并且都尝试推送。
# PS#4 pushes landing_page.dart
# PS#5 also modified it, tries to push → rebase conflict
# Fix: always pull --rebase before push
git pull --rebase origin main
# → resolve conflict manually
git add
git rebase --continue
git push origin HEAD:main
在三个月、12个实例中,这种情况每月发生 1–2 次。预先分配的文件所有权可以将其降到最低。
实例文件所有权
| 实例 | 分配的文件 |
|---|---|
| VSCode | lib/pages/ — UI 组件 |
| PS#1 | .github/workflows/ — 工作流健康 |
| PS#2 | docs/blog-drafts/ — T‑1 内容 |
| PS#3 | supabase/migrations/*_seed_ai_university* |
| PS#4 | lib/pages/comparison_page.dart, web/sitemap.xml |
| PS#5 | lib/pages/、supabase/functions/ 中的身份验证守卫 |
| PS#6 | supabase/functions/schedule-hub/ — 赛马 AI |
| Win | docs/、supabase/migrations/ 模式更改 |
当所有权重叠时,第二个推送者总是先执行 --rebase 拉取。
Codex 集成
Codex CLI 使用相同的工作树模式:
.claude/worktrees/instance-codex1/ (branch: codex/codex1-wip)
.claude/worktrees/instance-codex2/ (branch: codex/codex2-wip)
Claude Code 创建跨实例 PR → Codex 在其工作树中实现 → PR → 合并。
三个月的课程
有效的做法
- 文件级冲突几乎为零
- 每个实例独立提交 →
git log可读性强
git log --oneline一眼即可看出哪个实例做了什么
失效的做法
- 临时工作树(自动生成的名称)被 PS#6 清理删除 → 工作丢失 → 标准化为
instance-*固定名称解决了问题 - 同一天的迁移时间戳冲突 → 通过 500 单位偏移规则解决
摘要
git worktree— 物理工作区分离- 预先分配的文件所有权 — 最小化重叠概率
pull --rebase → push— 一致的合并流程- 不使用 stash,仅使用 WIP 提交 — stash 安全规则
人类团队用于协作的相同工具(git worktree、分支策略、文件所有权)同样适用于 AI 团队。主要区别在于:AI 实例比人类更能始终如一地遵守规则。