联想乐窗项目组-前端组 张晋佩整理
内容摘自网上,如有侵权,联系删除
Git-flow 工作流介绍
主要内容
本文主要分主要包括以下几个部分的内容
- 集中式工作流
- 功能分支工作流
- 功能分支工作流的问题
- git flow 的分支模型介绍
- git flow 的工作方式
- git flow 的操作命令
- smartgit 中使用 git flow
- 命令行使用 git flow
集中式工作流
所有的功能开发与修改都在 master 分支上进行的。开发者开始先克隆中央仓库。在自己的项目拷贝中像SVN一样的编辑文件和提交修改;但修改是存在本地的,和中央仓库是完全隔离的。开发者可以把和上游的同步延后到一个方便时间点。
在开发者提交自己功能修改到中央库前,需要先fetch在中央库的新增提交,rebase自己提交到中央库提交历史之上。
这样做的意思是在说,我要把自己的修改加到别人已经完成的修改上。
最终的结果是一个完美的线性历史。
如果本地修改和上游提交有冲突,Git 会暂停 rebase 过程,给你手动解决冲突的机会。
功能分支工作流
功能分支工作流以集中式工作流为基础,不同的是为各个新功能分配一个专门的分支来开发。功能分支工作流背后的核心思路是所有的功能开发应该在一个专门的分支,而不是在 master 分支上。
这个隔离可以方便多个开发者在各自的功能上开发而不会弄乱主干代码。
功能分支应该有个有描述性的名字,比如animated-menu-items或issue-#1061,这样可以让分支有个清楚且高聚焦的用途。
功能分支工作流的问题
git的branch非常的强大,但是git本身并没有对如何管理branch做出建议. 多人在同一仓库下,代码的
协作问题会越来越突出. 首先来看看我们之前项目的分支。
我们的问题:
分支众多,命名混乱有的分支用于测试,有的用于代码合并,有的分支已经被废弃,时间久了无法了解分支的具体用途。
混乱疯狂的分支合并操作,多个分支互相合并,出现问题难以回滚。
混乱的分支
疯狂的合并
git flow 分支模型的介绍
Gitflow工作流是经典模型,体现了工作流的经验和精髓。随着项目过程复杂化,会感受到这个工作流中深思熟虑和威力!
Gitflow工作流没有用超出功能分支工作流的概念和命令,而是为不同的分支分配一个很明确的角色,并定义分支之间如何和什么时候进行交互。
master分支
最为稳定功能比较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注意永远不要在 master 分支上直接开发和提交代码,以确保 master 上的代码一直可用;
develop分支
用作平时开发的主分支,并一直存在,永远是功能最新最全的分支,包含所有要发布 到下一个 release 的代码,主要用于合并其他分支,比如 feature 分支; 如果修改代码,新建 feature 分支修改完再合并到 develop 分支。所有的 feature、release 分支都是从 develop 分支上拉的。
feature分支
这个分支主要是用来开发新的功能,一旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回develop 分支进入下一个 release 。
release分支
用于发布准备的专门分支。当开发进行到一定程度,或者说快到了既定的发布日,可以发布时,建立一个 release 分支并指定版本号(可以在 finish 的时候添加)。开发人员可以对 release 分支上的代码进行集中测试和修改bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分支上的代码合并到 master 分支和 develop 分支。
hotfix分支
用于修复线上代码的bug。从 master 分支上拉。完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分支。
注意事项:
- 所有开发分支从 develop 分支拉。
- 所有 hotfix 分支从 master 拉。
- 所有在 master 上的提交都必要要有 tag,方便回滚。
- 只要有合并到 master 分支的操作,都需要和 develop 分支合并下,保证同步。
- master 和 develop 分支是主要分支,主要分支每种类型只能有一个,派生分支每个类型可以同时存 在多个。
git flow 的工作方式
初始化分支
默认会初始化 master develop 两个主干分支。如果已有了不同分支,初始化的时候,可能需要手动指定 master 分支 跟 develop 分支。
开发分支 feature
- 分支的名称都是以 feature/*-20170323 打头,不需要做修改
- 基于develop分支,可以有多个特征分支进行开发
- feature分支做完后,必须合并回develop 分支,合并完分支后一般会删除这个 feature 分支(也就是 finish 一般由测试进行,或者经过测试允许),也可以视情况保留
发布分支 release
- 分支名称以 release/*-20170323 打头
- release分支基于develop创建; 一旦创建了release分支,不能在从 develop 分支合并新的改动到 release 分支,可以基于release分支进行测试和bug修改,测试不用在另外创建用于测试的分支。
- release 发布的时候,合并到 master 和 develop 分支,同时打tag,视情况删除release分支,通常应该删除掉
维护分支 hotfix
- 分支名称以 hotfix/* 开头
- hotfix 分支基于 master 分支创建,开发完毕后合并到 master 和 develop 分支,同时创建 tag
- 这是唯一可以直接从 master 分支 fork出来的分支。
git flow 操作命令
安装
brew install git-flow(mac)
apt-get install git-flow(ubuntu)
使用概览
初始化git flow
- 初始化
git flow init
feature分支相关操作
创建新的feature分支
git flow feature start 分支名称
推送feature分支到远程
git flow feature publish 分支名称
- 获取feature分支
git flow feature pull origin 分支名称
- 完成feature
git flow feature finish 分支名称
release分支相关操作
- 创建release分支
git flow release start 分支名称 [base]
这里的base代表是基于那个feature分支创建的release分支
推送release分支
git flow release publish 分支名称
完成一个release分支
git flow release finish 分支名称
hotfix 分支操作类似
smartgit 使用 git flow
smart git配置
启用smart git
采用full配置
feature分支操作
配置完成之后,我们看到master和develop这两个主分支已经创建成功.
按照规范创建feature分支名称
可以同时有多个feature分支
完成feature分支
删除原有的feature分支
release分支操作
创建release分支
finish release分支
如果不勾选第一项 和 第四项 在第三步的时候需要手动合并 master
准备发布
hotfix分支操作
hotfix的创建操作同上
finish hotfix分支
同理,不勾选第一项 和 最后一项 需要手动将修改merge 回 develop
命令行使用git flow
创建develop分支
git branch develop
git push -u origin develop
开始新feature开发
git checkout -b 分支名称 develop
# 推送到远程 可选
git push -u origin 分支名称
3、完成feature
git pull origin develop
git checkout develop
git merge --no-ff 分支名称 // develop 合并 feature
git push origin develop
git branch -d 分支名称 //删除分支
git push origin --delete 分支名称 // 删除远程分支
创建release分支
git checkout -b 分支名称 develop // 从develop分支创建 release 分支
完成release分支
// 合并 release 分支到 master
git checkout master
git merge --no-ff 分支名称
git push
// 合并 release 分支 到 develop
git checkout develop
git merge --no-ff 分支名称
git push
// 删除 release 分支
git branch -d 分支名称
git push origin --delete 远程分支名称
创建hotfix分支
git checkout -b 分支名称 master
完成hotfix分支
git checkout master
git merge --no-ff 分支名称
git push
git checkout develop
git merge --no-ff 分支名称
git push
git branch -d 分支名称
git tag -a tag tag名称 master
git push --tags