git 使用规范

Gitflow工做流

Gitflow工做流借鉴自在nvieVincent Driessengit

Gitflow工做流定义了一个围绕项目发布的严格分支模型。虽然比功能分支工做流复杂几分,但提供了用于一个健壮的用于管理大型项目的框架。api

Gitflow工做流没有用超出功能分支工做流的概念和命令,而是为不一样的分支分配一个很明确的角色,并定义分支之间如何和何时进行交互。
除了使用功能分支,在作准备、维护和记录发布也使用各自的分支。
固然你能够用上功能分支工做流全部的好处:Pull Requests、隔离实验性开发和更高效的协做。安全

工做方式

Gitflow工做流仍然用中央仓库做为全部开发者的交互中心。和其它的工做流同样,开发者在本地工做并push分支到要中央仓库中。bash

工做流中涉及到的角色介绍

功能开发者:模块中功能的开发人员;
开发管理员:由项目模块开发的小组长(team leader)担当;服务器

分支说明

名称
说明
命名规范
命名示例
合并目标
合并操做
负责人
权限说明
master 线上稳定版本 master master 开发管理员 master分支是保护分支,不可直接push到远程仓master分支
release 待发布分支,下个版本需上线的版本分支,用来为发布新版的测试、修复作准备 release/xxx release/v1.0.0 master/develop merge request 功能开发者 release分支一旦创建就将独立,不可再从其余分支pull代码,release分支来源develop分支
develop 当前正在开发的分支 develop develop master merge request 开发管理员 由每组开发管理员负责把全部feature分支开发完成的代码合并到develop分支
feature 功能分支,每一个功能需分别创建本身的子分支 feature/版本号-功能名 feature/v1.0.0-login develop merge request 功能开发者 feature分支只与develop分支交互,不能与master分支直接交互
hotfix 紧急修复分支 hotfix/xxx hotfix/v1.0.1 master/develop merge request 功能开发者 hotfix分支一旦创建就将独立,不可再从其余分支pull代码,hotfix分支来源master分支

历史分支

相对使用仅有的一个master分支,Gitflow工做流使用2个分支来记录项目的历史。master分支存储了正式发布的历史,而develop分支做为功能的集成分支。
这样也方便master分支上的全部提交分配一个版本号。app

剩下要说明的问题围绕着这2个分支的区别展开。框架

功能分支

每一个新功能位于一个本身的分支,这样能够push到中央仓库以备份和协做。
但功能分支不是从master分支上拉出新分支,而是使用develop分支做为父分支。当新功能完成时,合并回develop分支。
新功能提交应该从不直接与master分支交互。ssh

 

注意,从各类含义和目的上来看,功能分支加上develop分支就是功能分支工做流的用法。但Gitflow工做流没有止步于此。测试

发布分支

一旦develop分支上有了作一次发布(或者说快到了既定的发布日)的足够功能,就从develop分支上fork一个发布分支。
新建的分支用于开始发布循环,因此从这个时间点开始以后新的功能不能再加到这个分支上——
这个分支只应该作Bug修复、文档生成和其它面向发布任务。
一旦对外发布的工做都完成了,发布分支合并到master分支并分配一个版本号打好Tag
另外,这些重新建发布分支以来的作的修改要合并回develop分支。ui

使用一个用于发布准备的专门分支,使得一个团队能够在完善当前的发布版本的同时,另外一个团队能够继续开发下个版本的功能。
这也打造定义良好的开发阶段(好比,能够很轻松地说,『这周咱们要作准备发布版本4.0』,而且在仓库的目录结构中能够实际看到)。

经常使用的分支约定:

用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*

维护分支

维护分支或说是热修复(hotfix)分支用于生成快速给产品发布版本(production releases)打补丁,这是惟一能够直接从master分支fork出来的分支。
修复完成,修改应该立刻合并回master分支和develop分支(当前的发布分支),master分支应该用新的版本号打好Tag

Bug修复使用专门分支,让团队能够处理掉问题而不用打断其它工做或是等待下一个发布循环。
你能够把维护分支想成是一个直接在master分支上处理的临时发布。

