前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git 代码分支管理规范

Git 代码分支管理规范

作者头像
leon_橙
发布2020-03-02 18:10:00
12.2K0
发布2020-03-02 18:10:00
举报
文章被收录于专栏:Java后台Java后台

Git 是优秀的分布式代码管理软件。但是俗话说,“无规矩不成方圆”,代码分支的管理规范没有制定好,就会带来一系列的问题,比如:

  • 每个人都从 master 分支拉代码进行修改,合并时出现各种冲突,解决起来一堆乱麻,无从下手。
  • 每次发布一个功能就创建新的 feature 分支,各分支之间没有统一的规范,导致整个仓库分支繁杂混乱。
  • 代码提交没有统一的 commit 规范,导致生产问题溯源无法找到对应的修改提交。
  • 线上版本和测试版本甚至 bug 修复版本不能很好的、区别,经常出现测试环境的代码就发布到生产,出现各种生产事故,造成无可挽回的损失。

以上的种种问题都是 Git 分支管理不规范导致的,良好的管理规范能适当减少生产事故,提高研发效率。

首先,我们做一些分工,研发部门的人员分工大致可以分为:

  • 项目组长 - Team Leader
  • 需求开发研发 - Developer
  • 系统集成测试人员 - SIT Tester
  • 系统用户故事测试人员 - UAT Tester
  • 系统运维人员 - Operator

根据研发人员的分工,需要划分每种角色可以操作的环境权限,完善的系统研发环境及权限可以参考以下

环境

权限

备注

DEV

Team Leader,Developer

开发环境,保持最新功能代码部署

SIT

SIT Tester

SIT 测试环境,功能开发完成后部署测试

UAT

UAT Tester

UAT 测试环境,系统发布前的预生产环境,需与生产环境系统配置一致

PROD

Operator

正式生产环境,只有运维人员有操作权限,并且有相应的操作复核,日志审计等管理

其中,每种人员职责各有不同,

  • Leader 主管工程分支创建,分派需求功能开发,代码请求合并,代码 review,在出现合并冲突时,需安排对应开发解决冲突。
  • sit 测试人员主要负责系统集成测试,在开发人员完成功能开发后,及时部署测试,完成相应的 api、异常值、边界值测试等。
  • uat 测试人员是系统发布到生产的最后一环,需要在系统发布之前做整体业务流程性测试,各种业务规则场景下的测试,尽量避免出现业务规则缺陷。
  • 运维人员主导生产环境的系统运维,出现系统问题时及时跟进处理。同时,由于运维人员是直接接触生产环境,需要做好权限管控和操作日志审计,谨防违规,避免出现人们常说的 “删库跑路”。

根据以上人员分工及权限管理,创建对应的分支,其主要分支及命名规范参考以下

分支

命名规范

示例

备注

master

master

master

主分支

develop

develop-***

develop-20200220v1.3

以发布版本命名

release

release-***

release-20200223v2.1

以发布版本命名

feature

feature-***

feature-userinfov2.1

以主要功能点命名

hotfix

hotfix-***

hotfix-userQueryError

以修复功能命名

git flow 流程图参考以下

  • 一个新的项目需求立项后,初始化项目分支,默认创建 master 分支,然后从 master 分支 checkout -b Develop 分支。
  • 每位开发人员认领自己的功能需求,分别从 Develop 分支拉取自己个人分支进行功能编码。敏捷开发强调功能小版本迭代,并行开发。
  • 当研发人员每个 feature 分支完成,开发自测之后,提交 merge request,team leader 经过 code review 确定运行无缺陷后合并到 develop 分支。
  • 此时 sit 测试人员需要从 develop 分支打包最新代码,并部署 sit 测试环境,同步进行功能及接口测试,强调敏捷中的 “测试驱动原则”。
  • 当所有 feature 都已合并并且 sit tester 打包测试无误后,从此时的 develop 分支拉取最新代码同步到 release 分支,并打包代码部署到 UAT 预生产环境进行 uat 测试,测试过程中的缺陷直接在 release 分支进行修复,研发及测试人员对修复的代码进行缺陷回归。
  • release 分支代码回归测试无误后发布上线,同时合并到 master 分支。
  • 此时,一个项目从最初的开发编码到发版上线,整个研发流程确保清晰明了。保证整个研发流程规范,可以大大减少生产事故。
  • 当然,不可避免的也会有生产问题,如果此时出现生产问题,需要直接从 master 分支同步代码至 hotfix 分支,修复生产问题并复测回归。

