体验 git-flow

文章目录
  1. 1. git-flow 是个什么?
  2. 2. 安装
    1. 2.1. 在Mac OS X上安装
    2. 2.2. Windows 安装
    3. 2.3. Linux 安装
  3. 3. 入门
  4. 4. 新功能开发
  5. 5. 创建一个新功能分支
  6. 6. 共享你的新功能给其他人
  7. 7. 版本发布
  8. 8. 修订BUG
  9. 9. 参考

git-flow 是个什么?

  • git-flow 是一个管理git代码仓库的生产力工具
  • git-flow 是一种git代码管理的最佳实践
  • git-flow 是一种能够让你傻笑一整天的玩具

git-flow

安装

下面介绍三个主要平台的安装过程

在Mac OS X上安装

本人的MBP最开始安装的macports, 虽说macportsbrew可以共存, 但是还是不想给自己挖坑, 还是用单一的包管理工具比较好, 慢是慢了一点(我晓得,如果你的网络有啥子问题,这个不是一般的慢),但又不是天天都在装软件, 所以还是坚持使用macports好了.

如果说你喜欢命令行高效率的方式, 长期使用命令行管理代码, git-flow 对于你来说是再适合不过的进一步提供效率的工具了, 当你上手之后, 你是不是要偷笑了, 在我的想象中已经看到你Happy的不得了的样子了

1
/test $ sudo port selfupdate
/test $ sudo port install git-flow

两行命令, macports轻松帮你搞定安装问题, 下面我会说一下怎么入门. 顺带一句, 你要先安装 Xcode, 否则macports是跑步起来的, 别怪我没有提醒你.

Windows 安装

下载Cygwin, https://cygwin.com/install.html, 又32位和64位两个版本, 更具系统版本选择合适的安装程序, 下载完成,启动安装程序,一路选择默认即可, 要注意的是,要能够成功安装git-flow, 需要安装如下几个依赖包:

  • 必须 Text/gettext
  • 必须 Devel/git
  • 可选 Devel/git-completion (建议安装此包,为git增加命令自动补全功能)
  • 必须 Base/util-linux
  • 必须 Web/wget

打开Cygwin终端, 运行:

1
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

Linux 安装

开源软件的天然的平台就是Linux, 自然集成度是非常高的, 不需要特别的配置,只需要安装就可以了.

各种Linux分发版本的安装可参考如下链接:
https://github.com/nvie/gitflow/wiki/Linux

入门

安装完成后,从下面开始, 我会给大家演示git-flow的基本操作, 它为什么让我们可以如此惬意的管理我们的代码,git-flow 也是一个命令行, 下面我们来看一下 git-flow的命令行帮助, 大概的看一看它提供了那些功能,能为我们做哪些事情:

我们从初始化一个全新的仓库开始, 创建一个目录, 然后在其中执行git flow init初始化当前目录, 当然你也可以在现有的git项目下执行git flow initgit项目转换为git-flow项目:

1
/test $ mkdir git-flow-get-started && cd git-flow-get-started
/test $ git flow init
Initialized empty Git repository in /test/.git/
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? [] test

问你一堆问题, 使用默认的就好, 没必要折腾. 现在一个空的git仓库算是创建好了, 既然git-flow的主要用途是做分支开发, 那么我们使用git branch来看看当前的分支是什么样子的.

1
/test $ git branch
* develop
  master

怎么默认分支在 *develop 上面, 这没有什么奇怪的, 因为 git-flow 的想法就是让你在 develop分支上持续开发. 然后在往 master 分支上合并. 咦, 肿么没有刚才回答问题看到的 feature, release, hotfix, support 分支呢? 这是因为, 你的仓库现在还是空的, 就是这样.

现在我来详细解释一下这些分支, 是神马意思

  • master

这句话是神马意思呢? 产品发布(production releases) 顾名思义是用作产品发布的(或称为主干,类似SVN的trunk)分支, 和线上生产环境的代码是一样的.
当你开发的代码经过测试,测试,再测试之后木有任何问题了, 你就可以把开发分支develop的经过测试的代码合并到master分支,并准备发布到生产环境了.

新功能开发

  • feature

当我们需要为我们正在开发的App增加一个全新的功能时, 这个时候我们就需要使用到 feature 分支了, 增加新功能会有极大的可能会破坏之前已经比较稳定的代码, 为了隔离这种影响我们需要从develop切换到feature分支上开发. 当feature上的新功能开发完成, 再合并到develop分支上进行集成测试.

