GIT分支管理及发版合并流程 (分支类型)

890 阅读9分钟

分支类型

master主分支:通常是 master 或 main 分支,用于存放稳定的、可部署的代码。主分支应该是非常稳定和可靠的,只包含已经经过测试和验证的代码。
release发布分支:用于准备发布新版本的分支。从开发分支创建发布分支,进行版本准备、测试和修复 bug,最终将发布分支合并回主分支和开发分支。
develop开发分支:用于整个团队的开发工作。开发分支是各个开发者合作的主要分支,包含最新的功能和修复。
feature功能分支:用于开发特定功能或实现特定需求的分支。当需要开发新功能时,从开发分支创建特性分支,完成开发后再合并回开发分支
hotfix修复分支:用于紧急修复生产环境中的 bug。从主分支创建修复分支,进行修复后将其合并回主分支和开发分支。

Vincent Driessen是Git Flow分支模型的创造者

Vincent Driessen在2010年提出了Git Flow,这是一种构建在Git之上的软件开发模型。它通过利用Git创建和管理分支的能力,为每个分支设定了明确的生命周期和作用,以适应不同的开发阶段和需求。Git Flow模型包括以下几个关键分支:

  1. master分支:对应生产环境的线上代码,所有开发代码最终都会合并到master分支并发布。
  2. develop分支:作为功能开发的主线,新功能开发都在这个分支上进行,准备合并到master分支的预发布代码所在的地方。
  3. feature分支:从develop分支拉出,用于开发单一功能的分支。
  4. release分支:当develop分支达到一个稳定状态,可以为其发布新版本时,就会创建一个release分支。
  5. hotfix分支:用于快速修复master分支上的问题,直接基于master分支创建。

然而,随着软件开发实践的演进,特别是持续集成和持续交付(CI/CD)的普及,Vincent Driessen自己也指出,Git Flow可能不再适用于当前的软件开发模式。他推荐更简单的模型,如Github Flow,这种模型更适合快速迭代和频繁发布的项目。

总的来说,Vincent Driessen的贡献在于为软件版本控制提供了一个清晰、结构化的框架,尽管随着时间的推移和开发模式的变化,他所提出的模型也在不断地被重新评估和更新。

开发环境

  • 本地开发环境
  • 测试环境 (内测)
  • 预发布环境 (外测)
  • 生产环境

版本合并流程

两大主分支、三个辅助分支的生命周期

