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的流程图:

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

Git Flow

Feature 分支

分支名 feature/*

Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留

Git Flow

Release分支

分支名 release/*

Release分支基于Develop分支创建,打完Release分之后,我们可以在这个Release分支上测试,修改Bug等。同时,其它开发人员可以基于开发新的Feature (记住:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)

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

Git Flow

维护分支 Hotfix

分支名 hotfix/*

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

Git Flow

GitFlow常见操作

  • 创建develop分支
1
2
git branch develop
git push -u origin develop
  • 开始新Feature开发
1
2
3
4
5
6
7
8
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
  • 完成Feature
1
2
3
4
5
6
7
8
9
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
  • 开始Relase
1
2
3
4
git checkout -b release-0.1.0 develop

# Optional: Bump version number, commit
# Prepare release, commit
  • 完成Release
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
  • 开始Hotfix
1
git checkout -b hotfix-0.1.1 master
  • 完成Hotfix
1
2
3
4
5
6
7
8
9
10
11
12
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

GitFlow工具

当你理解了上面的流程后,你完全可以不用使用工具,但是实际上我们大部分人很多命令就是记不住呀,流程就是记不住呀,就有开发者提供了Git Flow工具。

安装

  • MacOS
1
brew install git-flow
  • Linux
1
apt-get install git-flow
  • Windows
1
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

使用

Git Flow

1
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
# 初始化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
有用就打赏一下作者吧!