完成开发分支Skill finishing-a-development-branch

Git 分支完成工作流。当实现完成、测试通过且需要通过合并、拉取请求或清理将功能分支集成时使用。

DevOps 0 次安装 10 次浏览 更新于 3/2/2026

完成开发分支

完成开发分支

步骤 1:验证测试

确定测试运行器从项目结构:

  • package.jsonnpm testyarn test
  • Cargo.tomlcargo test
  • pyproject.toml / setup.pypytest
  • go.modgo test ./...
  • Makefiletest 目标 → 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

选择具有最近合并基础(最近的共同祖先)的候选分支。如果多个分支共享相同的合并基础或检测结果不明确,询问:“这个分支可以合并到 maindevelop。应该合并到哪个?”

存储结果 - 后续步骤引用 <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 - 清理该技能创建的工作树