关于git flow的一点思考
本文首发自我的公众号:成都有娃儿,这里把三篇文章合一,方便阅读。
现在相当多的公司或者团队都在使用git来做版本控制,结合我这些年的工作经历,我总结了一些个人认为不错的使用规范和习惯。
脱离背景来讲规范有点不切实际,为了更好的阐述不同公司的做法,我们假设存在三种不同情况的公司和项目,分别来说说可能出现的最佳实践。
第一种情况是创业型公司,基于Scrum的方式来做敏捷开发。假设有多人需要在同一个分支A上进行开发,那么为了更好的协作,可以采取如下的git操作:
当完成编程工作后,先pull当前分支的远程代码,即git pull origin A。
然后可能出现两种情况,没有冲突直接就pull成功,这个时候可以继续完成commit操作,然后进行push到远程仓库。还有一种可能是有冲突,无法自动完成pull操作,那么先撤销pull操作,把当前的修改先git stash,然后再重新git pull origin A,之后再git stash pop出修改到当前工作区,解决完冲突后再进行commit,最后push。先pull的好处在于不会让pull直接覆盖掉你本次修改,从而导致代码缺失。
简单总结一下:先pull,再commit,最后push。
第二种情况是分支管理比较清晰的公司,也是基于Scrum方式来开展迭代任务。
一般来说分成dev分支,master分支(或者叫relase分支)。dev用于测试环境的部署,release分支用于线上生产环境的部署。
根据不同的需求类型,分别建立不同的需求分支。比如针对bug修复的,创建以”bug/“作为开头的分支,如bug/MYAPP-3101。针对新功能创建如”feature/MYAPP-3102“,看到前缀就能知道这个分支的用途。
如果需求分支开发完毕,那么就可以往dev分支上合并。当dev分支在测试环境被QA测试完毕无问题后,那么可以再合并relase分支。如果想对版本进行细腻的标记,那么还可以使用git tag来记录版本号,方便版本回退和管理。并且这个tag出来的版本是不可修改的,方便运维去部署不同的代码库版本。
常规的流程是这样的,但是如果出现一个sprint周期里面feature比较多,可以考虑单独创建一个sprint分支用来在开发和测试环境里面去合并需求分支,这样不会因为有一些代码还没确定要发布的情况下被直接合并到dev分支,要知道计划总有变化。
为了更直观地展示这个git flow的过程,我画了一个流程图。

