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

现在相当多的公司或者团队都在使用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. ubantu之Git使用

    本文讲述在Ubuntu 14.04 x64环境下,如何安装Git,配置连接GitHub,并且上传本地代码到github. 一. 注册Git账户以及创建仓库 要想使用github第一步当然是注册gith ...

  2. Java中JSONArray转换成int[]的办法

    今天写项目的时候要做一个MyBatis的带IN子句的删除,于是用一个整型数组来保存待删除数据的ID 从前端将JSON字符串搞过来之后如何将JSONArray转换成int类型数组就成了个问题 下面是我的 ...

  3. uni-app中实现图片左滑的效果

    template: 1 <view class="my-reg"> 2 <view class="my-regs"> 3 <ima ...

  4. 联机算法和脱机算法[Alg_001]

    ​ 一.联机算法 1.定义 也叫在线算法,在算法执行过程中的任意时刻,只对要操作的数据进行一次扫描,扫描完成后便此后不再对已经操作过的数据进行保存和记忆. 这种算法有种特点:如果数据是储存在磁盘或者磁 ...

  5. python的编译和解释

    编译和解释 1.编译: 将源代码一次性转换成目标代码的过程 源代码 → 编辑器 →目标代码 →程序执行(同时程序输入)→结果输出 2.解释: 将源代码逐条转换成目标代码同时逐条运行的过程 源代码+程序 ...

  6. LeetCode 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 题意 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. ​ 例如,一个链表有 6 个 ...

  7. iOS全埋点解决方案-控件点击事件

    前言 ​ 我们主要介绍如何实现控件点击事件($AppClick)的全埋点.在介绍如何实现之前,我们需要先了解一下,在 UIKit 框架下,处理点击或拖动事件的 Target-Action 设计模式. ...

  8. spring原始注解开发-01

    我们使用xml-Bean标签的配置方式和注解做对比理解 1.创建UserDao接口以及UserDao的实现类UserDaoImpl(接口代码省略) public class UserDaoImpl i ...

  9. mysql HikariCP连接池配置

    #连接池配置 #最小空闲连接,默认值10,小于0或大于maximum-pool-size,都会重置为maximum-pool-size spring.datasource.hikari.minimum ...

  10. POP3协议(电子邮件邮局协议)中UIDL和TOP命令在实际使用中的作用

    POP3是电子邮件协议中用于接收邮件的协议,相较于发送邮件的SMTP协议,POP3的命令要多一些.主要的命令有LIST.STAT.RETR.DELE.UIDL.TOP.QUIT,以及用于登录邮箱的US ...