From litepowers
开始需要和当前工作区隔离的功能开发时建隔离工作区。Use before isolated feature work. TRIGGER: 开个 worktree / 隔离工作区 / 不想弄脏当前分支 / 并行开发 / create a worktree / isolated workspace / don't touch current branch / parallel work.
How this skill is triggered — by the user, by Claude, or both
Slash command
/litepowers:git-worktreesThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
确保工作发生在隔离工作区。**优先用平台原生 worktree 工具,没有再退回手动 git worktree。**
确保工作发生在隔离工作区。优先用平台原生 worktree 工具,没有再退回手动 git worktree。
核心顺序:先探测已有隔离 → 用原生工具 → 退回 git → 别和 harness 较劲。
建任何东西之前,先确认你是不是已经在隔离工作区里。
GIT_DIR=$(cd "$(git rev-parse --git-dir)" 2>/dev/null && pwd -P)
GIT_COMMON=$(cd "$(git rev-parse --git-common-dir)" 2>/dev/null && pwd -P)
# submodule 也会让两者不等,先排除
git rev-parse --show-superproject-working-tree 2>/dev/null
GIT_DIR != GIT_COMMON 且非 submodule → 已在 worktree 里,别再建,直接去步骤 2。1a. 原生工具优先 — 有没有 EnterWorktree / WorktreeCreate / /worktree 命令 / --worktree 标志之类的?有就用它,跳步骤 2。原生工具自动处理目录、建分支、清理。有原生工具还手敲 git worktree add 会制造 harness 看不见的幽灵状态。
1b. git 退路(仅当无原生工具)
目录选择优先级:用户声明的偏好 > 已存在的 .worktrees/(优先)或 worktrees/ > 默认 .worktrees/。
项目内隔离目录必须先确认被 ignore;原生工具爱建哪建哪,但只要落在项目内,就提示用户把对应目录加进 .gitignore:
git check-ignore -q .worktrees 2>/dev/null || echo "未 ignore:先加进 .gitignore 并 commit"
# 如果原生工具建在 .claude/worktrees/,同理确认 .claude/worktrees/ 被 ignore
建:
git worktree add ".worktrees/$BRANCH" -b "$BRANCH"
cd ".worktrees/$BRANCH"
权限错误(沙箱拦截)→ 告诉用户沙箱挡了 worktree 创建,改为原地工作,原地跑 setup 和基线测试。
AI 在 worktree 里最常犯、代价最大的错:建了 worktree,后续却用主仓路径干活——Read/Write/Edit 用了主仓的绝对路径(记忆里的老路径),或 cd 回了主仓。结果所有改动落进主仓的当前分支,你新建的 worktree 分支空空如也,主仓还被意外污染。等到"工作树干净、文件却不见"才发现,已经绕了很久。
建完/进入 worktree 后,立刻锚定它的绝对路径,之后一切操作以它为根:
WT=$(git rev-parse --show-toplevel) # 当前 worktree 根,记住它
git worktree list # 看清每个目录对应哪个分支
echo "已锚定工作区:$WT"
铁律:
$WT/ 开头的路径。每次 Write/Edit 前确认目标路径在 worktree 里,别用记忆里的主仓路径(如 …/Desktop/<repo>/…)。cd 回主仓。需要主仓信息用 git -C <主仓路径> …,不切目录。路径锚定只防"文件落错仓";还有一类同样致命的错位是分支 checkout 错位。
心智模型:分支是仓库级单例。 master / main 这类分支同一时刻只能被一个工作区 checkout——你在 worktree 里 git checkout master,就把主干的唯一 checkout 位挪进了这个临时目录,主仓和所有其他会话立刻切不到 master,直到你归还。干完不归还,主干就被这个临时 worktree 占死。
铁律:
git checkout / git switch 到 master / main 等共享主干。 这个 worktree 自始至终待在自己的隔离分支上。git -C "<主仓路径>" merge "$BRANCH"(让 merge 发生在主仓,当前 worktree 不切分支)。git checkout - 切回隔离分支归还,绝不停在主干上(见步骤 4c)。自动探测并装依赖(有哪个装哪个):package.json→装包(按 lockfile 选包管理器:pnpm-lock.yaml→pnpm / yarn.lock→yarn / package-lock.json→npm / bun.lock / bun.lockb→bun) / Cargo.toml→build / requirements.txt/pyproject.toml→装 / go.mod→download / pom.xml→依赖解析 等。
跑项目对应的测试命令。失败 → 报告并问是否继续(区分新 bug 和既有问题)。通过 → 报告就绪。
worktree 只提供隔离,不决定合并拓扑;但回流应优先让工作分支按项目约定正常合并。别为了省事把 diff/apply、复制文件、cherry-pick 当默认回流方式——这会绕过分支语义,让 worktree 分支变成废分支。
优先用 PR base / 用户指定目标 / 项目默认分支,不要硬编码 main:
BASE_REF="<目标主干或 PR base>"
git -C "$WT" fetch --all --prune
git -C "$WT" diff --name-only "$BASE_REF"...HEAD
git 只发现同一区块文本冲突;两条分支各占一个"下一个号"时,文件不同也可能合坏。上一步 diff 出现这些资源就核对:
发现冲突就改本分支(迁移序号、字段号、错误码等),别留到主干 merge 时凑合。
优先把 $BRANCH 按项目 / 平台约定回流(PR merge / git merge;具体 merge commit、squash merge、rebase merge 听项目约定)。只有用户明确要求挑提交 / 补丁提取,或分支无法合并且说明原因时,才用 cherry-pick / patch。
别在 worktree 内 checkout 主干来 merge(步骤 1.6)——要本地合就 git -C "<主仓路径>" merge "$BRANCH",让 merge 发生在主仓、当前 worktree 不切分支。万一已经在 worktree 内切到主干合过,先 git checkout - 归还隔离分支再往下清理;停在主干上不归还 = 主干被这个临时目录占死,主仓和其他会话都切不过去。
回流后清理 worktree。原生工具创建的优先用原生清理;手动 git worktree 用已锚定路径:
git -C "<主仓路径>" worktree remove "$WT"
git -C "<主仓路径>" branch -d "$BRANCH" # 仅真实 merge 后可靠;squash/rebase 回流后按项目约定删分支
出现"改了文件却找不到 / git status 干净但改动没了 / 新建的分支是空的" → 几乎一定是改动落错了目录。别猜,直接对比两个工作区各自的真相:
git worktree list # 每个目录 + 它的分支 + HEAD,一眼看清谁是谁
git -C "$WT" status --short # worktree 的改动
git -C "<主仓路径>" status --short # 主仓的改动
ls "$WT/<你以为改过的文件>" 2>/dev/null || echo "worktree 里没有这个文件"
改动出现在主仓而非 $WT = 路径根用错了。停手,把改动迁到 worktree 重做,别在主仓继续叠。撞到第二次困惑就立刻查这个,别再猜第三次。
完成时同样验证:提交前确认改动在 worktree 分支可见、主仓 status 干净。
$WT,所有路径以它为根,绝不 cd 回主仓(步骤 1.5)。git checkout master/main 做 merge 或图省事 → 主干的唯一 checkout 位被挪进临时 worktree,主仓和其他会话全切不到主干,干完不归还就一直卡死。→ worktree 钉死隔离分支,要合主干去主仓 git -C "<主仓>" merge,切过务必 git checkout - 归还(步骤 1.6 / 4c)。git check-ignore。$BRANCH 正常回流;合并形态按项目约定,不明确就问(步骤 4c)。main...HEAD 或 .worktrees/$BRANCH 会扫错 / 删错。→ 用 $BASE_REF、$WT 和 git -C "<主仓路径>"(步骤 4a/4c)。Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub cheng6563/litepowers --plugin litepowers