一个管理客户端模块化开发的Git分支模型

简述

前阵子,掌上生活iOS客户端代码进行了Git迁移。踩了很多坑之后,终于在Git上成功的发布了一个版本,而且还进行了一次紧急发版。所以,趁着下雨的周末,来讲讲踩完坑之后现在的客户端Git分支模型。我不会讲任何项目的细节,比如为什么模块化开发,仅讨论分支策略和版本管理的相关内容。

新『拿来主义』

业界流行的五分支模型图如下:

五分支模型图
五分支模型图

五分支模型对于只管理单个Git仓库的项目来说,分支非常清晰,版本井井有条。
如果项目被模块化后,每一个模块需要被创建Git仓库,那么,一个项目就会管理多个Git仓库;
每次项目发版,有些模块添加了新的功能,这些模块按照五分支模型需要创建release分支进行发布前的测试;但有些模块没有变更,则不需要创建release分支。
这个时候就出现了一个版本中,有些模块是5分支,有些模块却是4分支。
一个项目版本中存在2种分支模型肯定是不允许的,否则版本管理就混乱了。
在项目发版本的时候,如何统一所有模块仓库的分支模型呢?

再见release分支

release分支的定义是为新版本的发布做准备的;
它允许我们在最后时刻做一些细小的修改,允许小bug的修复。
release分支是从达到发布理想状态的develop分支创建出来的;在修复完bug之后,release要合并到master上,同时还要合并到develop上进行代码同步。
假设,master分支把达到发布理想状态的develop分支直接合并,创造出预发布版本;那么,release分支所担当的职责可以由hotfix分支来完成。
按照这个思路,最终确定项目中多Git仓库下的分支模型。如下图:

四分支模型图
四分支模型图

关键分支

关键分支图
关键分支图

在整个项目的周期中,原始库(origin)随着开发的进行一直保持着2个关键分支:

  • master分支
  • develop分支

每一个开发人员都要了解原始的master分支(origin/master)。
master分支并行的另一个分支,我们称为develop分支。
develop分支跟踪着源码的最新开发进度,开发人员会不断的向develop分支合并最新代码。
develop分支的源码到达了一个稳定状态待发布时,所有的代码变更需要以某种方式合并到master分支,然后标记一个版本信息。
master分支记录了所有发布版本的信息,还记录了每个版本的各个阶段,如alpha、beta、rc等。

辅助分支

在这个分支模型中,使用了各种辅助性分支。这些分支与关键分支(masterdevelop)一起,用来支持团队成员们并行开发,使开发的内容易于追踪,快速修复内测Bug和线上版本问题。
与关键分支不同,这些分支总是有一个有限的生命周期,因为他们最终会被移除。
项目中用到的分支类型包括:

  • 特性分支
  • 热修复分支

每一种分支有其特定的目的,并且有严格的创建合并规则,比如:可以用哪些分支作为源分支,哪些分支能作为合并目标。当然,从技术角度来看,这些分支绝不是特殊分支。分支的类型基于我们使用的方法来进行分类。它们理所当然是普通的Git分支。

特性分支(feature)

特性分支图
特性分支图

特性分支通常为即将发布或未来发布版本的新功能特性。其命名规则为feature-*。它包含了如下几种情况:

  • 每天开始开发一部分新功能时,需要创建一个特性分支,在完成当天开发任务后,需要合并到develop分支。这种特性分支生命周期比较短,一般不超过一天。
  • 在开发的过程中发现一种新的实现方式,为了测试可行性可以创建一个特性分支;最终这个特性分支会根据测试结果合并到develop或取消。
  • 有些新功能还无法确定发布时间时,开发这些新功能的特性分支会一直存在下去,直到确定发布时合并到develop分支。

特性分支的实质是只要这个功能处于开发状态它就会存在,但是最终会合并到develop分支或取消(比如一次令人失望的测试)。

特性分支通常存在于开发者本地的代码库中,而不是在源代码库中。

feature分支合并到develop分支上时,我们需要添加一个--no-ff参数,它会在合并过程中强制创建一个空的commit对象,即使该合并操作可以fast-forward。这样避免了在合并过程中丢失特性分支的历史信息,将该分支的所有提交组合在一起。
为了详细说明这种情况,下面有一个比较:

特性分支合并图
特性分支合并图

后一种情况,你不可能从Git历史中一目了然的看出哪些提交一起实现了一个功能,必须手工阅读全部的日志信息。假如我们需要对整个功能进行回退,后一种方式会是一个非常头痛的问题,而使用--no-ff参数的情况则非常容易。

热修复分支(hotfix)

热修复分支演示图
热修复分支演示图

热修复分支通常为正在内测阶段或刚发出的版本修复bug。它的命名规则为hotfix-*
hotfix分支是从master上分出来的;当完成bug修复后,hotfix分支需要合并到masterdevelop分支上去,这样才能保证修复的bug也包含在下一个版本中。

客户端版本管理

客户端项目模块化后,虽然一个项目包含了多个Git仓库,但是统一了每个仓库的分支模型后,版本管理就简单多了。每次发布版本,模块仓库根据主仓库同步打tag,这样只需要遍历所有Git仓库,就可以通过tag拿到任意版本下的所有客户端代码。

总结

虽然这个分支模型没有任何新颖的地方,但是它很好的解决了项目多仓库情况下版本管理的问题。它让团队成员能更多的把精力放在开发上,而不会因仓库分支不同而不断在仓库间同步版本。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,411评论 2 8
  • 翻译:一个成功的Git分支模型 原文链接:http://nvie.com/posts/a-successful-g...
    孙阔阅读 812评论 0 1
  • 介绍Slack,是因为Slack目前最成功的SaaS创业公司。通过对Slack的介绍,我们将探讨SaaS的价值,如...
    青霖2018阅读 1,545评论 0 4
  • 《七绝·春景》 莺翾燕语玉梳妆 晓岸金曦漱渌浆 滟潋青衣何褶皱 春姬醉醒点鸳鸯 【平水韵,下平七阳】 *转载请注明出处
    我那纷纷的思欲阅读 471评论 1 0
  • 选取了湘西比较具有代表性的4种乐器进行可视化,分别是芦笙、咚咚喹、打镏子和苗鼓。每一种乐器都有同的特点,根据自己的...
    luckJanie阅读 482评论 5 2