集中式工作流
使用
Git
加强开发的工作流,比SVN
有几个优势:
- 每个开发可以有属于自己的整个工程的本地拷贝。隔离的环境让各个开发者的工作和项目的其他部分(修改)独立开来 —— 即自由地提交到自己的本地仓库,先完全忽略上游的开发,直到方便的时候再把修改反馈上去。
- Git提供了强壮的分支和合并模型。不像
SVN
,Git
的分支设计成可以做为一种用来在仓库之间集成代码和分享修改的『失败安全』的机制。
- 集中式工作流以中央仓库(master)作为项目所有修改的单点实体。
- 如果开发者本地的提交历史和中央仓库有分歧,Git会拒绝
push
提交否则会覆盖已经在中央库的正式提交。 - 在开发者提交自己功能修改到中央库前,需要先
fetch
在中央库的新增提交,rebase
自己提交到中央库提交历史之上。
功能分支工作流
功能分支工作流背后的核心思路是所有的功能开发应该在一个专门的分支,而不是在
master
分支上。这个隔离可以方便多个开发者在各自的功能上开发而不会弄乱主干代码。另外,也保证了master
分支的代码一定不会是有问题的,极大有利于集成环境。
- 功能分支工作流仍然用中央仓库,并且
master
分支还是代表了正式项目的历史。\
- 功能分支可以进行隔离开发,确保不会干扰主干代码,极大有利于集成环境。
- 功能分支可以实现pull request,使在修改主干代码前能够实现code review。
- pull request还可以事实现分支讨论与交流。
Gitflow工作流
Gitflow
工作流定义了一个围绕项目发布的严格分支模型。虽然比功能分支工作流复杂几分,但提供了用于一个健壮的用于管理大型项目的框架。
工作方式
Gitflow工作流仍然用中央仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并push
分支到要中央仓库中。
历史分支
相对使用仅有的一个master分支,Gitflow工作流使用2个分支来记录项目的历史。master分支存储了正式发布的历史,而develop分支作为功能的集成分支。这样也方便master分支上的所有提交分配一个版本号。
功能分支
每个新功能位于一个自己的分支,这样可以push到中央仓库以备份和协作。但功能分支不是从master分支上拉出新分支,而是使用develop分支作为父分支。当新功能完成时,合并回develop分支。新功能提交应该从不直接与master分支交互。
发布分支
一旦develop分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从develop分支上fork一个发布分支。新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上 —— 这个分支只应该做Bug修复、文档生成和其它面向发布任务。一旦对外发布的工作都完成了,发布分支合并到master分支并分配一个版本号打好Tag。另外,这些从新建发布分支以来的做的修改要合并回develop分支。
使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。
这也打造定义良好的开发阶段(比如,可以很轻松地说,『这周我们要做准备发布版本4.0』,并且在仓库的目录结构中可以实际看到)。
常用的分支约定:
用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*
维护分支
维护分支或说是热修复(hotfix)分支用于生成快速给产品发布版本(production releases)打补丁,这是唯一可以直接从master分支fork出来的分支。修复完成,修改应该马上合并回master分支和develop分支(当前的发布分支),master分支应该用新的版本号打好Tag。
为Bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。你可以把维护分支想成是一个直接在master分支上处理的临时发布。