为什么需要版本管理

栏目: 软件资讯 · 发布时间: 5年前

内容简介:相信很多开发者已经是直接使用git了,没有经历过svn的年代。但这不影响我们了解这个常识。备注:本文的观点仅仅是个人的观点,不具有权威性,仅仅是工作感受,以及参考一些文章后的自我思考。版本的存在一定是解决问题的,解决哪几类的问题呢?

相信很多开发者已经是直接使用git了,没有经历过svn的年代。但这不影响我们了解这个常识。

备注:本文的观点仅仅是个人的观点,不具有权威性,仅仅是工作感受,以及参考一些文章后的自我思考。

解决问题

版本的存在一定是解决问题的,解决哪几类的问题呢?

服务器环境

服务器环境是我们使用版本后最优先解决的问题,所以在版本里我们优先设置了针对环境的不同主分支,这些分支是每个环境所确定使用的分支,如果公司有在使用自动化部署,很可能会把环境与分支做严格的对应。比如下面的对应关系:

环境 分支名 备注
线上 release 发布之后,有的公司可能会针对重要的release发布version
预发布 beta 拟生产环境,主要回归功能在线上数据和环境下是否有问题
测试 qa/test 主要的测试环境,也有的称为集成测试,因为有的开发代码可能原先是单独测试,没有考虑互相的影响
开发 develop 主要的开发环境,开发分支,开发完成后都要归并到这个分支

有了这个分支对应关系还不算完整,还需要对应的发布流程,以及发布流程中会如何使用这些分支,来保证以下几个原则:

  • 不丢失更上一级的代码
  • 在合并下一级代码时,预先让下一级代码合并上级代码,解决代码冲突问题
  • 不污染其他环境的对应分支
  • 等等

因此,我们制定了相应的每个分支更具体的定义,以及相应的分支流向。

点击查看: www.yuque.com/robinson/gi…

线上历史发布版本

线上历史发布版本主要针对两个可能情况:1 周期迭代版本 2 重大功能更新。这里不得不提,开源项目与非开源项目的区别。

项目类型 发布原因、频率 备注
开源项目(技术框架)或者公司四研发的客户端软件版本 大的功能更新,更新频率更低 主要是针对功能版本发版本,避免版本发布过于频繁对用户的影响,比较明显的像基本的技术框架,app版本
非开源项目(后端项目版本,web版本) 周期性迭代(频率很高) 周期性迭代,是指每1-2周,开发人员都会做一些开发工作,可能包括了小功能,代码重构,交互优化等等,所以这类必然会导致小版本非常多,当然也有可能会针对一个大的功能发大版本
非开源项目(外包项目) 大型项目开发(频率很低) 一般是非敏捷开发,长周期的产品整体功能的开发,按照大版本开发

那么我们针对自己的情况发布了不同的历史版本,究竟有什么具体用途呢?仅仅是留个历史版本摆着看么?当然不是。我能想到的是以下几点:

1.针对鲜明的功能版本做代码区分:在很多时候我们需要清楚知道一个功能的代码影响范围,通过功能版本我们可以清楚的看到;另外一个目的,就是,如果我们想针对某个功能版本,针对这个功能,做升级或者方案替换,那么目的会非常明显,也可以最大程度的参考之前的代码设计思维。

2.方便用户使用以及问题排查:主要是针对用户场景,针对不同版本我们会开放出不同功能,优化不同的问题,当用户反馈的时候,我们可以通过版本号,先模糊排查问题,如果是低版本的问题,用户进行升级即可。另外一个就是,有些版本的功能属于内测版本,或者最新版本,对于有些开发者比较倾向使用稳定版本或者历史版本,区分出版本利于开发者或者用户决定是否升级,或者指定使用哪个版本。

3.开发过程中的代码重置,这个有时候会发生,比如,我们开发某个功能,开发完成后,代码提到了测试分支,测试分支也改了一些代码,但是此时项目经理说,这个版本完全废弃或者延期上线,你怎么办?首先,需要明确的是,我们需要把测试分支重置到上一个没有合并开发分支的版本,你可以通过寻找test分支的历史提交记录,或者适用beta分支重置,如果beta分支是确定不会污染测试分支的没有bug的,但如果你有历史发布版本的话,其实问题就很简单了,你只要重置为上一个历史发布版本即可,最少这是一种可行方案,当然这种的前提是,你完整的丢弃test分支所做的开发合并。

4.线上发布中的版本重置,当我们发现发布某个版本时,导致了线上版本的崩溃,而且短期内不能解决问题,那么作为运维人员,只要将上个发布版本的代码重新发布一遍作为预备方案就可以了。(这里只考虑代码导致的问题,其他数据库的数据回退等这里不做考虑)

