Skip to content

开发工作"做完"和"安全收尾"不是同一件事。安全收尾的核心流程只有三步:验证测试通过 → 明确选择后续方式(合并/PR/保留/丢弃)→ 清理工作区。跳过任何一步都可能留下隐患——带着失败测试合并、遗留大量孤立分支、或者意外删掉还没推送的提交。本文把这套流程拆开讲清楚,帮你在每个分支收尾时都能踩实每一步。

finishing-a-development-branch:开发完成后怎么安全收尾

很多人在功能开发完成后的操作是"感觉差不多了,直接合进去"。问题就藏在这个"感觉"里:测试真的全过了吗?分支历史清楚吗?worktree 还挂在那里没清?这些细节积累起来,就是日后难以定位的技术债。

finishing-a-development-branch 这个 skill 把收尾过程标准化为四步,确保每次交付都可验证、可追溯、工作区干净。


第一步:先跑测试,不通过就停下

在做任何收尾决策之前,必须先把项目的测试套件跑一遍。

bash
# 根据项目技术栈选对应命令
npm test
cargo test
pytest
go test ./...

如果有测试失败,不进入下一步。把失败清单列出来,先修复,再重新跑一遍确认全绿。带着失败测试合并只是在给自己埋雷——后来的人不知道这是"预期失败"还是新引入的问题。

只有全部测试通过,才继续往下走。


第二步:确认基础分支

在选择收尾方式前,需要知道当前分支是从哪里拉出来的。

bash
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master 2>/dev/null

如果项目有其他约定(比如从 develop 分支),直接确认一下即可。基础分支搞错了,后续合并或 PR 的目标就会出问题。


第三步:选择收尾方式

测试全过之后,有四种选择,每种对应不同的场景和后续操作。

选项 1:本地合并回基础分支

适合:个人项目、不需要 code review 的小改动、或者只是在本地整理分支。

bash
git checkout main          # 切回基础分支
git pull                   # 拉最新
git merge feature-branch   # 合并
# 合并后再跑一次测试,确认合并结果没有引入新问题
git branch -d feature-branch   # 删除已合并的分支

合并后的测试验证是关键——两个分支分别测试通过,合并结果不一定通过。

选项 2:推送并创建 Pull Request

适合:团队项目、需要 review、或者想通过 CI 再验证一遍。

bash
git push -u origin feature-branch

gh pr create --title "feat: ..." --body "$(cat <<'EOF'
## Summary
- 改动点 1
- 改动点 2

## Test Plan
- [ ] 验证步骤 1
- [ ] 验证步骤 2
EOF
)"

PR 描述写清楚"改了什么"和"怎么验证",review 的人才能高效给出反馈。

这个选项不删除本地分支,也不清理 worktree——PR 合并之前分支还需要保留。

选项 3:暂时保留,稍后处理

适合:工作还没做完、需要等待外部依赖、或者想先切去做别的事。

直接结束当前工作,不做任何合并或删除操作。worktree 也保留原样。

唯一的要求是:知道这个分支在哪,以及为什么保留。不然几周后回来,自己都不记得这个分支是干什么的。

选项 4:丢弃这次工作

适合:方向走错了、需求变了、这只是一次探索性尝试。

丢弃操作不可逆,必须先确认。 确认前需要列出:

  • 分支名称
  • 所有提交记录(git log --oneline
  • worktree 路径

确认无误后再执行:

bash
git checkout main
git branch -D feature-branch   # 大写 D 是强制删除

第四步:清理 worktree

使用了 git worktree 的场景,收尾时需要一并清理。

先检查当前分支是否有 worktree:

bash
git worktree list | grep $(git branch --show-current)

如果有,根据选择决定是否清理:

收尾方式worktree 处理
本地合并(选项 1)清理
创建 PR(选项 2)保留(PR 还在)
暂时保留(选项 3)保留
丢弃(选项 4)清理
bash
# 清理时执行
git worktree remove <worktree-path>

为什么这套流程是必要的

不跑测试就合并——最常见的问题。功能在本地手动试过没问题,但没跑自动化测试,合并后 CI 挂了,定位成本远高于提前验证的成本。

给四个选项,而不是问"接下来怎么办"——开放式问题容易让人陷入犹豫或遗漏选项。四个具体选项覆盖了所有常见场景,做决定更快。

丢弃前要求明确确认——强制写出"放弃什么",避免手误删掉还没推送的重要工作。

选项 2/3 不清理 worktree——PR 还在审阅中,或者工作还要继续,这时候删 worktree 会打断工作流。


快速参考

选项合并到本地推送/PR保留 worktree删除分支
1. 本地合并-是(正常删除)
2. 创建 PR-
3. 暂时保留--
4. 丢弃--是(强制删除)

FAQ

Q: 测试跑了很久,可以先合并再看结果吗?

A: 不建议。测试跑慢是另一个需要解决的问题,但跑慢不能成为跳过验证的理由。可以用 --testPathPattern 之类的参数先跑相关测试子集,确认核心路径没问题后再等完整结果。

Q: 选项 2 创建了 PR,PR 合并之后怎么清理?

A: PR 合并后,远端分支通常会被自动删除(取决于仓库配置)。本地分支可以用 git branch -d feature-branch 删除,worktree 也可以在 PR 合并后一并清理。

Q: 选项 4 丢弃后发现其实不该丢,能找回来吗?

A: 如果分支已推送过,可以从远端找回。如果只在本地,git reflog 可以看到被删除的提交哈希,用 git checkout -b 新分支名 <commit-hash> 恢复。但这是应急操作,不是常规手段——丢弃前的确认环节就是为了避免这种情况。

Q: 这套流程和 CI/CD 冲突吗?

A: 不冲突,而是互补。本地测试验证的是"代码在本机能跑通",CI 验证的是"在干净环境、标准配置下也能跑通"。两个都要。