git 分支合并策略

前言

git 依靠分布式版本控制、以及出众的分支功能受到互联网开发们的青睐,如果你上过 github 就离不开 git 的相关操作。

我司原来用的是 svn ,经过两年的时间,全项目都已换成 git ,我现在个人项目也全部用 github 和 gitee 。

但是,随着需求迭代周期的不断变化、发布的严格管控、线上问题的紧急修复等,开发分支时刻面临着来自不同需求方的“挑战”,合并到生产分支有时总会出现不可控的问题。

这些问题对开发人员管控代码造成了“不小的困扰”。归根到底就是没有对 git branch 的开发合并策略有个系统的认识。

借如下这张图,聊下 git 分支合并策略:

相信有和我们一样的 git 分支合并问题的同学看过这图后,已经有了解决方案,可以忽略之后的内容了。当然看晕的同学,可以继续阅读下去,我会尽可能说清楚其中的方式。

面临的问题

首先我们前端只是个几个人的团队,分支只有如下两种:

  • develop:开发分支
  • product:发布分支

以前就像前面说的一样,随着团队的逐日专业化,不能扛着小枪指哪打哪儿,面对各种“约束”,“困难”产生了如下些问题:

  • 在开发资源有限的前提下,面对多个需求,如何管理 develop 分支?

  • 线上紧急 bug 的修复(紧急事件对分支的侵入)

  • 怎么维护“相对”稳定的分支,作为发布分支(发布分支的管理)

  • 线上发布后,因为某些“不可抗力”的原因,如何快速回滚上个版本(版本回滚)

应对策略

开发分支的细化

在项目“垦荒”阶段,或者迭代需求有规律,功能“轻量”时,往往一条开发分支就足够了(毕竟我们以前都那么干的),但产品上线后,面对八方的需求就有些捉襟见肘。

比如: A , B 两个需求,A 预估 5 天,B 预估 10 天,但整个开发时间只有 10 天,势必 AB 两个需要不同开发人员同时进行。但更不幸的是,第 5 天时就要把 A 推到生产,一条 develop 分支完全不能应对(总不能 B 需求才完成一半),那怎么管理 develop 分支?

把 A ,B 两个需求单独创建分支,这类分支称为 feature branch ,那我们的 git 代码提交流程就会变成这样:

分别在 develop 分支上创建两条 feature 分支,对应 A,B 需求。这样三条分支在逻辑上互不干涉,如果 feature A 完成后即可推到 develop 上安排测试、发布等事项,feature B 可以继续安心的在属于它的分支上开发。

创建 bug 分支

面对紧急的线上 bug ,可以单独切一条临时的分支做处理,好处就是它对线上或者开发分支做的到“零侵入”。因为直接在 develop 上做 bug 修复,是不可靠的,因为整个团队的开发分支是不断在前行的。

不用去关心 develop 的开发情况,从发布分支直接切出一个干净的 hotfix 分支,用于 bug 的修复,测试无问题后再推到发布分支上线。

稳定的预发布分支

为了防止 product,develop 分支被开发人员在发布前后修改,造成发布代码功能问题,需要一个手段来“冻结”分支,以使其发布前后稳定。总不希望测试环境一切正常,但发布到线上却出现意料之外的问题(这样的事故,也是蛮那个啥的)。

这样的分支分为 release branch

一旦把 develop 合并到 release 预发布分支,将把注意力放到 release 上,后续一切发现的问题将基于此分支进行,因为线上发布将以此为可靠稳定的基础。

为了让 稳定 不口头上说说,甚至可以将 release 立为保护分支(protect branch),所有的 push 请求将由项目管理人员来负责审核。

版本回退

和紧急 bug 修复类似,但有些不同。如果某些非开发原因(需求部门临时决定不上新功能等),需要把线上已发布的代码“撤下来”,但开发分支、或者发布分支都已经经历多次提交合并,已经难以定位之前的代码(除非有上次代码的备份记录,但这属于另一个范畴的问题)。需要有一种机制来快速回滚,可能上一次,可能上个月某天的发布。

为实现快速回滚,就要涉及 git 中 tag 的运用。

tag 顾名思义,给分支当前的状态打个标。并没有创建出一个新的节点,只是添加一些“备注”。

如果遇到 B 需求到了上线那天并且发布了,但因为突发情况需要回退到上次版本,所有的分支都做了合并,注意力都放在 B 需求的迭代,单纯的根据提交信息来回退代码是具有风险性的,最可靠的还是找到上次发布的代码来回滚。此时 tag 标签就发挥作用,如果上次发版在发布分支打了标签 1.0,这次就执行如下命令,就轻松回退:

1
2
git reset --hard 1.0 # 将 HEAD 回退到 tag 1.0 时的代码状态
git push --force origin master # 覆盖主线分支

总结

理解 git 分支合并策略将对项目代码的管控更为“自由”,虽然操作会复杂,但这些却是一定要做的。相信会在遇到上述这些问题时,起到确定性作用。

【长按关注】看看↓↓↓?
Eminoda wechat
【前端雨爸】分享前端技术实践,持续输出前端技术文章
欢迎留言,评论交流,一起讨论前端问题
📢 因为是开源博客,为避免 Gitalk授权 带来的 安全风险,也可访问