这种流程下,比较容易出现冲突的场景及解决方案如下:

  • 多 feature 分支并行开发,在提交测试合并至 develop 分支时,容易出现合并冲突。这就要求各研发人员尽量只修改个人功能代码文件。公共配置或公共依赖包应由单独开发人员维护,按需添加,修改合并后推送到各 feature 分支。
  • Hotfix 分支修复的同时有 release 分支功能需要发版上线,合并 master 时容易出现合并冲突。这时按功能生产环境紧急性依次发布上线,发版上线后立即合并 master 并推送到另一分支 (hotfix/release)。

下面我们开始简单的 git flow 实践

  • 首先,创建新的 git flow 代码仓库,输入 git flow init 直接回车,分支都采用默认分支命名。
代码语言:javascript
复制
$ git flow init
Initialized empty Git repository in D:/project/eureka/eurekaclient/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Hooks and filters directory? [D:/project/eureka/eurekaclient/.git/hooks]
  • 现在,看下我们的代码分支,git flow init 完成之后会默认创建 master 分支和和 develop 分支,并切换到 develop 分支。
代码语言:javascript
复制
$ git branch -a
* develop
  master
  • 我们开始一个新的 feature 分支开发,git flow feature start feature-xxx
代码语言:javascript
复制
$ git flow feature start feature-userinfov2.1
Switched to a new branch 'feature/feature-userinfov2.1'

Summary of actions:
- A new branch 'feature/feature-userinfov2.1' was created, based on 'develop'
- You are now on branch 'feature/feature-userinfov2.1'

Now, start committing on your feature. When done, use:

     git flow feature finish feature-userinfov2.1
  • 查看我们的修改状态 git status
代码语言:javascript
复制
$ git status
On branch feature/feature-userinfov2.1
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitignore
        new file:   pom.xml
        new file:   src/main/java/com/eureka/client/Application.java
        new file:   src/main/java/com/eureka/client/controller/Sample.java
        new file:   src/main/resources/application.properties
  • 提交修改 git commit -m"xxx",这里的提交规范需要说明一下: 具体可以参考阮一峰 Commit message 编写指南。 http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html

Commit Masseage 的格式规范

每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。其中,Header 是必需的,Body 和 Footer 可以省略。

Header 部分只有一行,包括三个字段:type(必需)、scope(可选)和 subject(必需)。

  • type,type 用于说明 commit 的类别,只允许使用下面 7 个标识。
  1. feat:新功能(feature)
  2. fix:修补 bug
  3. docs:文档(documentation)
  4. style:格式(不影响代码运行的变动)
  5. refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
  6. test:增加测试
  7. chore:构建过程或辅助工具的变动
  • scope,scope 用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
  • subject 是 commit 目的的简短描述,不超过 50 个字符。

Body 部分是对本次 commit 的详细描述,可以分成多行。

Footer 部分只用于两种情况。

  • 不兼容变动,如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。
  • 关闭 Issue,如果当前 commit 针对某个 issue,那么可以在 Footer 部分关闭这个 issue 。

这是我之前 spring cloud 快速入门的工程文档,所以具体 commit 示例如下:

