Git 分支策略与协作规范
【摘要】 Git 分支策略与协作规范分支模型没有银弹,只有和团队规模、发布节奏匹配的取舍。本文给出两套可直接采用的模型,以及提交信息、合并、救场的具体做法。 一、两套主流模型Trunk-Based(主干开发):所有人频繁(至少每天)合入 main,未完成功能用 Feature Flag 隐藏,发布直接从主干打 tag。优点代价冲突小、集成早需要完善的自动化测试天然适配持续部署需要开关管理能力分支寿命...
Git 分支策略与协作规范
分支模型没有银弹,只有和团队规模、发布节奏匹配的取舍。本文给出两套可直接采用的模型,以及提交信息、合并、救场的具体做法。
一、两套主流模型
Trunk-Based(主干开发):所有人频繁(至少每天)合入 main,未完成功能用 Feature Flag 隐藏,发布直接从主干打 tag。
| 优点 | 代价 |
|---|---|
| 冲突小、集成早 | 需要完善的自动化测试 |
| 天然适配持续部署 | 需要开关管理能力 |
| 分支寿命短,认知负担低 | 未完成代码要靠开关隔离 |
Git Flow(分支开发):main / develop 长期存在,配 feature、release、hotfix 三类临时分支。
| 优点 | 代价 |
|---|---|
| 版本边界清晰 | 合并链路长、冲突积累 |
| 适合固定版本发布(App、客户端) | 与持续部署冲突 |
| 无需开关机制 | 长期分支容易「合并不动」 |
选择建议:Web 服务、能随时发布 → Trunk-Based;有明确版本号、需同时维护多个线上版本(如 App、小程序、私有化交付) → Git Flow 或简化的 release 分支。
二、推荐的日常流程(Trunk-Based 简化版)
# 1. 从最新主干拉短命分支
git switch main && git pull --rebase
git switch -c feat/order-export
# 2. 小步提交,提交前先跑本地检查
git add -p # 分块暂存,避免夹带无关改动
git commit -m "feat(order): 支持按时间范围导出订单"
# 3. 推送并发起 MR/PR
git push -u origin feat/order-export
# 4. 合入前同步主干(保持线性历史)
git fetch origin && git rebase origin/main
git push --force-with-lease # 比 --force 安全:远端有他人更新时会拒绝
git pull --rebase与--force-with-lease是两条最值得写进团队规范的习惯:前者避免无意义的合并提交,后者避免覆盖同事的推送。
三、提交信息规范(Conventional Commits)
<type>(<scope>): <subject>
<body:为什么这么改,必要时写>
<footer:关联 issue / BREAKING CHANGE>
| type | 用途 |
|---|---|
| feat | 新功能 |
| fix | 缺陷修复 |
| refactor | 既不修 bug 也不加功能的结构调整 |
| perf | 性能优化 |
| docs / test / chore / build | 文档、测试、杂务、构建 |
规范的实际收益是自动生成 changelog 和语义化版本号,以及半年后 git log 还能看懂。反例:update、fix bug、111、asdf。
四、合并方式怎么选
| 方式 | 结果 | 适用 |
|---|---|---|
| Merge commit | 保留完整分支拓扑 | 长期分支合回主干,需保留合并节点 |
| Squash merge | 分支压成一个提交 | MR 内提交碎片多,主干要干净 |
| Rebase merge | 线性历史,逐提交保留 | 提交本身已足够规整 |
团队统一一种即可,混用最容易让 git log --graph 变成蜘蛛网。
五、常见救场命令
git reflog # 找回「误删分支 / 误 reset」的提交,第一反应应该是它
git restore --staged <file> # 取消暂存
git commit --amend --no-edit # 只改最近一次提交(未推送时)
git revert <sha> # 已推送的提交用反向提交撤销,不要 rewrite 公共历史
git stash push -m "WIP" # 临时切任务
git bisect start / bad / good # 二分定位引入 bug 的提交
红线:已推送到共享分支的历史,不用 rebase + force push 改写,用 revert。
六、常见坑与对策
| 坑 | 对策 |
|---|---|
| 分支活了一周以上 | 拆小任务;大功能用开关分多次合入 |
| 一个提交混了重构和功能 | git add -p 分块,CR 才看得动 |
| 把构建产物 / 密钥提交进仓库 | .gitignore + 提交前扫描;密钥泄露要轮换而非只删文件 |
| 直接向 main 强推 | 分支保护:强制 CR、强制 CI 通过、禁止 force push |
| 冲突靠「删掉别人代码」解决 | 冲突时拉上对方一起看,别独自决定 |
七、落地检查清单
- [ ] 主干设置保护规则:至少 1 人评审 + CI 通过
- [ ] 团队统一提交信息格式,并有 lint 校验(commitlint)
- [ ]
.gitignore覆盖依赖目录、构建产物、本地环境文件、IDE 配置 - [ ] 每个版本打 tag,tag 能对应到发布记录
- [ ] 有文档写明「线上出问题时如何 cherry-pick / revert 热修」
八、小结
分支策略的目标只有一个:让集成尽可能早、尽可能频繁地发生。任何让代码在分支里躺更久的流程,都在把风险攒到最后一刻。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)