完成开发分支
完成开发分支
步骤 1:验证测试
确定测试运行器从项目结构:
package.json→npm test或yarn testCargo.toml→cargo testpyproject.toml/setup.py→pytestgo.mod→go test ./...Makefile与test目标 →make test
运行测试。如果有失败,报告 ⊘ BLOCKED:TESTS 附带失败次数并停止。不要进行步骤 2。
步骤 2:确定基础分支
找到这个功能分支从哪个分支分叉出来的:
# 检查哪个分支有最近的合并基础
for candidate in main master develop; do
if git rev-parse --verify "$candidate" >/dev/null 2>&1; then
MERGE_BASE=$(git merge-base HEAD "$candidate" 2>/dev/null)
if [ -n "$MERGE_BASE" ]; then
echo "Candidate: $candidate (merge-base: $MERGE_BASE)"
fi
fi
done
选择具有最近合并基础(最近的共同祖先)的候选分支。如果多个分支共享相同的合并基础或检测结果不明确,询问:“这个分支可以合并到 main 或 develop。应该合并到哪个?”
存储结果 - 后续步骤引用 <base-branch> 意味着这个确定的值。
步骤 3:呈现选项
呈现恰好这 4 个选项:
实现完成。您想做什么?
1. 本地合并回 <base-branch>
2. 推送并创建拉取请求
3. 保持分支原样(我稍后处理)
4. 丢弃这项工作
哪个选项?
步骤 4:执行选择
选项 1:本地合并
git checkout <base-branch>
git pull
git merge <feature-branch>
如果合并冲突:
⊘ BLOCKED:CONFLICTS
合并冲突在:
- <冲突文件>
无法自动解决。用户必须:
1. 手动解决冲突
2. 运行测试
3. 重新运行此工作流
停止。不要继续。
如果合并成功:
# 在合并结果上验证测试
<测试命令>
# 如果测试通过,删除功能分支
git branch -d <feature-branch>
然后:清理工作树(步骤 5)。报告 ✓ MERGED。
选项 2:推送并创建 PR
验证 gh CLI 是否可用:
if ! command -v gh &>/dev/null; then
echo "gh CLI 未安装。从 https://cli.github.com/ 安装或手动推送并通过网络创建 PR。"
exit 1
fi
gh auth status || echo "gh 未认证。运行:gh auth login"
从分支上的第一个提交(原始意图)提取标题:
MERGE_BASE=$(git merge-base HEAD <base-branch>)
TITLE=$(git log --reverse --format=%s "$MERGE_BASE"..HEAD | head -1)
git push -u origin <feature-branch>
gh pr create --title "$TITLE" --body "$(cat <<'EOF'
## 摘要
<2-3 项变更内容>
## 测试计划
- [ ] <验证步骤>
EOF
)"
报告 ✓ PR_CREATED 附带 PR URL。保持工作树不变 以便在审查期间继续工作。
选项 3:保持原样
报告 ✓ PRESERVED 附带分支名称和工作树路径。
不要清理工作树。
选项 4:丢弃
首先确认:
这将永久删除:
- 分支 <name>
- 所有提交:<提交列表>
- 工作树在 <路径>
输入 'discard' 确认。
等待确切确认。如果没有收到,中止。
如果确认:
git checkout <base-branch>
git branch -D <feature-branch>
然后:清理工作树(步骤 5)。报告 ✓ DISCARDED。
步骤 5:清理工作树
仅适用于选项 1 和 4:
# 检查当前是否在工作树(非主仓库)
if [ "$(git rev-parse --git-common-dir)" != "$(git rev-parse --git-dir)" ]; then
# 获取工作树根(处理从子目录调用)
WORKTREE_ROOT=$(git rev-parse --show-toplevel)
cd "$(git rev-parse --git-common-dir)/.."
git worktree remove "$WORKTREE_ROOT"
fi
对于选项 2 和 3: 保持工作树不变。
快速参考
| 选项 | 合并 | 推送 | 保持工作树 | 清理分支 |
|---|---|---|---|---|
| 1. 本地合并 | ✓ | - | - | ✓ |
| 2. 创建 PR | - | ✓ | ✓ | - |
| 3. 保持原样 | - | - | ✓ | - |
| 4. 丢弃 | - | - | - | ✓ (强制) |
终端状态
完成后,报告恰好一个:
| 状态 | 输出 | 含义 |
|---|---|---|
✓ MERGED |
分支合并到 <base>,工作树已清理 |
选项 1 成功 |
✓ PR_CREATED |
PR #N 在 URL | 选项 2 成功 |
✓ PRESERVED |
分支保持在路径 | 选项 3 成功 |
✓ DISCARDED |
分支已删除,工作树已清理 | 选项 4 成功 |
⊘ BLOCKED:TESTS |
N 测试失败 | 不能继续 |
⊘ BLOCKED:CONFLICTS |
文件合并冲突 | 不能继续 |
护栏
阻塞条件(立即停止):
- 测试失败 →
⊘ BLOCKED:TESTS - 合并冲突 →
⊘ BLOCKED:CONFLICTS
强制确认:
- 选项 4(丢弃):需要输入 “discard” 确认
清理规则:
- 选项 1, 4:清理工作树和分支
- 选项 2, 3:保留工作树
永远不要:
- 测试失败时继续
- 未在结果上验证测试就合并
- 未经输入确认就删除工作
- 未经明确请求就强制推送
集成
调用者:
- subagent-driven-development (步骤 7) - 所有任务完成后
- executing-plans (步骤 5) - 所有批次完成后
配合:
- using-git-worktrees - 清理该技能创建的工作树