收尾一个开发分支
概述
核心原则: 验证测试 → 检测环境 → 展示选项 → 执行选择 → 清理。
开始时宣告: "我正在使用 finishing-a-development-branch 技能来收尾这份工作。"
步骤 1:验证测试
运行项目的完整测试套件(npm test / cargo test / pytest / go test ./...)。
如果测试失败,报告失败并停下——菜单是在测试全绿之后才出现的:
如果测试通过: 继续步骤 2。
步骤 2:检测环境
这决定了展示哪种菜单、以及清理方式:
步骤 3:确定基础分支
基础分支就是这份工作从哪儿分出来的那个——通常在计划里、对话里,或者分支的 upstream 里已经写明了。如果还不知道,就问:"这个分支是从 <你的最佳猜测> 分出来的,对吗?"合并之前先确认:合并到错误的基础分支,代价很高。
步骤 4:展示选项
普通仓库和命名分支 worktree——精确展示这 3 个选项:
分离 HEAD——精确展示这 2 个选项:
照原文展示菜单——简洁,每个选项都来自上面的列表。丢弃工作只在你的人类伙伴明确提出时才发生(见下方"如果你的人类伙伴要求丢弃这份工作")。等他们回答;集成与否是他们的决定。
步骤 5:执行选择
选项 1:本地合并
如果测试在合并结果上失败:停下,把 worktree 和分支原地留着,去排查——什么都还没推送,所以这次合并是本地的、可恢复的。
一旦合并结果全绿:清理 worktree(步骤 6),然后删除分支:
选项 2:推送并创建 PR
然后用代码托管平台(forge)的工具针对 <base-branch> 创建 pull/merge request——有 CLI 就用它,没有就用推送时大多数平台会打印出来的创建 URL——遵循仓库里已有的 PR 模板与约定(如果有),并把 URL 报告给你的人类伙伴。
保留 worktree——你的人类伙伴要在那里根据 PR 反馈继续迭代。
选项 3:保持原样
报告:"保留分支 <name>。工作树保留在 <path>。"
如果你的人类伙伴要求丢弃这份工作
这条路只作为对"明确要求把工作扔掉"的响应而存在。 先确认:
等待这个精确的确认词。收到之后:
然后清理 worktree(步骤 6),再强制删除分支:
步骤 6:清理工作区
只对选项 1 和已确认的丢弃执行。 选项 2 和 3 始终保留 worktree。两个调用方都已经切到主仓库根目录了——移除 worktree 必须从 worktree 外面执行——因此这里使用步骤 2 里捕获的 GIT_DIR / GIT_COMMON / WORKTREE_PATH,也就是那次目录切换之前的值。
⚠️ 不要在这里重新计算这些值。 此刻
git rev-parse --show-toplevel返回的是主仓库根目录,不是 worktree 路径 —— 溯源判断会永远匹配不上,清理会静默空转,随后分支删除还会因为 worktree 仍挂着而失败。
如果 GIT_DIR == GIT_COMMON: 普通仓库,无 worktree 可清理。结束。
如果 WORKTREE_PATH 在 .worktrees/ 或 worktrees/ 之下: 这是 Superpowers 创建的 worktree——我们负责清理:
如果删除被拒绝(contains modified or untracked files):这个 worktree 里存着别处都不存在的文件 —— 未提交的计划、笔记或草稿。绝不要自作主张加 --force。 把利害关系摆给你的人类伙伴看,然后问他:
按他选的做完,再删除 worktree。
否则: 这个工作区归宿主环境所有——原地别动。如果你的平台提供了工作区退出工具,用它。


