创建一个 demo
在本地目录新创建项目
使用集成开发环境 IDEA 的向导(Spring Initializr)创建一个 Spring Boot 的项目,然后将其初始化为一个 Git Repository (VCS -> Import into Version Control -> Create Git Repository),这时在新项目上右键就可以看到 Git 菜单了,这样项目就可以用 Git 版本控制了。
将分支 push 到远程服务器
# mac 安装 git-flow
brew install git-flow
# 使用 init 命令来初始化一个新的 repo,同时包括基本的 branch 结构。选项 -d 会接受所有的缺省值。
git flow init [-d]
在 gitlab 上创建一个新的项目,如下图:
在当前分支(develop)下执行下面命令
git remote add origin http://gitlab.gemantic.com/java/demo.git
git push -u origin develop
jgitflow 插件介绍
默认配置
修改分支规则(版本改为 1.0-m5.1)
开始一个新特性
开始一个新特性
# 在 develop 分支上创建开始新特性的分支
git checkout develop
# 开始新特性开发
mvn jgitflow:feature-start -DfeatureName=new-feature-test -DallowSnapshots=true
# 提示输入用户名和密码
# 给 feature 命名
What is the feature branch name? feature- [new-feature-test]:
# 查看一下分支
git branch
develop
* feature-new-feature-test
master
效果如下图:
git branch 查看当前分支
完成一个新特性,并将其提交到远程仓库
# 第一次 push feature 分支时用下面的命令
git push --set-upstream origin feature-new-feature-test
在 GitLab 上看到的效果如下图:
在本次迭代开发完成之后,合并回 develop 分支,删除 feature 分支
mvn jgitflow:feature-finish
# 上面的命令相当于以下命令
$ git checkout develop
Switched to branch 'develop'
# 将 feature 合并到 develop 分支
$ git merge --no-ff feature-new-feature-test
Updating ea1b82a..05e9557
(Summary of changes)
# 删除 feature 分支
$ git branch -d feature-new-feature-test
Deleted branch feature-new-feature-test (was 05e9557).
# 提交到远程
$ git push origin develop
但是,不推荐直接将 feature 合并到 develop 分支上,应该在 GitLab 上提交一下合并请求,然后由 Leader 做 codereview 之后才能合并到 develop 分支。如下图,然后根据向导完成合并请求。
我们就可以在 Merge Request 看到有新的合并请求
查看 Feature new feature test 的详情面,可以详细的看到提交、变化等信息,并可以根据提交的内容进行 codereview 和反馈。
如果审核代码没有问题后,点上图中的 Accept Merge Request 按钮,接收本次合并请求。由于本类型的分支为临时分支,接受合并请求的财时可以选择删除 feature 分支(或者执行 git branch -d feature-new-feature-test 进行删除)。
开始发布
从 develop 分支检出,自动拉出 release 分支并升级版本号。确保 pom.xml 中没有snapshot 版本的依赖。
如当前工程是 1.0.0-SNAPSHOT 版本,则上线后版本应为 1.0.0,对应的下一次开发版本号为 1.1.0-SNAPSHOT ,此时命令为
mvn jgitflow:release-start -DreleaseVersion=1.0.0 -DdevelopmentVersion=1.1.0-SNAPSHOT -DpushReleases=true -DallowSnapshots=true
执行完成后,将在本地自动生成一个 release 分支,名为:release-1.0.0,可以在 GitLab 分支列表中看到。
GitLab 效果
此时,就可以将 release-1.0.0 发布到测试环境,进入本次迭代开发的测试阶段。如果测试阶段发现有 bug ,在本分支上进行修复。测试通过后,准备发布生产环境。
发布生产环境,将 release 合并回 develop 分支和 master 分支,并打 tag。pom.xml 中的版本号也相应改变,这是此时 develop 分支的版本号:1.1.0-SNAPSHOT,最后在master分支上打包上线。
mvn jgitflow:release-finish -DnoReleaseBuild=true -DnoDeploy=true -DpushReleases=true
修改生产 bug
当生产环境上出现了严重的 bug,需要立即修复的时候,就需要从 master 分支上的某个 tag 上进行修复
mvn jgitflow:hotfix-start -DallowSnapshots=true
修改完 bug 后, 执行
mvn jgitflow:hotfix-finish
1.0-m3 版本有问题,不能合并到 master 和 develop 分支,换成 1.0-m5.1 可以了。
提示错误如下:
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal external.atlassian.jgitflow:jgitflow-maven-plugin:1.0-m3:hotfix-finish (default-cli) on project demo: Execution default-cli of goal external.atlassian.jgitflow:jgitflow-maven-plugin:1.0-m3:hotfix-finish failed: Exception caught during execution of merge command. org.eclipse.jgit.errors.NoMergeBaseException: No merge base could be determined. Reason=CONFLICTS_DURING_MERGE_BASE_CALCULATION. "More than 200 merge bases for:
a 97ee82d87555c36e08c036505add3cf2d1435f08
b 2cb1eb2167069a8f32bbf6ad6452d8533505f8f2 found:
count 2"
将此版本发布测试环境,测试通过之后,在 GitLab 上创建合并请求,将 bug 修改的代码合并回 develop 分支和 master 分支。最后再将之删除。
发布生产环境,需要手动执行打 tag 命令,然后推送到远程
git push origin --tags
结论
- 个人推荐只使用 jgitflow 插件的 release 命令,他会自动升级 pom.xml 文件里的版本号。
# 开始发布
mvn jgitflow:release-start -DreleaseVersion=1.0.10 -DdevelopmentVersion=1.0.11-SNAPSHOT -DpushReleases=true -DallowSnapshots=true
# 发布结束
mvn jgitflow:release-finish -DnoReleaseBuild=true -DnoDeploy=true -DpushReleases=true
- feature 和 hotfix 分支还是通过命令行和 GitLab 中使用 Merge Request,然后通过 codereview 审核之后再合并分支。tva2