如今愈来愈多的项目使用Git做为版本控制的工具,经过Git进行分支和Tag管理,大多数状况这个过程都由手工完成,缺少相应的规范,对于分支和版本号的控制也很随意,出现这样的状况每每是你们对软件交付过程当中的软件版本控制不够重视,“只要确保软件是最新的版本便可”,甚至是项目管理的漏洞或者缺陷。其实软件的版本控制以及分支管理贯穿于整个软件产品的生命周期,平常的项目管理对于开发团队可否有节奏且顺利的交付软件也很重要。git
的确!频繁的冲突搞的开发人员头晕脑胀,例如,一次项目在代码合并时出现了冲突,致使整个项目组挨个排查,花费了大半天的时间,影响开发效率还浪费资源;开发人员随意建立分支,各类不规范的合并使得Git Graph线条杂乱无章,彻底看不出来主干发展的脉络;提交信息混乱,不知道此次提交是由于什么,实现了什么功能 ,解决了什么问题。程序员
本文并非一篇技术文章,其中也没有让别人耳目一新的观点或者论述。本文是为咱们这些但愿进行简单、有效地协做的人准备的。任何参与到软件开发的人,不管承担何种角色,均可能对其感兴趣——毕竟每一个人都会用到分支和合并。本文将结合Choerodon猪齿鱼为你们阐述如何进行方便有效的分支管理和版本控制,以及如何选择适合自身的版本控制模型。安全
如何来解决这些问题呢?工具
有经验的老司机可能会说,“创建规范”。单元测试
是的,只有创建规范,才能抑制很差的事情继续在项目组蔓延。至于创建什么样的规范?咱们不妨先制定一个目标。测试
做为一个有经验项目管理者,或者产品负责人,你必定会思考一个问题:咱们项目组在开发过程当中应如何管理分支?不错,分支管理将和项目组开发人员日夜伴随,若是采用了一个不合适的分支管理模型,那么能够想象兄弟们得多么的痛苦。spa
Okay,那么就从分支管理模型开始......命令行
GitFlow、GitHubFlow等都是已经被证实颇有效的分支管理模型,可是这些更多的是书面的规则、约定,基本上是靠着程序员的自觉性和Git命令一块儿维持着这个约定,其实无数的经验告诉咱们“这很脆弱”。因此,如何使用系统界面化操做将这些规则和约定表示出来,就变得颇有意思。3d
不要着急,先来看看 Choerodon 猪齿鱼提供的分支模型,Choerodon使用 GitLab 进行分支管理,默认分支为 master。目前支持七种常见的分支类型:版本控制
注:
这7个分支就是咱们手中的7个魔方,经过这7个魔方的组合能够变化出无尽的分支管理模型,好比GitHubFlow。
GitHubFlow分支模型只存在一个master主分支,平常开发都合并至master,永远保持其为最新的代码。
这个分支模型的优点在于简洁易理解,将master做为核心的分支,代码更新持续集成至master上。根据目前收集到的反应来看,获得了更多的好评,认为GitHubFlow分支模型更加轻便快捷。
若是GitHubFlow不合适,可使用GitLabFlow或者GitFlow,也能够自行定义规则。这里没有“银弹”,只是相对比较灵活的配置。
有了分支管理模型,还须要命名规约,不一样类型的分支命名方式应该不一样,值得庆幸的是,猪齿鱼已经帮你完成了这个步骤。feature、bugfix分支的分支名使用的是关联问题的issue号(在猪齿鱼中打通了需求和代码分支的关连关系),对于release及hotfix,分支名可命名为须要发布的版本号,如0.8.0、0.8.1等。在这里使用到了相似0.8.0这样的版本编号规则,若是你对此不了解,没有关系,在下面将详细的介绍。
除了分支的名称须要规范,提交的命名也一样如此。不幸,猪齿鱼并无把这个规则固化到系统中,须要团队共同遵照。
格式为:[操做类型]操做对象名称,如[ADD]readme,表明增长了readme描述文件。
常见的操做类型有:
合并请求是开发过程当中必不可少的一个环节,其中有以下一些重要的事情要作:
启动CI
在软件管理的领域里存在着被称做“依赖地狱”的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在将来的某一天发现本身已深陷绝望之中。 —— Tom Preston-Werner 的《语义化版本2.0.0》
在这里咱们不去解读到底什么是“依赖地狱”,你们能够到语义化版本2.0.0中了解。那么,咱们的重点是什么呢?在这以前,先了解一下“语义化的版本控制”
版本格式:主版本号.次版本号.修订号,版本号递增规则以下: 1.主版本号:当你作了不兼容的 API 修改, 2.次版本号:当你作了向下兼容的功能性新增, 3.修订号:当你作了向下兼容的问题修正。 先行版本号及版本编译信息能够加到“主版本号.次版本号.修订号”的后面,做为延伸。
这就是“语义化的版本控制”最核心的规则,固然这不是所有,Tom Preston-Werner还详细的阐述了主版本号、次版本号和修订号的变化递增规则,不过这些规则很长,很复杂。
没有关系,猪齿鱼帮咱们作了这些复杂的事情,将“语义化的版本控制”固化到了系统中,简而言之,
将版本号规则定为年.月.日-时分秒-分支名
。如:2018.7.20-152837-hotfix-0.8.1
,这个时间是当前提交时间。当代码提交到各个分支上时会自动触发CI,生成版本号规则如上所示。
当须要发布新版本时,例如如0.8.0
、0.8.1
一直以来,需求通常和系统的功能联系在一块儿,可是与代码关连却不常见,若是能将需求和代码联系在一块儿,奇妙的化学反应就发生了。
“咱们能够追溯到一个用户故事对应了哪些分支,哪几个提交”,
“甚至出现了一些BUG,能够找到是哪一个分支提交的,当初为了发布XXX新的需求”,
“不只如此,咱们经过需求与代码分支关连,可以查看到哪些需求已经部署到了测试环境,那些需求已经部署到了正式环境”,
“能够作从业务到代码的整个链条的统计分析...”
...
这一切,猪齿鱼已经帮助项目管理者和程序员实现了。在猪齿鱼的敏捷管理服务中,能够经过用户故事、任务、缺陷等直接一键建立分支,而后,你能够从git checkout -b 开始愉快而又有挑战的一天。不只如此,也能够在分支管理中,将现有的分支关连到用户故事、任务或者缺陷。
回顾一下咱们的目标,简单、灵活、可视化,以及需求与代码关连。版本控制一直都是一件提及来容易,作起来难的事情,可是咱们作到了,重要的是猪齿鱼将这些特色和规则固化到了DevOps流程中,让咱们忘记复杂易错的操做,把精力放到业务开发上。但愿咱们的分享可以给你们带来帮助。