Git

Git Flow 插件使用

Posted by Yezhiwei on October 8, 2018

创建一个 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 插件介绍

默认配置

jgitflow

修改分支规则(版本改为 1.0-m5.1)

jgitflow-config

开始一个新特性

开始一个新特性

# 在 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

效果如下图:

jgitflow-feature

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

我们就可以在 Merge Request 看到有新的合并请求

merge request list

查看 Feature new feature test 的详情面,可以详细的看到提交、变化等信息,并可以根据提交的内容进行 codereview 和反馈。

merge request detail

如果审核代码没有问题后,点上图中的 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 上进行修复

tag-1.0.0

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

push tag

结论

  • 个人推荐只使用 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 审核之后再合并分支。