若是多个版本并行到test环境,怎么解决这个问题?以下图

示例

下面的示例演示本工做流如何用于管理单个发布循环。假设你已经建立了一个中央仓库。

建立开发分支

第一步为master分支配套一个develop分支。简单来作能够本地建立一个空的develop分支,push到服务器上:

git branch develop
git push -u origin develop

之后这个分支将会包含了项目的所有历史,而master分支将只包含了部分历史。其它开发者这时应该克隆中央仓库,建好develop分支的跟踪分支:

git clone ssh://user@host/path/to/repo.git git checkout -b develop origin/develop #【译注】当没有本地分支 develop 时, # 最后一条命令,我使用更简单的 git checkout develop # 会自动 把 远程分支origin/develop 检出成 本地分支 develop 

如今每一个开发都有了这些历史分支的本地拷贝。

小红和小明开始开发新功能

 

这个示例中,小红和小明开始各自的功能开发。他们须要为各自的功能建立相应的分支。新分支不是基于master分支,而是应该基于develop分支

git checkout -b some-feature develop

他们用老套路添加提交到各自功能分支上:编辑、暂存、提交:

git status
git add <some-file>
git commit

小红完成功能开发

添加了提交后,小红以为她的功能OK了。若是团队使用Pull Requests,这时候能够发起一个用于合并到develop分支。
不然她能够直接合并到她本地的develop分支后push到中央仓库:

# 拉取远程的develop分支,而且当前分支(本地分支some-feature)合并上远程分支develop git pull origin develop git checkout develop # 本地分支some-feature合并上develop #【注意】这个分支已经有远程的develop修改了,因此本地develop无需再作远程拉取的操做 git merge some-feature git push # 删除本地分支 git branch -d some-feature #【译注】上面的命令注释为译者添加,以方便理解 # 更多说明参见 Issue #18 

第一条命令在合并功能前确保develop分支是最新的。注意,功能决不该该直接合并到master分支。
冲突解决方法和集中式工做流同样。

小红开始准备发布

这个时候小明正在实现他的功能,小红开始准备她的第一个项目正式发布。
像功能开发同样,她用一个新的分支来作发布准备。这一步也肯定了发布的版本号:

git checkout -b release-0.1 develop 

这个分支是清理发布、执行全部测试、更新文档和其它为下个发布作准备操做的地方,像是一个专门用于改善发布的功能分支。

只要小红建立这个分支并push到中央仓库,这个发布就是功能冻结的。任何不在develop分支中的新功能都推到下个发布循环中。

小红完成发布

一旦准备好了对外发布,小红合并修改到master分支和develop分支上,删除发布分支。合并回develop分支很重要,由于在发布分支中已经提交的更新须要在后面的新功能中也要是可用的。
另外,若是小红的团队要求Code Review,这是一个发起Pull Request的理想时机。

git checkout master
git merge release-0.1 git push git checkout develop git merge release-0.1 git push git branch -d release-0.1 

发布分支是做为功能开发(develop分支)和对外发布(master分支)间的缓冲。只要有合并到master分支,就应该打好Tag以方便跟踪。

git tag -a 0.1 -m "Initial public release" master git push --tags 

Git有提供各类勾子(hook),即仓库有事件发生时触发执行的脚本。
能够配置一个勾子,在你push中央仓库的master分支时,自动构建好对外发布。

最终用户发现Bug

对外发布后,小红回去和小明一块儿作下个发布的新功能开发,直到有最终用户开了一个Ticket抱怨当前版本的一个Bug
为了处理Bug,小红(或小明)从master分支上拉出了一个维护分支,提交修改以解决问题,而后直接合并回master分支:

git checkout -b issue-#001 master # Fix the bug git checkout master git merge issue-#001 git push 

就像发布分支,维护分支中新加这些重要修改须要包含到develop分支中,因此小红要执行一个合并操做。而后就能够安全地删除这个分支了:

git checkout develop
git merge issue-#001 git push git branch -d issue-#001
相关文章
相关标签/搜索