目前大部分项目都简单的以开发者姓名或功能名作为分支名,这种方式存在以下问题:
-
用开发者名字命名分支,多人开发多个功能时,出现混乱。
-
只有开发者知道哪几个分支是当前版本要发版的分支,可能会出现功能漏发或提前发的问题。
-
多个功能代码在一个分支上,无法应对突发的功能分开发版需求。
为了解决这些问题,我们制定了以下版本分支规范。
-
把分支分为三类:master,dev和version。
-
master分支为线上版本分支,与生产环境代码一致。
-
dev分支为开发分支,对应开发环境,不能在dev分支上开发,只能其他分支合并到dev。
-
版本分支的格式为“版本号/名称”,每个版本都有一个主分支,为“版本号/main”,对应版本提测的测试环境,其他版本分支用于单独功能开发。
-
所有分支都从master分支基础上创建,有依赖关系的分支例外。
-
版本功能分支开发完要发到开发环境时,除了要合并到dev分支,同时也要合并到版本主分支。
-
版本发布时,把版本的主分支合并到master分支。
-
Bug修复时,在对应的版本上创建修复分支,之后走正常版本合并发布操作。
每个版本统一提供一个升级步骤文档(doc/update.md),细化每个升级步骤,开发过程中填写详细内容,防止升级时漏了配置或sql之类的问题。
以上规范会存在一些人为错误,如:
-
合并完dev后在dev分支上修复问题或开发新功能,导致代码只存在开发环境,不会发到生产环境。
-
代码合并到dev后忘记合并到版本主分支,导致最终没发到生产环境。
为了防止此类问题的发生,提供合并脚本,完成错误检测和自动化操作。
Windows下执行sh脚本必须在git-bash.exe下执行。
脚本Git地址:http://192.168.16.200:3002/yeshaowei/autosh.git
脚本:后端/version.sh
功能:
- new:创建新的版本功能分支,会自动检测是否已经创建版本主分支,如没有会自动创建。
- merge:默认功能,先合并master分支到当前功能分支,合并当前功能分支到dev和版本主分支,如出现合并冲突,脚本会等待冲突解决后继续执行流程。
- check:检测master和当前版本的分支是否都合并到主分支
- publish:发布版本,把版本主分支合并到master分支,合并前会检测是否有漏合版本功能分支,发版后自动打上版本tag。
- fix:根据master对应版本,创建一个版本的修复分支,修复线上版本Bug。
- move:可以把一个功能分支自动迁移到另一个版本,同时重建版本主分支,防止当前版本中包含此分支代码。
脚本:前端/version.sh
功能:
- new:创建新的版本功能分支,会自动检测是否已经创建版本主分支,如没有会自动创建。
- merge:默认功能,先合并master分支到当前功能分支,再合并当前功能分支到版本主分支,如出现合并冲突,脚本会等待冲突解决后继续执行流程。
- check:检测master和当前版本的分支是否都合并到主分支
- build:打包程序,检测是否有漏合版本功能分支,打包后自动打上版本tag。
- publish:发布版本,把版本主分支合并到master分支,合并前会检测是否有漏合版本功能分支,发版后自动打上版本tag。
- fix:根据master对应版本,创建一个版本的修复分支,修复线上版本Bug。
- move:可以把一个功能分支自动迁移到另一个版本,同时重建版本主分支,防止当前版本中包含此分支代码。
如每次都要手动敲脚本,还是不太方便,SourceTree正好提供“自定义操作”功能,把脚本配置在“自定义操作”中,直接可以右键菜单操作,方便快捷。
根据不同的功能添加各自的操作
参数:D:/autosh/version.sh -o new
说明:脚本在执行过程中会要求输入版本号和功能名。
参数:D:/autosh/version.sh -o merge
说明:脚本会根据当前分支自动解析出版本号,合并代码到dev分支和版本主分支。
参数:D:/autosh/version.sh -o check
说明:检测master和当前版本的分支是否都合并到主分支
参数:D:/autosh/version.sh -o build
说明:脚本会根据当前分支自动解析出版本号,切换到版本主分支,等待打包完成。
参数:D:/autosh/version.sh -o publish
说明:脚本在执行过程中会要求输入版本号,也可增加参数(-v 1.2.3)指定版本。
参数:D:/autosh/version.sh -o fix
说明:脚本会根据master自动生成对应版本的功能分支,执行过程中要求输入功能名。
参数:D:/autosh/version.sh -o move
说明:脚本会把当前分析迁移到新版本分支,执行过程中要求输入新版本号,同时删除原版本的主分支。