翻译自http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/

Vincent Driessen的分支模型是git的分支和项目发布策略。在大型项目中,可以用来帮助开发者追踪功能,bug以及版本的迭代。尽管使用这个工作流,需要记住大量的命令,但是,也有git的字命令库git-flow来让这个工作流的某些部分变得更加便捷。

Git Flow

安装完了git-flow(brew install git-fow)之后,你就可以在你的项目中使用它的init命令来开始一个工作流了。你可以用在一个已经存在的项目中,但是,在这里,我们新建一个项目:

1
2
3
4
5
6
7
8
9
10
11
12
$ git flow init
Initialized empty Git repository in ~/project/.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? []

git-flow只是在已存在的git命令上进行了一层包装,所以init这个命令不会更改你的任何东西,只是为你创建了一些新的分支而已。如果你不想使用git-flow的话,那么,也没有什么需要更改或者移除的,你只需不再用它就行了。

如果你在设置完成之后运行git branch,你会注意到,你从master分支切换到了一个新的名为develop的分支。

1
2
3
$ git branch
* develop
master

develop分支将会是大多数工作完成的地方,master分支就是用来保证生产环境的代码追踪。所以,从现在开始,不要直接在master分支上操作,你应该使用git push origin develop来推送代码到你的代码仓库。

Feature分支

通过feature分支,git-flow可以轻松的让我们同时开发多个功能。要开始开发一个新功能的时候,使用feature start,后面跟上你的新的功能名称就可以了(在这个例子中,新的功能名为authentication)。

1
2
3
4
5
6
7
8
9
10
$ git flow feature start authentication
Switched to a new branch 'feature/authentication'
Summary of actions:
- A new branch 'feature/authentication' was created, based on 'develop'
- You are now on branch 'feature/authentication'
Now, start committing on your feature. When done, use:
git flow feature finish authentication

正如输出的所解释的那样,你可以使用这个新的分支来开始你的工作。像你往常那样使用git就行了,当工作完成之后,使用feature finish来结束这个功能的开发。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git flow feature finish authentication
Switched to branch 'develop'
Updating 9060376..00bafe4
Fast-forward
authentication.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 authentication.txt
Deleted branch feature/authentication (was 00bafe4).
Summary of actions:
- The feature branch 'feature/authentication' was merged into 'develop'
- Feature branch 'feature/authentication' has been removed
- You are now on branch 'develop'

当你回到develop分支的时候,你的功能分支将会被合并到develop分支。在git-flow的内部,他是使用的git merge --no-ff feature/authentication来确保在你移除功能分支之前,不会丢失人和的历史信息。

版本发布

如果需要打标签以及发布版本,那么,在你准备部署一个新的生产环境的版本的时候,可以使用git-flow的版本发布分支来开一个新的分支。

与git-flow的其他做法一样,如果你不需要,更喜欢手动的使用git merge --no-ff develop来合并developmaster分支,你完全可以不使用这个分支。但是,如果你的项目是一个版本迭代的API或者库,那么,这个版本发布分支就很有用了,完全可以按照你预想的那样来工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'
Summary of actions:
- A new branch 'release/0.1.0' was created, based on 'develop'
- You are now on branch 'release/0.1.0'
Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:
git flow release finish '0.1.0'

跳过版本号,在release上只做你需要的来发布版本。我个人不会做太多的紧急关头的修复,但是如果你需要做这些工作的话,git-flow会确保你的每一样信息都是被正确的合并到了masterdevelop上。然后,结束此次版本发布:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git flow release finish 0.1.0
Switched to branch 'master'
Merge made by the 'recursive' strategy.
authentication.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 authentication.txt
Deleted branch release/0.1.0 (was 1b26f7c).
Summary of actions:
- Latest objects have been fetched from 'origin'
- Release branch has been merged into 'master'
- The release was tagged '0.1.0'
- Release branch has been back-merged into 'develop'
- Release branch 'release/0.1.0' has been deleted

git-flow从origin上拉取最新的代码,合并release分支到master上,为版本打上标签,并且在移除release分支之前,将所有的东西备份,合并到了develop分支上。

你仍然在master分支上,所以,你可以在你回到develop分支之前进行部署工作。git-flow会确保develop分支上的代码是与master上发布的代码是同步的。

生产环境的修复分支

由于总是保持生产环境的代码和master上的一致,所以,你可以很快的修复生产环境上的问题。

例如,你的assets文件在生产环境上没有加载出来,你应该回滚你的部署过程,并且新开一个hotfix分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git flow hotfix start assets
Switched to a new branch 'hotfix/assets'
Summary of actions:
- A new branch 'hotfix/assets' was created, based on 'master'
- You are now on branch 'hotfix/assets'
Follow-up actions:
- Bump the version number now!
- Start committing your hot fixes
- When done, run:
git flow hotfix finish 'assets'

hotfix分支与release分支及其类似,只是,他是建立在master基础上的而已。现在已经自动的切换到了新的修复分支,所以你可以修复问题,并且跳到子版本号。当修复工作完成之后,使用hotfix finish

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git flow hotfix finish assets
Switched to branch 'master'
Merge made by the 'recursive' strategy.
assets.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 assets.txt
Switched to branch 'develop'
Merge made by the 'recursive' strategy.
assets.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 assets.txt
Deleted branch hotfix/assets (was 08edb94).
Summary of actions:
- Latest objects have been fetched from 'origin'
- Hotfix branch has been merged into 'master'
- The hotfix was tagged '0.1.1'
- Hotfix branch has been back-merged into 'develop'
- Hotfix branch 'hotfix/assets' has been deleted

与完成版本发布类似,hotfix分支也会被合并到masterdevelop分支上。发布的版本会被打上标签,而hotfix分支会被移除。

那么,你还有什么理由不使用git-flow呢

当然,如果你现在所做的项目不是一个版本迭代的项目,那么,Vincent的工作流以及git-flow工作流对你来说就不适合。但是,如果你的项目从语义上来说是版本迭代的,比如Rubygem或者迭代的API,git-flow会使用非常简单的命令让你在做大多数的工作的时候显得非常轻松。比如在feature分支上开发新功能,在release分支上发布新版本,在hotfix分支上修复bug等。