我们已经从 SVN 切换到 Git 很多年了,现在几乎所有的项目都在使用 Github 管理, 本篇文章讲一下为什么使用 Git, 以及如何在团队中正确使用。
Git 的优点
Git 的优点很多,但是这里只列出我认为非常突出的几点。
- 由于是分布式,所有本地库包含了远程库的所有内容。
- 优秀的分支模型,打分支以及合并分支,机器方便。
- 快速,在这个时间就是金钱的时代,Git 由于代码都在本地,打分支和合并分支机器快速,使用个SVN的能深刻体会到这种优势。
感兴趣的,可以去看一下 Git 本身的设计,内在的架构体现了很多的优势,不愧是出资天才程序员 Linus (Linux 之父) 之手。
版本管理的挑战
虽然有这么优秀的版本管理工具,但是我们面对版本管理的时候,依然有非常大得挑战,我们都知道大家工作在同一个仓库上,那么彼此的代码协作必然带来很多问题和挑战,如下:
- 如何开始一个 Feature 的开发,而不影响别的 Feature?
- 由于很容易创建新分支,分支多了如何管理,时间久了,如何知道每个分支是干什么的?
- 哪些分支已经合并回了主干?
- 如何进行 Release 的管理?开始一个 Release 的时候如何冻结 Feature, 如何在 Prepare Release 的时候,开发人员可以继续开发新的功能?
- 线上代码出Bug了,如何快速修复?而且修复的代码要包含到开发人员的分支以及下一个 Release?
大部分开发人员现在使用 Git 就只是用三个甚至两个分支,一个是 Master, 一个是 Develop, 还有一个是基于 Develop 打得各种分支。这个在小项目规模的时候还勉强可以支撑,因为很多人做项目就只有一个 Release, 但是人员一多,而且项目周期一长就会出现各种问题。
Git Flow
就像代码需要代码规范一样,代码管理同样需要一个清晰的流程和规范
Vincent Driessen 同学为了解决这个问题提出了 A Successful Git Branching Model
下面是Git Flow的流程图

上面的图你理解不了? 没关系,这不是你的错,我觉得这张图本身有点问题,这张图应该左转 90 度,大家应该就很用以理解了。
Git Flow 常用的分支
- Production 分支
也就是我们经常使用的 Master 分支,这个分支最近发布到生产环境的代码,最近发布的 Release, 这个分支只能从其他分支合并,不能在这个分支直接修改。 - Develop 分支
这个分支是我们是我们的主开发分支,包含所有要发布到下一个 Release 的代码,这个主要合并与其他分支,比如 Feature 分支。 - Feature 分支
这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回 Develop 分支进入下一个 Release。 - Release 分支
当你需要一个发布一个新 Release 的时候,我们基于Develop分支创建一个 Release 分支,完成 Release 后,我们合并到 Master 和 Develop 分支。 - Hotfix 分支
当我们在 Production 发现新的 Bug 时候,我们需要创建一个 Hotfix, 完成 Hotfix 后,我们合并回 Master 和 Develop 分支,所以 Hotfix 的改动会进入下一个 Release。
Git Flow如何工作
初始分支
所有在 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。

Git Flow代码示例
- 创建 Develop 分支
git branch develop
git push -u origin develop
- 开始新 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
- 完成 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
- 开始 Relase
git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
# Prepare release, commit
- 完成 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
- 开始 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
Git flow 工具
实际上,当你理解了上面的流程后,你完全不用使用工具,但是实际上我们大部分人很多命令就是记不住呀,流程就是记不住呀,肿么办呢?
总有聪明的人创造好的工具给大家用, 那就是 Git flow script.
安装
- OS X:
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 init
- 开始新 Feature:
git flow feature start MYFEATURE
- Publish 一个 Feature(也就是 push 到远程):
git flow feature publish MYFEATURE
- 获取 Publish 的 Feature:
git flow feature pull origin MYFEATURE
- 完成一个 Feature:
git flow feature finish MYFEATURE
- 开始一个 Release:
git flow release start RELEASE [BASE]
- Publish 一个 Release:
git flow release publish RELEASE
- 发布 Release:
git flow release finish RELEASE
别忘了git push --tags
- 开始一个 Hotfix:
git flow hotfix start VERSION [BASENAME]
- 发布一个 Hotfix:
git flow hotfix finish VERSION

Git Flow GUI
上面讲了这么多,我知道还有人记不住,那么又有人做出了 GUI 工具,你只需要点击下一步就行,工具帮你干这些事!!!
SourceTree
当你用 Git-flow 初始化后,基本上你只需要点击 git flow 菜单选择 start feature, release 或者 hotfix, 做完后再次选择 git flow 菜单,点击 Done Action. 我勒个去,我实在想不到还有比这更简单的了。
目前 SourceTree 支持 Mac, Windows, Linux.
这么好的工具请问多少钱呢? 免费!!!!


Git flow for visual studio


