Git

Git flow 规范

Posted on 2020-11-21,7 min read

VV采用标准的Git flow,下面将从工作流图与抽象模型两个方面,来描述与规范 Git flow。

并在此基础上给出vv 的 master分支,hotfix-分支,develop分支,release-分支,feat-分支和bugfix-分支的定义与上下文。

工作流图

1 永久分支:Master分支与Develop分支

img

1.1 Master分支上的Commit都有对应的Tag。

1.2 Develop分支与Master分支是两个永久存在的分支,从公Master拉取Develop分支。

1.3 Develop分支不直接合并到Master分支,其通过Release分支合并到Master分支。

1.4 Master分支与线上版本保持一致。

1.5 Develop分支是自动构建分支,它总是保有当前即将发布或是已经发布的代码,是确定的下一次将要通过Release分支合并到master上的代码。

2 临时分支Feature

img

2.1 当需要开发新的特性时,从Develop分支拉取Feature分支。

2.2 命名规范:

标准Git flow 认为Feature分支可以是,除以master, develop, release-, 和 hotfix-_ 开头的任何串。

在此我们规定,Feature分支命名规范以feat-开使。

2.3 生命周期:开发中存在,在合并到develop后或是丢弃后,便删除。

2.4 通常只在开发者的仓库中存在,origin中没有Feature分支。(不采纳这条限制,多人合作需要Feature上推到origin)

2.5 Feature分支做完后(做完是值完成了主体功能,完成了大部分测试与bug的修复,可以存在少量的非重要bug),确定为当前上线的版本后,便可合并回Develop, 合并完分支后一般会删点这个Feature分支,也可以保留。

到这里,一个Feature分支的生命周期便结束了。

3 临时分支Release

img

Release分支基于Develop分支创建,可以在Release分支上测试,修改Bug等。

同时,其它开发人员可以基于Develop开发新的Feature (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,删除Release分支。

4 临时分支hotfix

img

hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag

Git Flow 抽象模型

在使用的过程中一定要注意到数据流的流动方向。

下面给出Git Flow 的抽象模型,让大家能更加直观的把握、灵活的运用于实践中。

img

Feature分支流程

1 当有新的特性需要开发时,从Develop分支拉取Feature分支。

2 Feature分支在经过开发、测试后,确定为当前即将发布版本之后,便可合并到Develop分支,并删除Feature分支。

3 向Develop分支合并后,创建对应的Release分支,这可以对应一个或是多个Feature。

4 在Release上完成次要bug修复、发版配置等之后,便可合并到Develop与Master(Master上的合并需要加上tag)。

hotfix分支流程 与 release分支流程

1 它们都具有两个合并分支,Develop分支与Master分支。

2 hotfix拉取于Master分支。

3 release拉取于Develop分支。

4 hotfix是为解决线上严重问题而生。

5 release是为特性发布、工程配置、少量bug测试等问题而生。

release过后常规bug修复

release发布前,该特性引入的常规bug是在其上修改的。

对于release发布后,或是其它特性引入的bug,我们引入以"bugfix-"为开头的新特性。

至此我们基本遵守了标准 Git Flow 开发模型。

做了一个扩充:引入以"bugfix-"为开头的新特性,支持release发布后在Develop上发现的bug常规bug。

做了一个限制:Feature分支命名规范以“feat-”开始。

完整的数据流图与命名规范

img

格式: prename_postname

如 hotfix-5.11 , feat-5.11 , release-5.11 (5.11 为版本或是特性名称)

bugfix-图片上传(针对功能命名) , bugfix-5.11 (针对某版本或是特性命名)

master分支

master是项目第一个被创建的分支。

每一个向master的合并,都对应一个经过严格测试的主观稳定的线上版本。

它是hotfix-分支的上游分支。

hotfix-分支

当线上版本出现严重的bug时,需要从master上选取特定的tag拉取代码。

在完成测试具备上线条件后,在hotfix-分支上完成版本的发布。

经灰度发布后,先合并到master,再合并到develop分支。

这两个合并步骤是不可分的,是一个事务。亦可称为同时合并到master分支和develop分支。

develop分支

develop分支在git flow 中承担了最为复杂与重要的任务。

它是feat-分支、release-分支,和bugfix-分支的起点。

是代码的同步中心,其它任何分支,都是经过develop分支完成代码同步的。

feat-分支

feat-分支是研发分支,源于develop分支,终于develop分支。

在feat-分支完成所有的新功能研发,多少bug的修复与优化工作。

在确定为会在下一个版本发布时,便可以合并到develop分支。

在develop分支上有一个或是多个合并的未上线的feat-分支时,可以选择拉取release-分支,进入release阶段。

release-分支

release-分支承载了发布中项目的配置,一定bug的修复,优化等工作。

创建release-分支有两个目的:

尽快向develop分支合并确定的下版feat-分支,极大的提高了研发的并发度;

经测试、发布、审核,进入灰度后,直到确定为不再回滚正式发布后,合并到master与develop分支。

它维护了长时间窗口等待期,确保master与线上版本的一致。

bugfix-分支

可被视为特殊的feat-分支。

⚠️⚠️⚠️分支操作注意事项

KenChoi:为什么你应该停止使用 Git rebase 命令

只能对自己的私有分支做rebase操作。

凡涉及到几大共有分支(master, develop, release-, hotfix-_和 bugfix-)上的commit的合并,

必须使用merge,禁止使用rebase。严格禁止共有分支上的提交id变更。

其它分支可以使用rebase,合并到develop分支,但是只要提交到了develop,

所有的commit就属于develop分支,禁止再使用rebase操作。

问题:你好,我最近在尝试使用 git-flow 有一个问题我一直没有找到答案,问题: 在开发分支中开发完的功能在当前发布版本是不需要发布出去,不知道你有没有合适的处理方案,谢谢

单独拉出来一个分支,把目前不需要的提交用rebase删除 git rebase-i

下一篇: Docker 部署 Gitlab→