[转载]理解 Git 分支管理最佳实践
原文
Git 分支有哪些
在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途。
分支分类
根据生命周期区分
- 主分支:master,develop;
- 临时分支:feature/*,release/*,hotfix/*;
根据用途区分
- 发布/预发布分支:master,release/*;
- 开发分支:develop;
- 功能分支:feature/*;
- 热修复分支:hotfix/*;
分支的用途
- master:作为发布分支,随时可以将分支上的代码部署到生产环境上。如果在生产环境上发现问题,则以 master 为基准创建 hotfix/* 分支来修复问题;
- develop:作为开发分支,所有最新的功能都将在该分支下进行开发,develop 也将是所有分支中功能最全,代码最新的一个分支;
- feature/*:命名规则
feature/功能名称
,作为新功能的开发分支,该分支从 develop 创建,开发完毕之后需要重新合并到 develop; - release/*:命名规则
release/v+发布的版本号
,作为预发布分支,release/* 只能从 develop 创建,且在 git flow 中同一个时间点,只能存在一个预发布分支。只有当上一个版本发布成功之后删除该分支,之后才能进行下一个版本的发布。如果在预发布过程中发现了问题,只能在 release/* 分支上进行修改; - hotfix/*:命名规则
hotfix/v+bug修复的版本号
,作为热修复分支,只能从 master 分支分离出来。主要是用来修复在生产环境上发现的 bug,修复完成并测试通过后需要将该分支合并回 develop 及 master 上,并删除该分支;
Git 分支管理流程
在上一部分,我们已经明确了每个主分支及辅助分支的用途与来源了,下面我们就来详细了解一下 Git 分支管理的整个流程。
先来看一下分支在完整的功能开发中是如何演变的:
从上图我们可以看出,我们同时开始了两个功能的开发/研究任务,下面我将以此为基础来讲解分支管理的流程。
先拉取最新的 develop 分支,然后以最新的 develop 为基准创建两个新的功能分支 feature/f1 和 feature/f2;
- git pull origin develop
- git checkout -b feature/f1 develop
- git pull origin develop
开发人员在各自的功能分支上进行开发工作,等当前功能分支开发完之后,将当前分支交由测试人员进行测试,测试过程中的问题修复及功能修改均在当前功能分支上进行;
当 feature/f1 上的开发及测试任务均完成之后,将 feature/f1 合并回 develop ,并删除 feature/f1 ;
- git checkout develop
- git merge --no-ff feature/f1
- git branch -d feature/f1
- git checkout develop
从 develop 分支创建新的预发布分支 release/0.2,并部署到预发布环境上测试。在预发布过程中发现问题则直接在 release/0.2 上进行修复;
- git checkout -b release/0.2 develop
在生产环境中发现一个 bug,从 master 上分离出一个热修复分支 hotfix/bug1,并在上面进行修复、测试并在预发布环境中验证,当都验证通过之后将分支重新合并回 develop 及 master,并在 master 上打一个热修复 tag v0.1.1,最后删除 hotfix/bug1;
- git checkout -b hotfix/bug1 master
- ....................
- ....修复bug..ing....
- ....................
- git checkout develop
- git merge --no-ff hotfix/bug1
- git checkout master
- git merge --no-ff hotfix/bug1
- git tag v0.1.1
- git branch -d hotfix/bug1
- git checkout -b hotfix/bug1 master
在 feature/f2 分支上的功能 f2 已经开发并测试完成,然后将 feature/f2 合并回 develop,并删除 feature/f2,此时已经存在新功能 f1 的预发布分支 release/0.2,所以需要等待其发布完成之后才能创建预发布分支 release/0.3;
- git checkout develop
- git merge --no-ff feature/f2
- git branch -d feature/f2
- git checkout develop
预发布分支 release/0.2 在预发布环境中完全测试通过,随时可以部署到生产环境。但在部署到生产环境之前,需要将分支合并回 develop 及 master,并在 release/0.2 上打一个正式发布版本的 tag v0.2,最后删除 release/0.2;
- git checkout develop
- git merge --no-ff release/0.2
- git checkout master
- git merge --no-ff release/0.2
- git tag v0.
- git branch -d release/0.2
- git checkout develop
当前已经不存在 release/* 预发布分支,所以可以开始功能 f2 的预发布上线。创建预发布分支 release/0.3,并部署预发布环境测试;
- git checkout -b release/0.3 develop
分支 release/0.3 测试通过,将 release/0.3 合并回 develop 及 master,然后在 master 上打一个正式发布版本的 tag v0.3,最后删除 release/0.3;
Git Flow
上述过程中未使用到 git flow,均是以约定的规范流程进行,大家可以尝试使用 git flow 来管理分支。
- #初始化 git flow
- # 设置 feature、release、hotfix、tag 的前缀名
- git flow init
- #开始一个新功能 f1 的开发,以 develop 为基准创建 feature/f1
- git flow feature start f1
- #....................
- #....f1 功能开发中....
- #....................
- #新功能 f1 开发完成
- # 合并回 develop
- # 删除 feature/f1 分支
- git flow feature finish f1
- #开始新功能 f1 的预发布验证,版本定为 0.2
- git flow release start 0.2
- #新功能 f1 预发布验证通过
- # 合并到 master 分支
- # 在 release 上打 tag v0.
- # 将 tag v0. 合并到 develop 分支
- # 删除 release/0.2 分支
- git flow release finish 0.2
- #开始 bug1 的修复,以 master 为基准创建 hotfix/bug1
- git flow hotfix start 0.2.
- # bug1 修复完成
- # 合并到 master 分支
- # 在 hotfix 上打 tag v0.2.1
- # 将 tag v0.2.1 合并到 develop 分支
- # 删除 hotfix/0.2. 分支
- git flow hotfix finish 0.2.
至此,Git 分支管理的整个流程已经讲解完,有兴趣的可以看一下具体的分支管理演示 https://github.com/alienwow/gitbranchmanage。
如果有上述讲解中任何不正确的地方,欢迎大家批评指正,如有疑问欢迎一起讨论。
参考文章
Vincent DriessenA successful Git branching model
Joe Guo 介绍一个成功的 Git 分支模型
[转载]理解 Git 分支管理最佳实践的更多相关文章
- git学习------>Git 分支管理最佳实践
ps:本文转载于 : https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html Git 是目前最流行的源代码管理工具.大 ...
- Git工程开发实践(四)——Git分支管理策略
A successful Git branching model https://nvie.com/posts/a-successful-git-branching-model/ Git工程开发实践( ...
- git分支管理与冲突解决(转载)
Git 分支管理和冲突解决 原文:http://www.cnblogs.com/mengdd/p/3585038.html 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称 ...
- 应用Git Flow—Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高. 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...
- Git Flow,Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高, 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...
- Git 分支管理是一门艺术
转载: Git 分支管理是一门艺术 1 要确保:团队成员从主分支(master)获得的都是处于可发布状态的代码,而从开发分支(develop)应该总能够获得最新开发进展的代码. 2 "辅助分 ...
- Git 分支管理详解
大纲: 1.前言 2.创建分支 3.切换分支 4.合并分支(快速合并) 5.删除分支 6.分支合并冲突 7.合并分支(普通合并) 8.分支管理策略 9.团队多人开发协作 10.总结 注,测试机 Cen ...
- Atitit。团队建设--管理最佳实践--如何留住关键人才,防止人才外流 ??
Atitit.团队建设--管理最佳实践--怎样留住核心人才,防止人才流失 ?? 1. 1.人才流失后果 1 1. 1.员工的离职带走商业技术秘密和客户等资源 1 2. 2.影响在职员工的情绪.极大挫伤 ...
- Git工作流程最佳实践总结
Git作为一个目前非常流行的版本管理工具,深受开发者的喜爱.那么怎样才能将Git的作用发挥的更好呢?我根据实际的项目经验,归纳总结了以下Git工作流的最佳实践.这里所谓的最佳,是经过多次项目经验后,根 ...
随机推荐
- python之GIL release (I/O open(file) socket time.sleep)
0.目录 2.线索 C源代码 Py_BEGIN_ALLOW_THREADS Py_END_ALLOW_THREADS3.open(name[, mode[, buffering]]) -> fi ...
- NEST - 返回部分文档
Selecting fields to return Version:5.x 英文原文地址:Selecting fields to return 有时候,不需要让 Elasticsearch 返回查询 ...
- 使用sparkSQL的insert操作Kudu
可以选择使用Spark SQL直接使用INSERT语句写入Kudu表:与'append'类似,INSERT语句实际上将默认使用UPSERT语义处理: import org.apache.kudu.sp ...
- Codeforces 822E Liar dp + SA (看题解)
Liar 刚开始感觉只要开个dp[ i ][ j ][ 0 / 1 ]表示处理了s的前 i 个用了 k 段, i 是否是最后一段的最后一个字符 的 t串最长匹配长度, 然后wa24, 就gg了.感觉这 ...
- Cookies 和 Session的区别
1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. ...
- 高性能之html
下面是alloyteam的总结,还是那句老话站在巨人的肩膀上看的远. 避免使用Iframe Iframe也叫内联frame,可以把一个HTML文档嵌入到另一个文档中.使用iframe的好处是被嵌入的文 ...
- 使用VMware通过vmdk文件创建XP虚拟机
一.打开VMware workstation10,转到主页,选择“创建新的虚拟机”,然后选择“自定义(高级)”选项 二.虚拟机硬件兼容性选择默认兼容10.0模式,下一步之后,选择“稍后安装操作系统” ...
- LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...
- Aladdin and the Flying Carpet(唯一分解定理)
题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况: 题目分析:根据唯一分解定理,先将a唯一分解,则a的所有正约数的个 ...
- 大数据技术 - MapReduce的Shuffle及调优
本章内容我们学习一下 MapReduce 中的 Shuffle 过程,Shuffle 发生在 map 输出到 reduce 输入的过程,它的中文解释是 “洗牌”,顾名思义该过程涉及数据的重新分配,主要 ...