zoukankan      html  css  js  c++  java
  • [转载]理解 Git 分支管理最佳实践

    原文

    理解 Git 分支管理最佳实践

    Git 分支有哪些

    在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途。

    分支分类

    根据生命周期区分

    • 主分支:master,develop;
    • 临时分支:feature/*,release/*,hotfix/*;

    根据用途区分

    • 发布/预发布分支:master,release/*;
    • 开发分支:develop;
    • 功能分支:feature/*;
    • 热修复分支:hotfix/*;

    分支的用途

    • master:作为发布分支,随时可以将分支上的代码部署到生产环境上。如果在生产环境上发现问题,则以 master 为基准创建 hotfix/* 分支来修复问题;
    • develop:作为开发分支,所有最新的功能都将在该分支下进行开发,develop 也将是所有分支中功能最全,代码最新的一个分支;
    • feature/*:命名规则feature/功能名称,作为新功能的开发分支,该分支从 develop 创建,开发完毕之后需要重新合并到 develop;
    • release/*:命名规则release/v+发布的版本号,作为预发布分支,release/* 只能从 develop 创建,且在 git flow 中同一个时间点,只能存在一个预发布分支。只有当上一个版本发布成功之后删除该分支,之后才能进行下一个版本的发布。如果在预发布过程中发现了问题,只能在 release/* 分支上进行修改;
    • hotfix/*:命名规则hotfix/v+bug修复的版本号,作为热修复分支,只能从 master 分支分离出来。主要是用来修复在生产环境上发现的 bug,修复完成并测试通过后需要将该分支合并回 develop 及 master 上,并删除该分支;

    Git 分支管理流程

    在上一部分,我们已经明确了每个主分支及辅助分支的用途与来源了,下面我们就来详细了解一下 Git 分支管理的整个流程。
    先来看一下分支在完整的功能开发中是如何演变的:
    Git branch manage diagram

    从上图我们可以看出,我们同时开始了两个功能的开发/研究任务,下面我将以此为基础来讲解分支管理的流程。

    1. 先拉取最新的 develop 分支,然后以最新的 develop 为基准创建两个新的功能分支 feature/f1 和 feature/f2;

      git pull origin develop
      git checkout -b feature/f1 develop
    2. 开发人员在各自的功能分支上进行开发工作,等当前功能分支开发完之后,将当前分支交由测试人员进行测试,测试过程中的问题修复及功能修改均在当前功能分支上进行;

    3. 当 feature/f1 上的开发及测试任务均完成之后,将 feature/f1 合并回 develop ,并删除 feature/f1 ;

      git checkout develop
      git merge --no-ff feature/f1
      git branch -d feature/f1
    4. 从 develop 分支创建新的预发布分支 release/0.2,并部署到预发布环境上测试。在预发布过程中发现问题则直接在 release/0.2 上进行修复;

      git checkout -b release/0.2 develop
    5. 在生产环境中发现一个 bug,从 master 上分离出一个热修复分支 hotfix/bug1,并在上面进行修复、测试并在预发布环境中验证,当都验证通过之后将分支重新合并回 develop 及 master,并在 master 上打一个热修复 tag v0.1.1,最后删除 hotfix/bug1;

      git checkout -b hotfix/bug1 master
      ....................
      ....修复bug..ing....
      ....................
      git checkout develop
      git merge --no-ff hotfix/bug1
      git checkout master
      git merge --no-ff hotfix/bug1
      git tag v0.1.1
      git branch -d hotfix/bug1
    6. 在 feature/f2 分支上的功能 f2 已经开发并测试完成,然后将 feature/f2 合并回 develop,并删除 feature/f2,此时已经存在新功能 f1 的预发布分支 release/0.2,所以需要等待其发布完成之后才能创建预发布分支 release/0.3;

      git checkout develop
      git merge --no-ff feature/f2
      git branch -d feature/f2
    7. 预发布分支 release/0.2 在预发布环境中完全测试通过,随时可以部署到生产环境。但在部署到生产环境之前,需要将分支合并回 develop 及 master,并在 release/0.2 上打一个正式发布版本的 tag v0.2,最后删除 release/0.2;

      git checkout develop
      git merge --no-ff release/0.2
      git checkout master
      git merge --no-ff release/0.2
      git tag v0.2
      git branch -d release/0.2
    8. 当前已经不存在 release/* 预发布分支,所以可以开始功能 f2 的预发布上线。创建预发布分支 release/0.3,并部署预发布环境测试;

      git checkout -b release/0.3 develop
    9. 分支 release/0.3 测试通过,将 release/0.3 合并回 develop 及 master,然后在 master 上打一个正式发布版本的 tag v0.3,最后删除 release/0.3;

    Git Flow

    上述过程中未使用到 git flow,均是以约定的规范流程进行,大家可以尝试使用 git flow 来管理分支。

    #初始化 git flow
    # 设置 feature、release、hotfix、tag 的前缀名
    git flow init
     
    #开始一个新功能 f1 的开发,以 develop 为基准创建 feature/f1
    git flow feature start f1
     
    #....................
    #....f1 功能开发中....
    #....................
     
    #新功能 f1 开发完成
    # 合并回 develop
    # 删除 feature/f1 分支
    git flow feature finish f1
     
    #开始新功能 f1 的预发布验证,版本定为 0.2
    git flow release start 0.2
     
    #新功能 f1 预发布验证通过
    # 合并到 master 分支
    # 在 release 上打 tag v0.2
    # 将 tag v0.2 合并到 develop 分支
    # 删除 release/0.2 分支
    git flow release finish 0.2
     
    #开始 bug1 的修复,以 master 为基准创建 hotfix/bug1
    git flow hotfix start 0.2.1
     
    # bug1 修复完成
    # 合并到 master 分支
    # 在 hotfix 上打 tag v0.2.1
    # 将 tag v0.2.1 合并到 develop 分支
    # 删除 hotfix/0.2.1 分支
    git flow hotfix finish 0.2.1

    至此,Git 分支管理的整个流程已经讲解完,有兴趣的可以看一下具体的分支管理演示 https://github.com/alienwow/gitbranchmanage。 

    如果有上述讲解中任何不正确的地方,欢迎大家批评指正,如有疑问欢迎一起讨论。

    参考文章

    Vincent Driessen A successful Git branching model
    Joe Guo 介绍一个成功的 Git 分支模型

  • 相关阅读:
    Android 废弃方法属性解决
    Android RecycleView分组
    Android 第三方库FlycoTabLayout
    Android 自定义dialog出现的位置
    Android 底部弹窗实现
    Android 自定义设置布局
    Android 微信、qq分享文本 (Intent)
    SpringBoot关于跨域的三种解决方案
    记录一次通用Mapper+自定义mapper出现的问题分析以及排查
    IDEA配置Maven+新建Maven项目
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/9929910.html
Copyright © 2011-2022 走看看