项目代码release包括三类:
git 流程模式有两种:一种是Git flow
工作流,一种是Github flow
工作流。
@startuml
actor "person-repo"
participant "feature"
participant "develop"
participant "release-x.x"
participant "hotfix"
participant "master"
control "预发布环境"
control "生产环境"
master -> develop: checkout
develop -> "person-repo": pull
"person-repo" -> "person-repo": commit
"person-repo" -> develop: merge requests
develop -> feature: checkout(功能开发)
feature -> "person-repo": pull
"person-repo" -> "person-repo": commit
"person-repo" -> feature: merge requests
feature -> develop: merge
develop -> "release-x.x": checkout(版本发布)
"release-x.x" -> "person-repo": pull
"person-repo" -> "person-repo": fix bug
"person-repo" -> "release-x.x": merge requests
"release-x.x" --> "预发布环境": 测试
"release-x.x" -> master: merge
master --> "生产环境": 部署测试
"release-x.x" -> develop: merge
master -> "hotfix": checkout(线上bug紧急修复)
"hotfix" -> "person-repo": pull
"person-repo" -> "person-repo": fix bug
"person-repo" -> "hotfix": merge requests
"hotfix" -> master: merge
master --> "预发布环境": 测试
master --> "生产环境": 部署发布
"hotfix" -> develop: merge
@enduml
步骤
创建功能分支
# 从develop创建功能分支
$ git checkout -b myfeature develop
完成功能分支,合并develop,并推送到远程仓库
# 切换到develop分支
$ git checkout develop
# develop分支合并功能分支
$ git merge --no-ff myfeature
# 删除功能分支
$ git branch -d myfeature
# 推到远程仓库
$ git push origin develop
版本发布前,创建版本分支
# 从develop分支切到版本发布分支
$ git checkout -b release-1.2 develop
完成版本测试后,合并到master分支上
# 切换到master
$ git checkout master
# master合并release分支
$ git merge --no-ff release-1.2
# 给master分支打tag
$ git tag -a 1.2
生产环境测试没有问题后,将release分支合并会develop分支,并删除release分支
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff release-1.2
# 删除release分支
$ git branch -d release-1.2
生产环境上发现bug,直接通过hotfix快速修复:
# 从master切出一条分支,紧急修复问题
$ git checkout -b hotfix-1.2 master
完成问题修复后,合并进master:
# 切到master分支
$ git checkout master
# master分支合并hotfix分支
$ git merge --no-ff hotfix-1.2
# 打上新tag
$ git tag -a 1.2
# 切换到develop分支
如果当前release分支还未删除,合并到release分支,再由release分支合并到develop分支:
$ git checkout release-1.2
# release-1.2合并hotfix分支
$ git merge --no-ff hotfix-1.2
# 删除hotfix分支
$ git branch -d hotfix-1.2
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff release-1.2
如果release分支已删除,则直接合并到develop分支:
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff hotfix-1.2
# 删除hotfix分支
$ git branch -d hotfix-1.2
优点:
缺点:
面对git flow的繁琐,github flow分支模型仅具有功能分支和主分支,将所有内容合并到master分支中并进行部署,采用pull request方式进行代码合并,强调持续集成和连续交付。
优点:
缺点:
结合了git flow分支模型和github flow分支模型:
@startuml
actor "person-repo"
participant "master"
participant "release-x.x.x-alpha"
participant "release-x.x.x"
control "stage预发布环境"
control "pre-production"
control "生产环境"
master -> "person-repo": fork
"person-repo" -> "person-repo": commit
"person-repo" -> master: merge requests
master -> "stage预发布环境": 自动化测试CI
"stage预发布环境" -> master: 测试通过+code review
master -> "release-x.x.x-alpha": cherryPick
"release-x.x.x-alpha" -> "pre-production": 部署
"pre-production" -> "pre-production": 测试
"pre-production" --> "release-x.x.x-alpha": 测试不通过
"release-x.x.x-alpha" -> "person-repo": pull
"person-repo" -> "person-repo": fix bug
"person-repo" -> "release-x.x.x-alpha": merge requests
"release-x.x.x-alpha" -> "pre-production": 部署
"pre-production" -> "pre-production": 测试
"pre-production" --> "release-x.x.x-alpha": 测试通过
"release-x.x.x-alpha" -> "release-x.x.x": checkout -b
"release-x.x.x" -x "release-x.x.x-alpha": 删除分支alpha分支
"release-x.x.x" -> "生产环境": 部署
"生产环境" --> "生产环境": 测试
"生产环境" --> "release-x.x.x": 测试通过
"release-x.x.x" -> master: cherryPick
@enduml
要使用好cherry-pick,每个提交要清晰简洁
优点:
缺点:
原git工作流程 https://wiki.corp.realibox.com/pages/viewpage.action?pageId=20414517 gitlab分支介绍 https://forge.etsi.org/rep/help/workflow/gitlab_flow.md