Git flow是git的一个扩展集,它基于Vincent Driessen 的分支模型,文章“A successful Git branching model”对这一分支模型进行了描述,其示意图如下:
上图从左往右看,分别为
- 时间轴,从上往下时间在流逝
- feature分支(玫红),图上有两个feature分支,在这个分支上,进行功能特性的开发
- develop分支(黄色),git flow的主分支,feature分支和release分支都会将代码合并到此分支上
- release分支(绿色),总是基于develop分支创建,最后合并到develop分支和master分支
- hotfix分支(红色),总是基于master分支创建,最后合并到master分支和develop分支
- master分支(蓝色),git flow的主分支,在开发的整个阶段一直存在,平时不在此分支开发,因此代码比较稳定,可以用来发布
Git flow的源码可以通过以下链接下载:
或者,直接输入以下命令安装git flow:
apt-get install git-flow
在Windows平台下安装git flow,可以参考《Windows环境下msysgit安装git flow》。
我们可以通过以下命令来初始化一个现有的git本地仓库。
git flow init
接着回答几个关于分支的问题。不用担心,使用默认值即可,直接按回车键。
No branches exist yet. Base branches must be created now
Branch name for production releases: [master]
Branch name for “next release” development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
这样,便完成了git flow的初始化工作。
在git flow 的分支模型中,有两个主分支master和develop,还有几个额外的分支来支持代码的版本管理。下面先简要介绍一下这些分支的特点和git flow常用命令的使用。
1. Master
master分支只有一个。
master分支上的代码总是稳定的,随时可以发布出去。
平时一般不在master分支上操作,当release分支和hotfix分支合并代码到master分支上时,master上代码才更新。
当仓库创建时,master分支会自己创建。
2. Develop
develop分支只有一个。
新特性的开发是基于develop分支的,但不直接在develop分支上开发,特性的开发是在feature分支上进行。
当develop分支上的特性足够多以至于可以进行新版本的发布时,可以创建release分支的。
3. Feature
可以同时存在多个feature分支,新特性的开发正是在此分支上面。
可以对每个新特性创建一个新的feature分支,当该特性开发完毕,将此feature分支合并到develop分支。
创建一个新的feature分支,可以使用以下命令:
git flow feature start test
执行以下命令后,feature/test分支会被创建。
当特性开发完毕,需要将此分支合并到develop分支,可以使用以下命令实现:
git flow feature finish test
上面的命令会将feature/test分支的内容merge到develop分支,并将feature/test分支删除。
feature分支只是存在于本地仓库,如果需要多个人共同开发此特性,也可以将feature分支推送到过程仓库。
git flow feature publish test
feature 分支的生命周期持续到特性的开发完毕,当完成特性的开发,你可以使用git的分支管理命令将此feature分支删除。
4. Release
当完成了特性的开发,并且将feature分支上的内容merge到develop分支上,这时可以开始着手准备新版本的发布,release分支正是作为发布而开设的分支。
release分支基于develop分支,在同一时间只有一个release分支,其生命周期较短,只是为了发布而使用。这意味着,在release分支上,只是进行较少代码修改,比如bug的修复,原有功能的完善等。不允许在release分支增加大的功能,因为这样会导致release分支的不稳定,不利于发布的进行。
当release分支(例如,v.1.0)被创建出来后,develop分支可能正准备另一版本(例如,v.2.0),因此,当release分支merge回develop分支时,可能会出现冲突,需要手工解决冲突才能继续merge。
通过以下命令来创建release分支:
git flow release start v.1.0
执行过完上面的命令,release分支release/v.1.0会被创建出来 ,并且切换到该分支。
当完成release分支功能的完善或者bug的修复后,执行以下命令来完成release分支:
git flow release finish v.1.0
这个命令会执行以下的操作:
- 分支release/v.1.0 merge回master分支
- 使用release/v.1.0分支名称打tag
- 分支release/v.1.0 merge回develop分支
- 删除release/v.1.0分支
5. Hotfix
当发现master分支出现一个需要紧急修复的bug,可以使用hotfix分支。hotfix分支基于master分支,用来修复bug,当完成bug的修复工作后,需要将其merge回master分支。
同一时间只有一个hotfix分支,其生命周期较短。
可以使用以下命令来创建hotfix分支:
git flow hotfix start v.1.0
使用以下命令来结束hotfix分支的生命周期:
git flow hotfix finish v.1.0
这句命令会将hotfix分支merge到master分支和release分支,并删除该hotfix分支。
值得注意的是,如果bug修复时,正存在着release分支,那么hotfix分支会merge到release分支,而不是develop分支。
可以使用下图来说明git flow这几分支的常用命令:
在开发的整个阶段,只有两个主分支贯穿于整个开发阶段:master分支和develop分支。功能特性的开发以及bug的修复都通过创建新的分支来实现,且这些分支的生命周期都比较短暂。开发成员之间的开发可以做到尽量不干扰对方,这保证了代码的稳定性。
git flow的分支模型简单清晰,易于使用。通过本文对git flow常用命令的介绍,你可以尽情享受它为我们管理代码带来的方便。