GitFlow在团队协作中的实践
# 前言
Git是一款优秀的版本管理工具,但是在面对版本管理的时候,依然有非常大的挑战,比如:
- 如何开始一个Feature(功能)的开发,而不影响别的Feature?
- 由于很容易创建新分支,分支多了如何管理,时间久了,如何知道每个分支是干什么的?
- 哪些分支已经合并回了主干?
- 如何进行Release的管理?开始一个Release的时候如何冻结Feature, 如何在Prepare Release的时候,开发人员可以继续开发新的功能?
- 线上代码出Bug了,如何快速修复?而且修复的代码要包含到开发人员的分支以及下一个Release?
大部分开发人员现在使用Git就只是用三个甚至两个分支,一个是Master,一个是Develop,还有一个是基于Develop打得各种分支,这个在小项目规模的时候还勉强可以支撑,因为很多人做项目就只有一个Release, 但是人员一多,而且项目周期一长就会出现各种问题。
# GitFlow介绍
GitFlow工作流定义了一个围绕项目发布的严格分支模型,是一种Git使用方法论,它为不同的分支分配了明确的角色,并定义分支之间何时以及如何进行交互。
GitFlow使用了五种分支来进行协作:
长期分支
- 主分支(master)
- 开发分支 (develop)
master 分支一般对应的是生产环境的代码,是稳定的发布版本;develop 分支对应的是开发环境的代码,存放的都是最新的开发版。
短期分支
- 功能分支(feature)
- 补丁分支(hotfix)
- 预发分支(release)
一旦完成开发,它们就会被合并进 develop 或 master,然后被删除。
下面是Git Flow的流程图:
# GitFlow分支介绍
# master分支
存储正式发布的产品,master分支上的产品要求随时处于可部署状态。master分支只能通过与其他分支合并来更新内容,禁止直接在master分支进行修改。
# develop分支
汇总开发者完成的工作成果,develop分支上的产品可以是缺失功能模块的半成品,但是已有的功能模块不能是半成品。develop分支只能通过与其他分支合并来更新内容,禁止直接在develop分支进行修改。
# feature分支
当要开发新功能或者试验新功能时,从develop分支创建一个新的feature分支,并在feature分支上进行开发。开发完成后,需要将该feature分支合并到develop分支,最后删除该feature分支。
# release分支
当develop分支上的项目准备发布时,从develop分支上创建一个新的release分支,新建的release分支只能进行质量测试、bug修复、文档生成等面向发布的任务,不能再添加功能。这一系列发布任务完成后,需要将release分支合并到master分支上,并根据版本号为master分支添加tag,然后将release分支创建以来的修改合并回develop分支,最后删除release分支。
# hotfix分支
当master分支中的产品出现需要立即修复的bug时,从master分支上创建一个新的hotfix分支,并在hotfix分支上进行bug修复。修复完成后,需要将hotfix分支合并到master分支和develop分支,并为master分支添加新的版本号tag,最后删除hotfix分支。
# GitFlow工作流程
# 初始分支
所有在Master分支上的Commit应该Tag
# Feature 分支
分支名 feature/*
Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留
# Release分支
分支名 release/*
Release分支基于Develop分支创建,打完Release分之后,我们可以在这个Release分支上测试,修改Bug等。同时,其它开发人员可以基于开发新的Feature (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)
发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。
# 维护分支 Hotfix
分支名 hotfix/*
hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag
# GitFlow常见操作
- 创建develop分支
git branch develop
git push -u origin develop
2
- 开始新Feature开发
git checkout -b some-feature develop
# Optionally, push branch to origin:
git push -u origin some-feature
# 做一些改动
git status
git add some-file
git commit
2
3
4
5
6
7
8
- 完成Feature
git pull origin develop
git checkout develop
git merge --no-ff some-feature
git push origin develop
git branch -d some-feature
# If you pushed branch to origin:
git push origin --delete some-feature
2
3
4
5
6
7
8
9
- 开始Relase
git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
# Prepare release, commit
2
3
4
- 完成Release
git checkout master
git merge --no-ff release-0.1.0
git push
git checkout develop
git merge --no-ff release-0.1.0
git push
git branch -d release-0.1.0
# If you pushed branch to origin:
git push origin --delete release-0.1.0
git tag -a v0.1.0 master
git push --tags
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- 开始Hotfix
git checkout -b hotfix-0.1.1 master
- 完成Hotfix
git checkout master
git merge --no-ff hotfix-0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git tag -a v0.1.1 master
git push --tags
2
3
4
5
6
7
8
9
10
11
12
# GitFlow工具
当你理解了上面的流程后,你完全可以不用使用工具,但是实际上我们大部分人很多命令就是记不住呀,流程就是记不住呀,就有开发者提供了Git Flow工具。
# 安装
- MacOS
brew install git-flow
- Linux
apt-get install git-flow
- Windows
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
# 使用
# 初始化git flow项目,会创建master和develop两分支
git flow init
# 开始新Feature:
git flow feature start FeatureName
# publish一个Feature(也就是push到远程)
git flow feature publish FeatureName
# 获取publish的Feature
git flow feature pull origin FeatureName
# 完成一个Feature
git flow feature finish FeatureName
# 开始一个Release
git flow release start ReleaseName [BASE]
# publish一个Release
git flow release publish ReleaseName
# 发布Release
git flow release finish ReleaseName
# 开始一个Hotfix
git flow hotfix start VERSION [BASENAME]
# 发布一个Hotfix
git flow hotfix finish VERSION
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29