5.不同模块的沟通以及依赖机制,一般情况下,很多时候我们的代码还会依赖于其他人项目的版本,而如果对方没有相应的准确的版本号描述,其他同学便不知道该使用你的哪个版本,很多时候并不是最新的版本或者线上版本,而是另一个版本。

本地仓库与远程仓库

说道本地仓库有什么用,当然要提到本地仓库的一些特点,以及之前没有本地仓库之前的存储机制是如何的。

在没有本地仓库之前,大家想存储代码一般是必须通过直接提交到远程的,而且必须有网络,但这样有个明显的问题就是我们可能会把有问题的代码也提交上去。而别人正是通过拉取远程代码同步的,如果你把没有开发完成的代码提交上去,会导致使用同项目的开发同学遇到自己所不了解的代码问题。

而本地仓库的两个明显优点:1 可以离线存储 2 可以实现在本地存储代码而不提交到远程。也正由于第二个特点,我们对提交本地仓库代码的clean的要求有所放低。当你认为自己代码没问题时,在一次性与远程同步即可。 在你没有提交到远程时,别人同步拉取的代码都是正确的。

所以当团队内的成员代码之间有依赖关系的时候,需要对团队成员的提交做一定的限制说明,提交到远程的代码,尽量是clean,righ的,或者最少在推送修改时,通知到相关的使用人。

多人协作

多人写作最明显的是开发环境下,大家从开发分支拉出不同的分支。这里面有两种主要可能情况:

1 基于开发分支,不同人拉不同功能的feature分支,然后具体功能只在对应功能分支上开发,完成开发之后再聚合到develop分支上,分分支的时候,以dev-featureName为区分。

2 基于开发分支,同一功能需要不同开发者协作完成,完成开发之后再聚合到develop分支上,分分支的时候,以dev-featureName-name为区分。

bugfix分支

一般情况下,我们只对线上分支的bug拉bugfix分支进行问题修订,确定修补完成,再合并到主分支。所以它的流向会是:

release/master ==> bugfix ==> release/master

而在预发布环境,测试环境,开发环境,因为其造成的影响不是很大,所以一般是不会针对一个具体的bug拉取问题分支的,而是在对应环境分支直接修改所有问题。但如果有必要,为了减少对他人的开发,你也可以拉分支。

同分支历史版本

这一点主要是我们对同一个开发分支,对重要的提交做备注,以及可以找到不同提交状态下的hash值,得到这个值之后,我们可以根据提示的commit msg,结合hash更快的回到某个历史状态。

所以如果你想更好的利用好这一点,对我们提交记录填写的信息的规范性很重要。

版本对比分析,做cr

这个主要发生在两种主要情况:

1 代码合并请求,也就是merge request,当代码发起归并请求时,为了降低风险,我们一般会对将要合入的代码做两个分支的代码对比,仔细查看两个分支的代码区别,一一排查区别与问题。

2 排查问题,主要针对,原来的分支是么有这种问题,新开发分支相对有问题时;或者也可能是相反的关系,我们可以更快的通过代码对比, 找出差异代码就行问题的纠正。

我们需要如何操作

其实,不同分支的用途以及整个分支的变化过程还是比较严格的,基本可以满足我们各种需求,我们有必要了解所有分支的可能,以及代码分支流向。但还必须有几个基本点把握:

1 我们需要知道所有不同的分支分别用于解决什么问题,分支的代码流向设计成如何可以解决什么问题。

2 不是所有团队都严格执行分支流向管理和版本管理,对此不必过于执念,能解决当前需求的情况下,就按照怎么简单怎么来;但是当分支管理出现问题的时候,我们需要心中有一定的分支管理方案。

3 基本的分支状态,代码同步的命令要知道,虽然我们可以借助 工具 来完成,但为了更好的理解这个过程,最好是自己操作一遍命令的方式同步分支代码的过程。。

4 对于分支,除了借助规范,更重要的是培养团队的版本意识,灵活的解决各种问题的分支管理方案。当认知不在一个层次时,你认为很合理的内容可能别人认为没必要;也可能会出现,别人的认知很合理,而自己由于认知不到位,看不到潜在问题,而盲目反对对方的分支管理规范。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数字乌托邦

数字乌托邦

尼古拉斯•卡尔 / 姜忠伟 / 中信前沿出版社 / 2018-5 / 69.00

当下,技术与我们的关系变得越来越紧密不可分割,特别是智能手机等设备的出现,带给整个人类社会一场彻底的变革。的确,智能手机上的各种应用程序让我们的工作生活无比便利:社交媒体让我们能够和他人实时保持联络并传输信息,不再受时间、地点的限制;搜索引擎通过精准的算法将我们所需要的信息整合推送至屏幕上,让我们毫不费力就看到自己想要的;地图软件为我们的出行提供了更多路线选择,甚至可以使用语音导航,帮助我们顺利到......一起来看看 《数字乌托邦》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具