12 个 AI 实例,零文件冲突:Git Worktrees 如何实现

发布: (2026年4月28日 GMT+8 16:11)
5 分钟阅读
原文: Dev.to

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 次。预先分配的文件所有权可以将其降到最低。

实例文件所有权

实例分配的文件
VSCodelib/pages/ — UI 组件
PS#1.github/workflows/ — 工作流健康
PS#2docs/blog-drafts/ — T‑1 内容
PS#3supabase/migrations/*_seed_ai_university*
PS#4lib/pages/comparison_page.dart, web/sitemap.xml
PS#5lib/pages/supabase/functions/ 中的身份验证守卫
PS#6supabase/functions/schedule-hub/ — 赛马 AI
Windocs/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 实例比人类更能始终如一地遵守规则。

0 浏览
Back to Blog

相关文章

阅读更多 »