Git 是优秀的分布式代码管理软件。但是俗话说,“无规矩不成方圆”,代码分支的管理规范没有制定好,就会带来一系列的问题,比如:
以上的种种问题都是 Git 分支管理不规范导致的,良好的管理规范能适当减少生产事故,提高研发效率。
首先,我们做一些分工,研发部门的人员分工大致可以分为:
根据研发人员的分工,需要划分每种角色可以操作的环境权限,完善的系统研发环境及权限可以参考以下
环境 | 权限 | 备注 |
---|---|---|
DEV | Team Leader,Developer | 开发环境,保持最新功能代码部署 |
SIT | SIT Tester | SIT 测试环境,功能开发完成后部署测试 |
UAT | UAT Tester | UAT 测试环境,系统发布前的预生产环境,需与生产环境系统配置一致 |
PROD | Operator | 正式生产环境,只有运维人员有操作权限,并且有相应的操作复核,日志审计等管理 |
其中,每种人员职责各有不同,
根据以上人员分工及权限管理,创建对应的分支,其主要分支及命名规范参考以下
分支 | 命名规范 | 示例 | 备注 |
---|---|---|---|
master | master | master | 主分支 |
develop | develop-*** | develop-20200220v1.3 | 以发布版本命名 |
release | release-*** | release-20200223v2.1 | 以发布版本命名 |
feature | feature-*** | feature-userinfov2.1 | 以主要功能点命名 |
hotfix | hotfix-*** | hotfix-userQueryError | 以修复功能命名 |
git flow 流程图参考以下
这种流程下,比较容易出现冲突的场景及解决方案如下:
下面我们开始简单的 git flow 实践
$ 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 branch -a
* develop
master
$ 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
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
Commit Masseage 的格式规范
每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。其中,Header 是必需的,Body 和 Footer 可以省略。
Header 部分只有一行,包括三个字段:type(必需)、scope(可选)和 subject(必需)。
Body 部分是对本次 commit 的详细描述,可以分成多行。
Footer 部分只用于两种情况。
这是我之前 spring cloud 快速入门的工程文档,所以具体 commit 示例如下:
$ 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
$ 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
$ 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 分支更加超前。
$ 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 时会删除。
$ git branch -a
* develop
master
当系统出现问题的时候,需要进行紧急修改的时候,就好基于 master 创建一个维护(hotfix)分支。
$ 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 分支。
$ 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 代码流程中的一些规范,只有制定了良好的规范,大家按统一的研发流程开发,才能尽量避免出现各种意想不到的问题。