测试完成稳定后,最终要合并到 master 分支作为 release的基础.

创建一个新功能分支

开始一个feature分支, 名称为 acl, 这会在 feature分支下创建一个 acl目录, 表示我们需要为我们的应用程序增加访问控制功能:

1
/test $ git flow feature start acl
Switched to a new branch 'feature/acl'

Summary of actions:
- A new branch 'feature/acl' was created, based on 'develop'
- You are now on branch 'feature/acl'

Now, start committing on your feature. When done, use:

     git flow feature finish acl

现在我们来看看, 当前我们的分支是什么样子:

1
/test $ git branch
  develop
* feature/acl
  master

当前分支以及切换到feature/acl了, 我们在当前目录下(/test)创建一个readme.md文件, 然后用git status看一下:

1
/test $ git status
On branch feature/acl
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	readme.md

nothing added to commit but untracked files present (use "git add" to track)

在第一行,我们同样能够看到我们当前所在的分支feature/acl, 现在我们要做的就和常规的git操作一样了.

1
/test $ git add .
/test $ git commit -m 'add file of readme.md'
[feature/acl 6ad1731] add file of readme.md
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md

当我们的acl功能开发完成后,就可以通过下面的命令结束acl 分支的生命周期了(feature分支的生命周期是临时的, 它的目的就是为你提供, 开发新功能的场所).

1
/test $ git flow feature finish acl
Switched to branch 'develop'
Updating aec3c0e..6ad1731
Fast-forward
 readme.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 readme.md
Deleted branch feature/acl (was 6ad1731).

Summary of actions:
- The feature branch 'feature/acl' was merged into 'develop'
- Feature branch 'feature/acl' has been removed
- You are now on branch 'develop'

同样上面又丰富的提示信息,告诉你发生了什么事情. 运行git branch看看一下现在的分支状况

1
/test $ git branch
* develop
  master

feature/acl分支删除了, 当前分支又回到了develop, So Easy, 对吧!

共享你的新功能给其他人

TODO::

1
/test $ git flow feature publish acl
/test $ git flow feature pull acl

版本发布

我们来描述一下这个开发场景, 团队决定开发一个Web端的实时聊天工具, 以增强与客户的互动性, 为客户提供更好的服务, 更好的响应速度.这个时候我们使用feature分支来创建一个新功能分支,这个在前面说过了.

现在的分支状态就只包括master, develop, 其中develop包含我们已经开发完成的实时聊天模块.

1
/test $ git flow release start 1.0.1
Switched to a new branch 'release/1.0.1'
Summary of actions:
- A new branch 'release/1.0.1' was created, based on 'develop'
- You are now on branch 'release/1.0.1'
Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:
     git flow release finish '1.0.1'

上面这个命令标识,创建一个release分支, 版本号为1.0.1, 下面我们执行git branch来看一下分支状态:

1
/test $ git branch
  develop
  master
* release/1.0.1

你看到, 增加了一个release/1.0.1的分支

修订BUG

首先来看看版本情况:

1
/test $ git tag
test1.0.1
test1.0.2
test1.0.3

我们的软件最新版本为test1.0.3, 目前和master分支的内容是一模一样的, 同时也是生产环境中正在运行着的版本. 某天当你半夜被你的BOSS叫起来的时候, 他给你说我们的生产环境发现了一个严重的BUG, 要马上修复. 这时候就是hoxfix的时候了.

1
/test $ git flow hotfix start 1.0.4
  • 把当前master分支的内容完整拷贝到hotfix/1.0.4,
  • 切换分支到 hotfix/1.0.4
  • hotfix/1.0.4 修改BUG
  • git add . && git commit -m 'bug fixed'
1
/test $ git flow hotfix finish 1.0.4
  • 结束hoxfix/1.0.4分支
  • 合并到master
  • 合并到develop
  • 删除hotfix/1.0.4分支
  • 切换回develop分支

参考

关于git-flow你还可以参考git-flow-cheatsheet,这里是中文版. 它是一个分支管理流程图标,如果你完全理解了git-flow的工作方式,即使在大规模项目中,你同样能够很好的管理你的代码.

提示: 请仔细看git-flow-cheatsheet中的 ,,,,绿的五线谱, 看看git-flow是怎么在这个五线谱弹奏优雅的旋律的.

一个成功的分支模型
一个成功的分支模型-英文原文
基于git的源代码管理模型——git flow