本文首发自我的公众号:成都有娃儿,这里把三篇文章合一,方便阅读。

现在相当多的公司或者团队都在使用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的一点思考的更多相关文章

  1. 近期关于CI/CD策略以及git分支模型的思考

    近两个月由于个人处于新环境.新项目的适应阶段,没怎么提笔写些文章.中间有好几个想法想记录下来分享,但受限于没有很好的时间段供自己总结思考(也可以总结为间歇性懒癌和剧癌发作),便啥也没有更新.借这个周末 ...

  2. git flow的使用

    简介 Gitflow工作流程围绕项目发布定义了严格的分支模型.尽管它比Feature Branch Workflow更复杂一些,但它也为管理更大规模的项目提供了坚实的框架. 与Feature Bran ...

  3. Git Flow Note

    近期困惑于Git代码版本控制,集中两天时间研究,其中基础知识来源于<Git权威指南>,分支思想则来源于一篇博文<A successful Git branching model> ...

  4. 干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题)

    突然想写这一篇Git的使用心得,主要有几个原因,其一是自己使用Git也有快3年时间了,其间自己经历过一些坑,也有迷茫的时候,在呆过的大大小小的团队中,其实每个人也都并不是Git专家,很多对于流程以及G ...

  5. 【技术博客】Git Flow模型管理代码版本

    参考GIT版本管理:Git Flow模型,在此基础上加入了自己的理解,增加人员分工和相应代码,并根据本次项目的实际情况进行相应修改. 在本学期的软件工程开发过程中,我们从alpha阶段就使用了git ...

  6. 多人协作解决方案,git flow的使用

    简介 Gitflow工作流程围绕项目发布定义了严格的分支模型. 为不同的分支分配了非常明确的角色,并且定义了使用场景和用法.除了用于功能开发的分支,它还使用独立的分支进行发布前的准备.记录以及后期维护 ...

  7. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  8. Git 在团队中的最佳实践--如何正确使用Git Flow[转]

    原文地址:http://www.cnblogs.com/cnblogsfans/p/5075073.html Git的优点 Git的优点很多,但是这里只列出我认为非常突出的几点. 由于是分布式,所有本 ...

  9. GIT FLOW 时序图

    git flow sequence md link: git branching model master->master branch: use default branch Note rig ...

随机推荐

  1. Python实现简单用户注册信息管理系统

    运行效果: 注意:运行前请在同一目录下创建一个userdata.bin用于保存用户数据 源代码: 1 # coding:utf-8 2 ''' 3 用户注册信息管理系统 4 功能包括: 5 1.查看全 ...

  2. openlayer路线箭头

    // 用于设置线串所在的矢量图层样式的函数 var styleFunction = function(feature,res){ //轨迹线图形 var trackLine= feature.getG ...

  3. Django高级之-缓存

    一 缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消 ...

  4. String相关API-getBean()方法的使用

    一.使用id //userService是Bean标签中配置的id属性值 UserService service = (UserService) context.getBean("userS ...

  5. Go xmas2020 学习笔记 00-03、Basic Types

    00-02-Hello Example. 目录结构. 不一样的Hello World. 巧妙的单元测试. 传入os.Args切片. go mod init. 03-Basic Types. 变量类型与 ...

  6. 【分享汇总】25个主题分享,360°领略OpenHarmony最新技术版图

    2021年10月,开放原子开源基金会旗下开源项目 OpenAtom OpenHarmony (以下简称"OpenHarmony") 应邀参加华为2021 HDC 开发者大会,并组织 ...

  7. 移动安卓App+BurpSuite的渗透测试

    从Android 7.0及以上版本开始,安卓系统更改了信任用户安装证书的默认行为,用户安装的证书都是用户证书,因此不管是filddle还是burp,都是把他们的根证书安装到了用户证书,而有部分移动ap ...

  8. 2021.08.05 P7095 不离【扶咕咕出题】(贪心)

    2021.08.05 P7095 不离[扶咕咕出题](贪心) [P7095 yLOI2020] 不离 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 游戏中人物有两个属性,我 ...

  9. 通过实例程序验证与优化谈谈网上很多对于Java DCL的一些误解以及为何要理解Java内存模型

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  10. jsp第一周作业

    环境搭建,运行出来一个JSP页面,显式hello 英文字母表 <%@ page language="java" import="java.util.*" ...