worktree 用于让当前工作发生在隔离的工作区中,而不打扰用户的主检出。它会先检测隔离是否已存在,再决定是否创建。
用途:用户请求隔离时,或实现计划识别出独立工作轨道时,为其建立可逆的 worktree。提交层面的集成仍需单独授权。
主要能力与两种模式: 新工作(默认):未指定 ref,从基线(默认主干)创建新分支。 隔离已有 ref:调用方指定一个 ref(PR head、已有分支或提交),将 worktree 挂到该 ref 上。此模式有一条硬性 git 规则:一个分支同一时间只能在一个 worktree 中检出。若目标 ref 已在别处检出(常见于主检出的当前分支),不要为它再建第二个 worktree,报告它已在 <path> 检出并交由调用方处理;仅在确实需要干净独立树时,才在同一提交上创建 detached worktree。
使用方式(顺序): 步骤 0 检测现有隔离:先执行 git rev-parse --absolute-git-dir 与 (cd "$(git rev-parse --git-common-dir)" && pwd -P),将两者解析为绝对路径后比较。相等则为普通检出,继续。不等则用 git rev-parse --show-superproject-working-tree 区分:输出非空为子模块,按普通检出处理;输出为空说明已处于隔离 worktree,报告路径与分支,不再另建(worktree 套 worktree 会落在错误的树上且对宿主不可见),改为原地工作。 步骤 1 优先宿主原生工具:若宿主提供原生 worktree 原语(如 Claude Code 的 EnterWorktree,或某些宿主的 /worktree 命令、--worktree 标志)则使用并停止;后台直接 git worktree add 会产生宿主无法看到、导航或清理的幽灵状态。 步骤 2 git 回退:仅在没有原生工具且步骤 0 未发现隔离时。先从仓库根运行 cd "$(git rev-parse --show-toplevel)",否则 .worktrees/<branch> 和 .gitignore 编辑会落到当前子目录。从工作描述选有意义的分支名,选基线分支(默认 origin 的默认分支,否则 main)。创建前确保 .worktrees/ 被 gitignore(用带斜杠的 git check-ignore -q .worktrees/ 检查)。尽力刷新基线分支 git fetch origin <from-branch>,失败非致命。新工作用 git worktree add -b <branch-name> .worktrees/<branch-name> origin/<from-branch>(无 origin 引用时用本地 ref);隔离已有 ref 用 git worktree add .worktrees/<slug> <target-ref>。PR 可先 git fetch origin pull/<n>/head:pr-<n> 再 git worktree add .worktrees/pr-<n> pr-<n>。随后 cd 进入。
其他操作直接用 git:git worktree list、git worktree remove .worktrees/<branch>、cd .worktrees/<branch>、cd "$(git rev-parse --show-toplevel)"。
适用场景:在保持当前检出可用的情况下评审或修复 PR;并行运行多个功能而无需切换分支的开销。
限制:不要为可在当前检出分支上完成的单任务创建 worktree,尤其当步骤 0 已显示处于隔离中时。若因沙箱或权限错误失败,走宿主正常权限或升级流程,保持请求的 ref 与隔离,获权后再试;权限被拒、不可用或重试仍失败时报告阻塞,仅在工作区变更或放弃隔离前征求决定,除非用户明确同意,否则保持当前检出不受影响。
故障排查:"Worktree already exists" 表示路径被占用,切换到它或先移除再重建;"Cannot remove worktree: it is the current worktree" 表示需先 cd 出该 worktree 再移除。
该技能改编自 compound-engineering-plugin(MIT)。官方文档未提供更多内容。