文章目录
- 核心概念
- 常用命令
- 典型使用场景
- 注意事项
- [和 clone 的区别](#和 clone 的区别)
- [cursor best-of-n-runner](#cursor best-of-n-runner)
- 其他
简单来说,它允许开发者在同一个 Git 仓库 下,同时检出多个分支到不同的工作目录,而不需要克隆多份仓库。
核心概念
通常一个 Git 仓库只有一个工作目录(working tree),同一时间只能 checkout 一个分支。git worktree 打破了这个限制,让你可以:
- 主仓库在
main分支开发 - 同时在另一个目录里 checkout
feature-x分支 - 再开一个目录 checkout
hotfix分支
所有这些 worktree 共享同一个 .git 目录(对象、引用、配置都共享),只是工作区独立。
常用命令
bash
git worktree add ../project-feature feature-x
git worktree add -b hotfix-login ../project-hotfix main
git worktree list
git worktree remove ../project-feature
git worktree prune
典型使用场景
- 紧急 hotfix:当前分支改了一半不想 stash,直接开个新 worktree 修 bug
- 并行开发:多个 feature 同时进行,互不干扰
- 代码对比/review:在一个目录跑旧版本,另一个目录跑新版本
- 跑长时间任务:一个 worktree 跑测试/构建,另一个继续写代码
- AI Agent 并行任务:比如 Cursor 的 best-of-n-runner、Claude Code 的并行 agent,都是基于 worktree 实现隔离的
注意事项
- 同一个分支不能在两个 worktree 同时 checkout (除非用
--force) - 删除 worktree 目录后,记得跑
git worktree prune清理元数据 - worktree 的元信息存在主仓库
.git/worktrees/下 - 子模块(submodule)在 worktree 中支持有限,需要注意
和 clone 的区别
git clone |
git worktree |
|
|---|---|---|
| 磁盘占用 | 完整 .git 目录 ×N |
共享 .git,只多工作区 |
| 创建速度 | 慢(要拉对象) | 快(秒级) |
| 分支同步 | 需要 fetch | 天然共享 |
| 隔离性 | 完全隔离 | 工作区隔离,对象共享 |
cursor best-of-n-runner
best-of-n-runner 是 Cursor 给Agent提供的一个子代理(subagent)类型 ,它的核心思想就是利用 git worktree 来做并行实验 / Best-of-N 尝试。
它是什么
Run a task in an isolated git worktree. Each best-of-n-runner gets its own branch and working directory. Use for best-of-N parallel attempts or isolated experiments.
翻译过来:
- 每个
best-of-n-runner子代理会自动创建一个独立的 git worktree + 独立的分支 - 在那个隔离环境里执行任务
- 不会污染开发者当前的工作区
"Best-of-N" 是什么意思
这是 AI 领域常见的策略:让 N 个 agent 并行做同一件事,然后挑最好的一个结果。
比如:
- 让 3 个 agent 各自实现"图表懒加载",最后对比谁的方案最干净
- 让 5 个 agent 各自尝试修同一个 bug,看哪个修得对
- 让 2 个 agent 用不同技术栈实现同一个功能(一个用 Jotai,一个用 Zustand),对比
因为每个 runner 在自己的 worktree + 自己的分支里跑,它们:
- 互不干扰(不会同时改一个文件冲突)
- 可以真的跑 build/test 验证
- 完事后开发者可以
git diff对比,或者 cherry-pick 最满意的那份
典型使用方式
开发者可以这样并行启动多个:
并行启动 3 个 best-of-n-runner:
- runner A: 用方案1实现 X
- runner B: 用方案2实现 X
- runner C: 用方案3实现 X
完成后 → 对比 3 个分支的 diff → 选最优
每个 runner 跑完后,会留下一个分支(比如 agent/best-of-n-xxx-1、agent/best-of-n-xxx-2),你可以:
bash
git worktree list
git diff main..agent/best-of-n-xxx-1
git diff agent/best-of-n-xxx-1..agent/best-of-n-xxx-2
git checkout agent/best-of-n-xxx-2
和普通 subagent 的区别
| 类型 | 隔离方式 | 适用场景 |
|---|---|---|
generalPurpose |
共享当前工作区 | 普通的多步任务 |
explore |
只读 | 探索代码库 |
shell |
共享当前工作区 | 跑命令 |
best-of-n-runner |
独立 worktree + 分支 | 并行实验、对比方案 |
什么时候会用
- "试几种方案对比一下"
- "并行让多个 agent 各自实现"
- 重构方案不确定,想跑几个版本看效果
- 想做对照实验(A/B 实现)
什么时候不适合
- 任务很明确,只有一个正确解法 → 浪费算力
- 任务有先后依赖 → 用不上并行
- 改动很小(改个变量名)→ 杀鸡用牛刀
其他
- 在当前仓库开个 worktree 来并行开发多个功能
- 写个脚本/alias 来简化 worktree 工作流