最后一种是比较混乱的分支管理方式,但是简单粗暴。
有一个dev分支和master分支,所有人都在dev分支上直接开发。所以会出现很多合并代码的冲突,也会有一些需求因为最终没有上线而被丢弃。经过一系列忙碌的测试和验证后,最终dev会被合并到master。然后所有研发人员又会奔赴下一次迭代周期里面。
为了解决部分代码上线的问题,只能依靠cherry pick的方式去把真正需要上线的代码修改筛选出来。
最大的问题还在于频繁地人工审查和合并,代码就像面条一样搅在一起,让代码合并和发布变成了一种心智和体力双重负担,有的公司甚至在一个团队里面不得不安排一个单独的人来专门处理代码合并的事情。我不是不认可这种角色的存在,如果是一个复杂的系统,且开发人员较多,有一个资深的研发人员去做代码审核,顺便merge代码是很有必要的。但是如果merge代码成为了一个为混乱而四处救火的事情,那么就要思考一下git flow是否设计有比较大的缺陷。
在这种如同战火纷飞一样混乱的情况下,关于代码的保存就必须依靠程序员自己了,这有点开历史倒车,回到了被csv或者svn支配的年代。
针对这些问题,我建议是想办法尽快转向我上一篇文章说的分支管理方式:把feature分支建立好,完成各个功能模块的研发工程师分别创建对应的feature分支,等自测完成后,再合并到dev分支或者sprint分支,我个人认为有个sprint分支是最好的,测试完毕后再合并到master分支去线上部署。
每一个分支就像一个收纳盒,把稳定的代码变化放在其中,最后再几个盒子一起打包部署。有序,可拆解,按需部署,不是更好?
关于git flow的一点思考的更多相关文章
- 近期关于CI/CD策略以及git分支模型的思考
近两个月由于个人处于新环境.新项目的适应阶段,没怎么提笔写些文章.中间有好几个想法想记录下来分享,但受限于没有很好的时间段供自己总结思考(也可以总结为间歇性懒癌和剧癌发作),便啥也没有更新.借这个周末 ...
- git flow的使用
简介 Gitflow工作流程围绕项目发布定义了严格的分支模型.尽管它比Feature Branch Workflow更复杂一些,但它也为管理更大规模的项目提供了坚实的框架. 与Feature Bran ...
- Git Flow Note
近期困惑于Git代码版本控制,集中两天时间研究,其中基础知识来源于<Git权威指南>,分支思想则来源于一篇博文<A successful Git branching model> ...
- 干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题)
突然想写这一篇Git的使用心得,主要有几个原因,其一是自己使用Git也有快3年时间了,其间自己经历过一些坑,也有迷茫的时候,在呆过的大大小小的团队中,其实每个人也都并不是Git专家,很多对于流程以及G ...
- 【技术博客】Git Flow模型管理代码版本
参考GIT版本管理:Git Flow模型,在此基础上加入了自己的理解,增加人员分工和相应代码,并根据本次项目的实际情况进行相应修改. 在本学期的软件工程开发过程中,我们从alpha阶段就使用了git ...
- 多人协作解决方案,git flow的使用
简介 Gitflow工作流程围绕项目发布定义了严格的分支模型. 为不同的分支分配了非常明确的角色,并且定义了使用场景和用法.除了用于功能开发的分支,它还使用独立的分支进行发布前的准备.记录以及后期维护 ...
- Git 在团队中的最佳实践--如何正确使用Git Flow
我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...
- Git 在团队中的最佳实践--如何正确使用Git Flow[转]
原文地址:http://www.cnblogs.com/cnblogsfans/p/5075073.html Git的优点 Git的优点很多,但是这里只列出我认为非常突出的几点. 由于是分布式,所有本 ...
- GIT FLOW 时序图
git flow sequence md link: git branching model master->master branch: use default branch Note rig ...
随机推荐
- Android打开数据库读取数据
打开数据库读取数据 private MyDatabaseHelper dbHelper; dbHelper=new MyDatabaseHelper(this,"List.db", ...
- Dart语言基础
文章目录 前言:dart语言简介 一.变量 1.1.类型推导 1.2.默认值 1.3.Final 和 const修饰符 二.内建类型 2.1.数据类型 2.2.集合的相关操作 三.函数 3.1.函数的 ...
- window.history.go(-1);后退不刷新问题 移动端
在后退的界面上添加 判断是否是返回window.addEventListener('pageshow', function (e) { if(e.persisted || (window.per ...
- 微信小程序实战,用vue3实现每日浪漫情话推荐~
之前做了个恋爱话术微信小程序,实现高情商的恋爱聊天. 但最近突然发现,每天早上给女朋友发一段优美情话可以让她开心一整天,但无奈自己的语言水平确实有限,不能随手拈来,着实让人有点不爽. 不过办法总比困难 ...
- k8s,coredns内部测试node节点上的pod的calico是否正常的一个小技巧
最近由于master整个挂掉,导致相关一些基础服务瘫掉,修复中测试有些节点网络又出现不通的情况正常的启动相关一些服务后,测试一些节点,比较费劲,还有进入pod,以及还有可能涉及命名空间操作这里可以这样 ...
- HTTP请求头格式和响应格式
HTTP请求头格式 提示: 回车符 \r 换行符 \n 请求首行分析: 请求方式: GET 和 POST 方式: GET请求:地址栏访问.超链接访问都是get请求方式,get请求方式不安全,地址栏大小 ...
- Java学习day19
今天学习了窗口监听.和鼠标监听 通过构建自己的输入框监听方法能够实现简单的加法计算器 明天学习Swing,做一个简单的基于鼠标点击操作的画板
- JavaScript基础第02天笔记
JavaScript基础第02天 1 - 运算符(操作符) 1.1 运算符的分类 运算符(operator)也被称为操作符,是用于实现赋值.比较和执行算数运算等功能的符号. JavaScript中常用 ...
- python基础练习题(输入三个整数x,y,z,请把这三个数由小到大输出)
day3 --------------------------------------------------------------- 实例005:三数排序 题目: 输入三个整数x,y,z,请把这三 ...
- .NET宝藏API之:OutputFormatter,格式化输出对象
相信大家在项目中都用过统一响应参数模板. 先声明一个响应模板类: public class ResponseDto { public int code { get; set; } public str ...