关于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开发】控件外边框自定义
1.在drawable里面新建自定义的资源文件shape <?xml version="1.0" encoding="utf-8"?> <sh ...
- Spring Security的使用
spring security使用目的:验证,授权,攻击防护. 原理:创建大量的filter和interceptor来进行请求的验证和拦截,以此来达到安全的效果. Spring Security主要包 ...
- Exchange日志
Exchange日志是exchange的重要组成部分,也是管理exchang的重要指标.exchange日志产生的速度很快,而且会占用大量磁盘空间.如何管理日志成为exchange管理员的重要管理任务 ...
- 解决vue安装时出现vue --version或vue不是内部命令的问题
1. 试图全局配置 vue 的环境变量,找到 vue.cmd 的路径,然后进行配置. 问题:在文件搜索中,没有找到 vue.cmd,失败. 1.npm i npm -g 全局 update 了 npm ...
- EMS查看及修改邮箱发送和接受邮件大小的方法
默认情况下,新建用户邮箱没有进行单独设置,故用户邮箱默认值为"Unlimited"(未限制),即遵从全局设置(继承邮箱数据库策略).通过EMS查看用户邮箱发送和接受邮件大小的默认值 ...
- linux升级Nginx1.6到Nginx1.12.2
我的升级环境: 旧版Nginx:1.6 新版Nginx:1.12.2 系统:Redhat 5.5 64位 前期准备 1.查看Nginx的安装位置 ps -ef |grep nginx --如 ...
- Linux磁盘分区fdisk命令操作(简洁版)
实例(环境为: CentOS Linux release 7.2.1511 (Core), 3.10.0-327.el7.x86_64) 选择要具体操作的第二块磁盘(linux下一切是文件形式对应): ...
- 面试突击39:synchronized底层是如何实现的?
想了解 synchronized 是如何运行的?就要先搞清楚 synchronized 是如何实现? synchronized 同步锁是通过 JVM 内置的 Monitor 监视器实现的,而监视器又是 ...
- php第一次实验个人博客网站的设计编写①
先上效果图: 网页代码:index.html <!DOCTYPE html> <html lang="en"> <head> <m ...
- javaWeb代码整理01-mysql
jar包: maven坐标: <dependency> <groupId>mysql</groupId> <artifactId>mysql-conne ...