Git

  Git Flow常用的分支

  • Production 分支

  也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改

  • Develop 分支

  这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支

  • Feature 分支

  这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release

  • Release分支

  当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支

  • Hotfix分支

  当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release

  Git Flow如何工作

  初始分支

  所有在Master分支上的Commit应该Tag ;当一个项目达到一个稳定的发布状态时,通常会在此时创建一个tag来标记这个时间点的代码状态。这有助于后续的版本控制和回溯。

  

  Feature 分支

  分支名 feature/*

  Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删掉这个Feature分支,但是我们也可以保留

  

  Release分支

  分支名 release/*

  Release分支基于Develop分支创建,打完Release分之后,我们可以在这个Release分支上测试,修改Bug等。同时,其它开发人员可以基于开发新的Feature (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

  发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。

  

  维护分支 Hotfix

  分支名 hotfix/*

  hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag

  

  Git Flow代码示例

  a. 创建develop分支

    git branch develop
    git push -u origin develop

  b. 开始新Feature开发

 git checkout -b some-feature develop
 git push -u origin some-feature
 git status git add some-filegit commit

  c. 完成Feature

>   git pull origin develop
>   git checkout develop
>   git merge --no-ff some-featuregit push origin develop
>   git branch -d some-feature>
>   push origin --delete some-feature

  d. 开始Relase

>   git checkout -b release-0.1.0 develop

  e. 完成Release

>   git checkout master
>   git merge --no-ff release-0.1.0
>   git push
>   git checkout develop
>   git merge --no-ff release-0.1.0
>   git push
>   git branch -d release-0.1.0>
>   git push origin --delete release-0.1.0
>   git tag -a v0.1.0 master
>   git push --tags

  f. 开始Hotfix

>   git checkout -b
>   hotfix-0.1.1 master
``

  g. 完成Hotfix


```js
>   git checkout master
>   git merge --no-ff hotfix-0.1.1
>   git push
>   git checkout develop
>   git merge --no-ff hotfix-0.1.1
>   git push git branch -d hotfix-0.1.1
>   git tag -a v0.1.1 master
>   git push --tags

  Git flow工具

  使用

  • 初始化: git flow init

  • 开始新Feature: git flow feature start MYFEATURE

  • Publish一个Feature(也就是push到远程): git flow feature publish MYFEATURE

  • 获取Publish的Feature: git flow feature pull origin MYFEATURE

  • 完成一个Feature: git flow feature finish MYFEATURE

  • 开始一个Release: git flow release start RELEASE [BASE]

  • Publish一个Release: git flow release publish RELEASE

  • 发布Release: git flow release finish RELEASE

      别忘了git push --tags

  • 开始一个Hotfix: git flow hotfix start VERSION [BASENAME]

  • 发布一个Hotfix: git flow hotfix finish VERSION

  

  Git Flow GUI

  GUI 工具

  SourceTree

  当你用Git-flow初始化后,基本上你只需要点击git flow菜单选择start feature, release或者hotfix, 做完后再次选择git flow菜单,点击Done Action. 我勒个去,我实在想不到还有比这更简单的了。

  目前SourceTree支持Mac, Windows, Linux.

3.分支/tag命名

3.0 主干分支

master-v{版本号}-{日期}

  • 主版本号(Major):没有具体限制,可以增长到很大的数值。
  • 次版本号(Minor):没有具体限制,可以增长到很大的数值。
  • 修订号(Patch):建议数值增长到 999。
3.1.功能分支

m-{JIRA-NUM}-{功能},示例: m-KaigejavaCRM-1014-Hystrix m-{功能},示例:d-Hystrix

JIRA-NUM通常指的是在JIRA项目管理工具中分配给每个问题或任务的唯一编号

JIRA是一款由Atlassian开发的项目管理和缺陷跟踪工具,它广泛应用于软件开发和其他类型的项目管理。JIRA的功能强大,包括项目计划、任务分配、需求管理、错误跟踪等,并且支持敏捷开发流程。它的灵活性和全面性使得全球超过19,000家客户选择使用JIRA作为他们的项目管理工具。

在JIRA中,每个任务或问题都会被分配一个唯一的编号,即JIRA-NUM。这个编号用于追踪和管理问题,确保团队成员可以快速定位和沟通相关的工作项。用户可以通过这个编号来查找问题的状态、历史记录、相关评论以及与之关联的所有文档和附件。

总的来说,JIRA-NUM是JIRA系统中一个重要的组成部分,它帮助团队有效地管理和跟踪项目中的各项工作。

3.2.开发分支

m-{JIRA-NUM}-{功能}-{developer},示例: m-KaigejavaCRM-1014-Hystrix-wangning m-{禅道项目ID}-{功能}-{developer},示例: m-KaigejavaCRM-1014-Hystrix-wangning

3.3.修改线上bug分支

m-{JIRA-NUM}-{问题} ,示例: m-KaigejavaCRM-1014-hystrix-npe

3.4.tag版本号

v{版本号}-{日期} ,版本号使用十进制。示例: v1.2.9-20190401

软件版本号一般由四部分组成,格式如:主版本号.子版本号.修订版本号.日期版本号+希腊字母版本号。

举个例子:1.2.3.20230128_beta

说明:

第一位(1): 主版本号。当功能模块有较大的变动,API 的兼容性发生变化时,比如增加多个模块或者整体架构发生变化。此版本号由项目决定是否修改,且只能递增。

第二位(2): 子版本号。当功能有一定的增加或变化,但是不影响 API 的兼容性,比如增加了对权限控制、增加自定义视图等功能。此版本号由项目决定是否修改,且只能递增。

第三位(3): 修订版本号。一般是 Bug 修复或是一些小的变动,不影响 API 的兼容性,要经常发布修订版,时间间隔不限,修复一个严重的 Bug 即可发布一个修订版。此版本号由项目经理决定是否修改,且只能递增。

日期版本号(20230128): 用于记录修改项目的当前日期,每天对项目的修改都需要更改日期版本号。此版本号由开发人员决定是否修改。

希腊字母版本号(beta): 也叫里程碑版本号,此版本号用于标注当前版本的软件处于哪个开发阶段,当软件进入到另一个阶段时需要修改此版本号。此版本号由项目决定是否修改。

希腊字母版本号共有5种,分别为:Base、Alpha、Beta、RC、Release。

Base 版: 此版本表示该软件仅仅是一个基础框架,通常包括主要功能和结构,但是都没有做完整的实现,只是作为程序设计的一个基础架构。

Alpha 版: 此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流,一般不向外部发布,是内部测试版,该版本软件的 Bug 较多,需要继续修改。

Beta 版: 该版本相对于 Alpha 版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,是公开测试版,需要经过多次测试来进一步消除,这个阶段的版本会一直加入新的功能。

RC 版: (Release   Candidate)最终测试版本,该版本已经相当成熟了,基本上不存在导致错误的 BUG,与即将发行的正式版相差无几。

Release 版: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release 不会以单词形式出现在软件封面上,取而代之的是符号(R)。

4. 项目 -》 版本 -》程序 -》分支