背景
当在团队开发中使用版本控制系统时,商定一个统一的工作流程是至关重要的。Git 的确可以在各个方面做很多事情,然而,如果在你的团队中还没有能形成一个特定有效的工作流程,那么混乱就将是不可避免的。
基本上你可以定义一个完全适合你自己项目的工作流程,或者使用一个别人定义好的。
这里我们将一起学习一个当前非常流行的工作流程 git-flow
git-flow是什么
git-flow并非什么技术,而是一种代码开发合并管理流程的思维模式或者是管理方法。大家一起开发的一种软约定。
严格来讲,你并不需要安装什么特别的东西就可以使用 git-flow 工作流程。你只需要了解,哪些工作流程是由哪些单独的任务所组成的,并且附带上正确的参数,以及在一个正确的顺序下简单执行那些对应的 Git 命令就可以了。当然,如果你使用 git-flow 脚本就会更加方便了,你就不需要把这些命令和顺序都记在脑子里。
git-flow安装
git-flow工作流程
1.Master 分支: 稳定版本代码分支,用作发布环境,上面的每次提交都是可以发布的。
2.Feture 分支: 功能分支,用于开发功能(需求),用于开发环境
3.Developer 分支: 开发分支, 一旦Feture分支内功能开发完成就将Feture中的代码合并到Developer分支中,合并完成后,删除该功能分支。这个分支对应的是集成测试环境。
4.Release 分支:预发分支,做发布前的准备工作,对应的是预发环境。这个分支可以确保们开发继续向前,不会因为要发布不而被停滞住。一旦Release分支达到了可发布的状态,我们需要把Release分支同时向Master,Developer分支上合并,保持代码的一致性,然后把Release分支删除。
5.Hotfix 分支: 线上bug修缮用的分支,每次修改线上代码的bug时都要用hotfix来维护,完成后向Developer和Master同时合并。完成后删除分支。
git-flow的使用
1、git flow init (初始化Git仓库)
在项目的根目录执行 “git flow init” 命令时,会在本地仓库中预设两个主分支(master/develop),并对Realse、Feature、hotfix等分支配置了一些命名规则
2、 git flow feature start 【featureName】(功能开发)
执行该命令会在develop上切一个分支,分支前缀为feature/,名称为【featureName】,并切换到当前新增的这个分支
3、git flow feature finish 【featureName】(功能开发完成,分支提交并合并develop)
执行该命令会将分支代码合并到develop,当前分支切换到develop并同时删除当前分支(包括本地和远程仓库的)(在执行该命令前先develop代码合并到该分支,避免代码冲突)
4、git flow release start 【releaseName】(创建一个成熟的release版本)
执行该命令会在develop上切一个分支,分支前缀为release/,名称为【releaseName】,并切换到当前新增的这个分支
5、git flow release finish 【releaseName】(版本发布)
这个命令会完成如下一系列的操作:
- 首先,git-flow 会拉取远程仓库,以确保目前是最新的版本。
- 然后,release 的内容会被合并到 “master” 和 “develop” 两个分支中去,这样不仅产品代码为最新的版本,而且新的功能分支也将基于最新代码。
- 为便于识别和做历史参考,release 提交会被标记上这个 release 的名字(在我们的例子里是 “1.0.1”)。
- 清理操作,版本分支会被删除,并且回到 “develop”。
注: 若出现报错可以使用(git flow release finish -m 'test' '1.0.1')命令
6、git flow hotfix start 【hotfixName】(生产bug修复分支)
执行该命令会在master上切一个分支,分支前缀为hotfix/,名称为【hotfixName】,并切换到当前新增的这个分支
7、git flow hotfix finish 【releaseName】(生产bug修复分支发布)
这个命令会完成如下一系列的操作:
- 首先,git-flow 会拉取远程仓库,以确保目前是最新的版本。
- 然后,hotfix 的内容会被合并到 “master” 和 “develop” 两个分支中去,这样不仅产品代码为最新的版本,而且新的功能分支也将基于最新代码。
- 清理操作,版本分支会被删除,并且回到 “develop”。
git-flow的缺陷
1、切feature分支时不会修改pom文件版本号,导致如果同时拉取多个future分支进行开发,并对外提供api接口jar包,无法区分版本
2、release分支和hotfix分支合并到develop分支时不会修改pom文件版本号,并让版本号叠加
以上缺点导致我们每次合并后还得人工修改版本号,非常麻烦,那有没有什么好的办法解决这个问题了,答案是肯定的,gitflow-maven-plugin插件就完美的解决上述问题
gitflow-maven-plugin的使用
Git Flow Maven插件支持各种Git工作流,包括GitFlow和GitHub流
1、插件获取
<build>
<plugins>
<plugin>
<groupId>com.amashchenko.maven.plugin</groupId>
<artifactId>gitflow-maven-plugin</artifactId>
<version>1.18.0</version>
<configuration>
<!-- optional configuration -->
</configuration>
</plugin>
</plugins>
</build>
2、功能集
gitflow:release-start-启动发布分支并将版本更新为发布版本。gitflow:release-finish-合并发布分支并将版本更新到下一个开发版本。gitflow:release-发布项目,不创建发布分支。gitflow:feature-start-启动功能分支并可选地更新版本。gitflow:feature-finish-合并特征分支。gitflow:hotfix-start-启动修补程序分支并将版本更新为修补程序版本。gitflow:hotfix-finish-合并修补程序分支。gitflow:support-start-从生产标记启动支持分支。gitflow:version-update-更新发布或支持分支中的版本,可以选择标记并将其推送到远程存储库。gitflow:help-显示帮助信息。
3、示例
1)mvn gitflow:feature-start -DpushRemote=true(功能开发)
2)mvn -DpushRemote=true -DkeepBranch=true gitflow:feature-finish(提交feature分支)
3)mvn gitflow:release-start -DpushRemote=true(切release分支)
4)mvn gitflow:release-finish -DpushRemote=true -DkeepBranch=true
develop分支
master分支
4、gitflow-maven-plugin插件的详解