引入git flow分支管理
git flow是Vincent Driessen提出了一个分支管理的策略,非常值得借鉴。它可以使得版本库的演进保持简洁,主干清晰,各个分支各司其职、井井有条。
先看下Vincent Driessen提出的分支管理模型图,以便对git flow有个大概的了解。
两种核心分支
主分支(Master):代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。这个分支只能从其它分支合并,不能在这个分支上直接修改。需要注意的是,所有在master上的提交应该标记tag。
开发主分支(Develop):这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支。该分支应该只是进行一些优化和升级开发,如果有新的需求应该拉出一个feature分支。
三种临时分支
功能(feature)分支:这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release。
预发布(release)分支:当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支。
修补bug(hotfix)分支:当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release。
这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有master和develop。
Git Flow流程示例代码
1,创建develop分支
#从master拉出develop分支
#可选,获取最新版本。git pull origin master
git checkout -b develop master
#发布develop分支
git push -u origin develop
2,创建feature分支
#从develop拉出feature_v1.0功能分支
#可选,获取最新版本。git pull origin develop
git checkout -b feature_v1.0 develop
#发布feature_v1.0分支
git push -u origin feature_v1.0
#在feature_v1.0上开发一些功能
3,完成feature,合并到develop分支
#develop分支获取最新
git pull origin develop
#切换到develop分支
git checkout develop
#从feature分支合并到develop分支
git merge --no-ff feature_v1.0
#删除feature分支,也可以不删除
git branch -d feature_v1.0
4,开始release
#从develop拉出一个release分支
#可选,获取最新版本。git pull origin develop
git checkout -b release_v1.0 develop
#fix bugs
5,完成release,合并到master分支和develop分支,在master打上tag标记
#合并到master
git checkout master
git merge --no-ff release_v1.0
#在master打tag标记
git tag release1.0 master
git push --tags
#合并到develop
git checkout develop
git merge --no-ff release_v1.0
6,开始hotfix
#从主线master拉出一个hotfix分支
#可选,获取最新版本。git pull origin master
git checkout -b hotfix_v1.0.1 master
7,完成hotfix,合并到master和develop,并在master上打tag。
#合并hotfix_v1.0.1到master
git checkout master
git merge --no-ff hotfix_v1.0.1
#在master打上tag
git tag hotfix1.0.1 master
git push --tags
#合并hotfix_v1.0.1到develop
git checkout develop
git merge --no-ff hotfix_v1.0.1
Git Flow工具
分支命名规范
feature分支:以"feature_"开头,如feature_v1.1
release分支:以"release_"开头,如release_v1.1
hotfix分支:以"hotfix_"开头,如hotfix_20160112
tag标记:如果是release分支合并,则以"release_"开头。如果是hotfix分支合并,则以"hotfix_"开头。
master分支每次提交都要打tag,release tag:如release_v1.1,hotfix tag:如hotfix_20160112
命名都统一采用小写。
总结
1,一定要按git flow的流程去管理分支,如feature分支开发完要合并到develop,如果要发布版本到test环境,则从develop拉出一个release分支,release完成后要合并回master和develop分支,修复生产环境问题需要从master拉出一个hotfix分支,hotfix完成后要合并回master和develop分支,并且在master打上tag。
2,一定要按分支命名规范来命名,便于管理和维护。
3,了解了git flow工作流程后,可以不使用git flow GUI工具,手动操作即可,可以是原生git命令+vs配合操作,比如给master打tag就要用git命令,这在vs里操作不了的,比如合并分支,虽然也可以使用git命令实现,但在vs里操作更方便直观。
4,一定要保持分支的纯净,不要随便污染分支。比如,develop分支只包含要发布到下一个release的代码,在没有拉出release分支前不要合并新的feature分支进来。release分支基于develop分支创建,拉出release分支后,我们可以在这个release分支上测试和修复bug,但是,一旦打了release分支后不要从develop分支合并新的改动过来。develop拉出release分支的同时,也意味着develop分支可以开始下一个release的准备工作了。
5,如果多个版本并行到test环境,怎么解决这个问题?如下图。
原文地址:https://www.cnblogs.com/diandianquanquan/p/11351634.html
- CentOS6 安装couchdb2 集群
- 如何遍历维数和各维上限未定的多维数组
- 求长度的另一种方法(""+obj).Length
- ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
- GreenPlum 简单性能测试与分析(续)
- 最终版 Reflector v1.0 (+简单的反流程混淆)
- 性能&分布式&NewLife.XCode对无限数据的支持
- ASP.NET MVC下的异步Action的定义和执行原理
- 包学会之浅入浅出Vue.js:结业篇
- 迈克尔•戴尔:人工智能杀手?技术反乌托邦?不存在的
- 你知道吗?多个类多线程环境下静态构造函数的执行顺序
- 云端架构师养成之三:微信也在用的消息队列服务
- 现在 tensorflow和mxnet 很火,是否还有必要学习 scikit-learn 等框架?
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vim中宏命令的使用实例详解
- 在CentOS搭建Git服务器的详细步骤
- CentOS使用EPEL源的方法步骤
- VirtualBox 错误:This kernel requires the following features not present on the CPU
- keepalived实现nginx高可用
- LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS
- Centos7安装配置NFS服务和挂载教程(推荐)
- 轻松搞定VIM高亮NGINX配置文件的方法
- CentOS7 下安装telnet服务的实现方法
- Linux内核启动参数详解
- CentOS6.3添加nginx系统服务的实例详解
- Linux中在防火墙中开启80端口方法示例
- Apache 获取真实ip的配置的实现方法
- Linux下文件的切分与合并的简单方法介绍
- ubuntu 系统上为php加上redis 扩展的实现方法