代码语言:javascript
复制
$ git commit -m"
> feat:add eureka server.
> write eureka server quick start project.
> you can just run application.java, and
> click <localhost:20200>
> Close #1234
> "
[feature/feature-userinfov2.1 f536ada] feat:add eureka server. write eureka server quick start project. you can just run application.java, and click <localhost:20200> Close #1234
 5 files changed, 117 insertions (+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/eureka/client/Application.java
 create mode 100644 src/main/java/com/eureka/client/controller/Sample.java
 create mode 100644 src/main/resources/application.properties

提交完成之后我们将 feature 分支合并到 develop 分支,git flow feature finish feature-userinfov2.1

代码语言:javascript
复制
$ git flow feature finish feature-userinfov2.1
Switched to branch 'develop'
Updating f289480..f536ada
Fast-forward
 .gitignore                                         |  4 ++
 pom.xml                                            | 64 ++++++++++++++++++++++
 src/main/java/com/eureka/client/Application.java   | 18 ++++++
 .../java/com/eureka/client/controller/Sample.java  | 25 +++++++++
 src/main/resources/application.properties          |  6 ++
 5 files changed, 117 insertions (+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/eureka/client/Application.java
 create mode 100644 src/main/java/com/eureka/client/controller/Sample.java
 create mode 100644 src/main/resources/application.properties
Deleted branch feature/feature-userinfov2.1 (was f536ada).

Summary of actions:
- The feature branch 'feature/feature-userinfov2.1' was merged into 'develop'
- Feature branch 'feature/feature-userinfov2.1' has been locally deleted
- You are now on branch 'develop'

从提示信息可以看到,该命令将会把 feature/feature-userinfov2.1 合并到 develope 分支,然后删除功能 (feature) 分支。

当你的功能点都完成时(需要发布新版本了),就基于 develop 创建一个发布 (release) 分支。git flow release start release-20200223v2.1

代码语言:javascript
复制
$ git flow release start release-20200223v2.1
Switched to a new branch 'release/release-20200223v2.1'

Summary of actions:
- A new branch 'release/release-20200223v2.1' was created, based on 'develop'
- You are now on branch 'release/release-20200223v2.1'

Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:

     git flow release finish 'release-20200223v2.1'

现在,我们处于 release 分支,当完成(finish) 一个 release 分支时,git flow 会把你所作的修改合并到 master 分支,同时合并回 develop 分支,所以,无需担心你的 master 分支比 develop 分支更加超前。

代码语言:javascript
复制
$ git flow release finish 'release-20200223v2.1'
Switched to branch 'master'
Merge made by the 'recursive' strategy.
 .gitignore                                         |  4 ++
 pom.xml                                            | 64 ++++++++++++++++++++++
 src/main/java/com/eureka/client/Application.java   | 18 ++++++
 .../java/com/eureka/client/controller/Sample.java  | 25 +++++++++
 src/main/resources/application.properties          |  6 ++
 5 files changed, 117 insertions (+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/eureka/client/Application.java
 create mode 100644 src/main/java/com/eureka/client/controller/Sample.java
 create mode 100644 src/main/resources/application.properties
Already on 'master'
Switched to branch 'develop'
Already up to date!
Merge made by the 'recursive' strategy.
Deleted branch release/release-20200223v2.1 (was f536ada).

Summary of actions:
- Release branch 'release/release-20200223v2.1' has been merged into 'master'
- The release was tagged 'release-20200223v2.1'
- Release tag 'release-20200223v2.1' has been back-merged into 'develop'
- Release branch 'release/release-20200223v2.1' has been locally deleted
- You are now on branch 'develop'

此时我们本地的分支就只有 develop 和 master 了,其他分支在 finish 时会删除。

代码语言:javascript
复制
$ git branch -a
* develop
  master

当系统出现问题的时候,需要进行紧急修改的时候,就好基于 master 创建一个维护(hotfix)分支。

代码语言:javascript
复制
$ git flow hotfix start hotfix-userQueryError
Switched to a new branch 'hotfix/hotfix-userQueryError'

Summary of actions:
- A new branch 'hotfix/hotfix-userQueryError' was created, based on 'master'
- You are now on branch 'hotfix/hotfix-userQueryError'

Follow-up actions:
- Start committing your hot fixes
- Bump the version number now!
- When done, run:

     git flow hotfix finish 'hotfix-userQueryError'

当你在完成(finish) 一个维护分支时,它会把你所作的修改合并到 master 分支,同时合并回 develop 分支。

代码语言:javascript
复制
$ git flow finish hotfix-userQueryError
Switched to branch 'master'
Merge made by the 'recursive' strategy.
 src/main/java/com/eureka/client/Application.java | 1 +
 1 file changed, 1 insertion (+)
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
 src/main/java/com/eureka/client/Application.java | 1 +
 1 file changed, 1 insertion (+)
Deleted branch hotfix/hotfix-userQueryError (was 1718499).

Summary of actions:
- Hotfix branch 'hotfix/hotfix-userQueryError' has been merged into 'master'
- The hotfix was tagged 'hotfix-userQueryError'
- Hotfix tag 'hotfix-userQueryError' has been back-merged into 'develop'
- Hotfix branch 'hotfix/hotfix-userQueryError' has been locally deleted
- You are now on branch 'develop'

总结,以上就是 git flow 代码流程中的一些规范,只有制定了良好的规范,大家按统一的研发流程开发,才能尽量避免出现各种意想不到的问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
项目管理
CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档