转载

常用的代码提交方式,大家快来对号入座吧!

转载大师
转载大师   + 关注
2021-01-25 14:38:46   阅读11   评论0

作为一个开发人员每天必不可少要提交代码,但是你真的懂代码提交吗?这篇文章带领大家熟悉一下常用的代码提交方式,大家可以根据自己所在公司的开发模式对号入座。代码提交方式可以用一个专业术语描述:代码工作流,在 SVN 时代大家会使用集中式工作流,所有人都往一个主库分支合入代码;随着技术的演进,以Git为代表的分布式代码管理工具横空出世,在 Git 的基础上又逐渐出现了多种代码管理工作流:功能分支工作流,Gitflow 工作流,Forking 工作流。搬好小板凳,下面一一位大家讲解。

集中式工作流

集中式工作流这种工作方式对于使用过SVN的同学想必会非常的熟悉,让我们思考下在SVN下的协作体验,不同的开发同学需要依次将本地的修改提交到服务器,如果有冲突就先解决本地的冲突再提交,这个过程中远端的服务器就像是一个集中管理者,管理着所有人的代码提交,所以SVN的开发协作流程就是典型的集中式工作流。

如果切换到 Git 来维护代码仓,但是开发人员又对 Git 的分支模式不熟悉,能不能用 Git 实现类似的集中式工作流呢?答案是当然可以。

每个开发人员将远程仓库的代码 clone 下来变成了属于自己的本地仓库,提交代码时先提交至本地仓库,然后再推送到远程仓库。

这种模式相比 SVN 只是多了一个本地仓库而已,有了 SVN 的经验开发人员也很快能熟悉这种模式,在前些年有很多公司都是将 Git 作为 SVN 来用的。

从提交记录来看,集中式工作流通常是一条直线往前走,如图,集中式代码提交流程

小结:这种模式不推荐大家使用,因为完全没有发挥出 Git 的作用,类似于用倚天剑屠龙刀来切菜,太浪费了。

功能分支工作流

集中式工作流有一个很大的问题,随着团队内人员不断增多,大家每一次提交代码都可能会遇到冲突,提交代码一分钟解决冲突一小时。

为了便于大家并发开展工作,通常会基于 master 主干分支拉取几个特性分支,每个开发人员关注于自己的分支,需要提交代码时直接提交到本地库的特性分支,在合入到主干分支前通常会拉取最新的代码,如果有冲突先在本地解决好冲突,解决完提交 MR 申请将特性分支合入主干分支。

如图,功能分支工作流

在功能分支工作流下,不会直接将代码合入到主干分支(master),通常是通过其他分支提交 MR(Merge Request),这使得集成一些自动化操作变得简单可行了。

提交 MR 之后团队成员开始围观你写的代码,可以提交检视意见(code review),还可以进行投票(vote),团队 committer 据此合入或者驳回你的 MR。

如图,代码提交流程

新功能大量合并到 master 分支后容易造成 master 分支质量不稳定,不稳定会有什么问题?比如线上突然有个 bug 要解决,可能只需要修改一行代码就能解决,但是 master 分支已经合入了大量新特性,测试人员还没来得及测试,那最稳妥的办法就是将代码回退到上一次发版本的时间节点,基于这个节点再修改一行代码,是不是太麻烦了?

为了解决这些问题,Vincent Driessen大佬基于开发实践总结了一套 Git 分支管理的流程和规范,下面详细介绍一下。

Gitflow 工作流

Gitflow 工作流是目前非常成熟的一个方案,它定义了一个围绕项目发布的严格分支模型,通过为代码研发、项目发布以及维护分配独立的分支来让项目的迭代过程更加地顺畅,不同于之前的集中式工作流以及功能分支工作流,Gitflow 工作流常驻的分支有两个:主干分支 master、开发分支 develop。

和功能分支工作流相比,Gitflow工作流没有增加任何新的概念或命令,它给不同的分支指定了特定的角色,定义它们应该如何、什么时候交互。除了功能分支之外,还为准备发布、维护发布、记录发布分别使用了单独的分支。

Gitflow 常见分支:

  • 开发主分支:master 分支

master 分支的代码是可以直接部署到生成环境的,为了保持稳定性一般不会直接在这个分支上修改代码,都是通过其他分支合并过来的。

开发主分支:develop分支

develop 分支是主开发分支,包含所有要发布到下一个release的代码,主要是由feature分支合并过来的。

临时分支:feature 分支

feature 分支主要是用来开发一个新特性,一旦开发完成会合入 develop 分支,feature 分支也随即删除掉。

临时分支:release 分支

当需要一个发布一个新release版本时,会基于develop分支创建一个release分支,经过测试人员充分测试后再合入 master 分支和 develop 分支。

临时分支:hotfix 分支

当在生成环境发现新的Bug时候,如果需要紧急修复,会创建一个hotfix分支, 充分测试后合入master和develop分支,随后删除该分支。

各分支如何配合工作?

(1)master/develop分支

原则上master分支上所有的commit 都应该打上Tag,因为一般情况下master不存在 直接commit;

devlop分支 是基于 master分支创建的,与 master 分支一样都是主分支,不会被删除。

develop 从 master 拉出来之后会独立发展,不会与 master 直接产生联系。

如图,主分支工作流程

(2)feature 分支

通常一个独立的特性都会基于 develop 拉出一个 feature 分支,feature 分支之间没有任何交互,互不影响。feature 分支一旦开发完成后会立马合入 develop 分支(采用 merge request 或者 pull request),feature 分支的生命周期也随之结束。

如图,feature 分支工作流程

(3)release 分支

通常一个迭代上线会拉一个release 分支,开发人员开发完毕所有的代码都已合入 develop 分支,这时候会基于 develop 分支拉出一个 release 分支,测试人员基于该分支进行测试。

如图,release 分支工作流程

(4)hotfix 分支

hotfix分支基于master分支创建,开发完后需要同时回合到master和develop分支,同时在master上打一个tag。

如图,hotfix 分支工作流程

分支命名规范

团队内部可以约定每个分支的命名样式,这里举个例子,大家可以参考:

1.feature分支:以feature_开头,如 feature_order

2.release分支:以release_开头,如 release_v1.0

3.hotfix分支:以hotfix_开头,如hotfix_20210117

4.tag标记:如果是release分支合并,则以release_开头,如果是hotfix分支合并,则以hotfix_开头。

Forking 工作流

Forking 工作流是以 Github 为代表的一种代码协作方式,开发者通过克隆(fork)源仓库进行编写代码,一旦完成会发起pull request,源仓库作者可以选择是否接受该 PR。

下面通过 Github 详细讲解 Forking 工作流模式。

随便找一个Github 开源项目,

https://github.com/smileArchitect/JavaMap

右上角有三个按钮:Watch,Star,Fork

Watch是关注的意思,一旦你点击了之后该项目有任何改动都会第一时间通知到你;

Star类似于点赞的意思,多给开源项目点个赞,鼓励一下作者;

Fork本意是分叉,实际上是克隆的意思,点了之后会将该项目拷贝一份到自己的 github 远程仓库中。

fork 示例,如图

在本地执行git clone命令将代码克隆到本地,一顿修改操作后提交代码并push到个人远程仓库中,然后在界面上发起pull request,项目的原作者会看到你提交的PR,根据提交的质量作者可以选择接受或拒绝。

Github 工作流程,如图

Forking 工作流非常适合于类似 Github 这种开源项目,任何一个开发者都可以通过fork + pull request向项目中贡献代码。

总结

文章介绍了四种工作流,分别是集中式工作流,功能分支工作流,Gitflow 工作流,Forking 工作流。

集中式工作流在 SVN 时代比较常见,切到 Git 后不建议再使用这种方式了。

功能分支工作流通常是一个主干 master 分支 + 多个 feature 分支,一般适用于小团队开发。

Gitflow 工作流是在功能分支工作流的基础上进一步演进而来,采用 master + develop 双主分支再加上多个临时功能分支,这是一个非常成熟的代码协作管理的方式,推荐大家使用。

Forking 工作流主要采取 fork + pull request 的模式进行协作,主要用于开源项目。

最后:这四种工作流方式各有特色,开发团队可根据自身的特点去选择,不必严格拘泥于某一种方式,适合自己的才是最优的。大家学会了吗?

文章来源:微信公众号-爱笑的架构师, 作者雷架
对我有用,我要     转载  
文章分类: 好文分享  
所属标签: SVN   Git   代码工作流   Forking工作流  
  • 0条评论
  • 只看作者
  • 按时间|按热度
  • 由于本人多次涉及需要打印这个证明,而每次都会忘记入口,在网上各种搜索各种摸索很是浪费时间。故本次将操作流程整理记录下来,以备忘。同时也分享给大家。1、打开湖北政务服务网,地址:http://zwfw.hubei.gov.cn/s/index.html2、切换区域到“武汉市”3、在“特色服务”模块找到“(个人)武汉市社会保险公共服务平台”4、进入“(个人)武汉市社会保险公共服务平台”,登录账号密码<imgsrc="https://cdnstatic.hoscen.cn/blog/article/184053017752895488/img/497065960be44747825acb86a17483c1.png"style=
  • 1、找到nginx安装目录,找到nginx.conf ,  vi nginx.conf2、在http模块下面添加 server_tokens off;  ##隐藏版本号http {     ... 此处省略          server_tokens off;  ##隐藏版本号          ... 此处省略 }3、重启nginx4、效果如图,看不到版本号了
  • 目录:1、安装node.js环境2、安装cnpm3、安装vue-cli脚手架构建工具4、用vue-cli构建项目5、安装项目所需的依赖6、项目运行7、项目打包1、安装node.js环境下载地址:https://nodejs.org/zh-cn/安装过程没有太多好说的,安装完成后 win+R打开命令行输入node -v , 如图,出现版本号说明安装成功。npm包管理器是集成在node中的 , npm -v可以查看版本2、安装cnpm由于有些npm有些资源被屏蔽或者是国外资源的原因,经常会导致用npm安装依赖包的时
  • Thumbnailator,一个google开源的优秀的工具类 。根据提供的API可以快速实现图片缩放,区域裁剪,水印,旋转,保持比例 等操作。Thumbnailator官网:http://code.google.com/p/thumbnailator/ 本文主要讲图片原比例压缩功能。1、引入maven依赖2、demo测试public class TestImageUtil { public static void main(String[] args) throws IOException { String originImgPath = "C:UsersHoscenDesktopit.png"; String destImgPath = "C:UsersHoscenDesktopit-30.jpg"; Thumbnails.of(originImgPath) .scale(1f) .outputQuality(0.3f) .outputFormat("jpg") .toFile(destImgPath); } }3、测试结果原图,大小82.5kb<img src="https://static.hoscen.cn/blog/article/191329330033328128/img/5fa848b2b8f449bdb05dd78771777f83.png" style="width: 600px;" class="fr-fic fr-dib fr-fil
  • 一般我们在使用CDN时都设置有缓存时间,当源站资源发生变更后,如果缓存时间没到,那么用户访问的依旧是变更前的数据,虽说又拍云控制台提供了缓存刷新功能界面,但是每次都手动去刷新显示不太理想,当然又拍云也想到了这一点,提供给我们有API可以调用。本篇文章就是讲解如何接入又拍云缓存刷新API。网站免费接入又拍云CDN的方法,请查看我另外一篇文章,地址: https://www.hoscen.cn/blog/hao/articles/204022774975430656.html又拍云API文档:https://api.upyun.com/doc#/api/guide/overview看完文档,我们会知道又拍云提供有两个缓存刷新接口,一个支持通配符(但次数有限),一个是完整url刷新。同时注意调用接口时将 Token 放入 HTTP Header 中 。那么我们需要3个接口:1、获取token2、URL刷新3、缓存批量刷新详细请求参数和响应值请查看文档。话不多说,我们直接放上核心代码1、获取token2、URL刷新<img src="https://cdnstatic.hoscen.cn/blog/article/
  • 公益 404 页面介绍公益404页面是由腾讯公司员工志愿者自主发起的互联网公益活动。网站只需要在自己的404页面中嵌入一段简单的代码,就能通过互联网来迅速传播失踪儿童信息,从而提高找回失踪儿童的概率。失踪儿童信息来自宝贝回家寻子网。公益 404 页面接入方法:复制以下 js 代码,嵌入到您的 404 页面,可以自适应移动设备。<script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js" charset="utf-8"         homePageUrl="https://www.hoscen.cn/" homePageName="回到首页"></script>效果展示:注意事项:如果一个 404 页面的内容小于 512B,IE 会认为该 404 页面不够友好,在 IE 下将不会成功返回该 404 错误页面
  • 分享一个jQuery插件textarearesizer。它提供Resizer bar可拖动调整Textarea/div大小。代码示例:代码下载:    点击此处效果图:
  • XMind思维导图是做什么的,怎么使用,这些问题不在本次说明范围,本次就只做分享,一个XMind2020绿色免安装版分享!特点:1、无需安装,解压即用;2、可导出所有格式,不受限制;3、导出无水印;链接:https://pan.baidu.com/s/1jT0oXQS0Vxelsx1S2qVlRg 提取码:uew3 如果下载地址失效请留言反馈。资源来源朋友分享,仅供学习参考使用,请在下载后24小时内删除,请支持正版。
  • 前言:大部分前端开发Vue用的工具是vscode 或webstorm , 但是作为后端开发习惯了使用idea, 当然开发Vue也要用idea啦。前面已经讲到了《Vue入门篇:(一)环境搭建、项目创建、项目运行、项目打包》, 接下来就讲在idea开发vue项目的环境配置。配置过程:1、打开Setting > Plugins , 搜索vue.js插件并安装。2、打开Setting >Editor >  File Types , 配置HTML文件类型支持 .vue后缀3、打开Setting > Lnaguages .. > JavaScript  , 配置ES64、打开Terminal,执行npm r
  • 1真爱应该被定位为:温柔且有耐心的帮助对方成为更好的人。2不管身处怎样寒冷的冬季,只要想到你,心里就会不禁的温暖四起。3让我们每天带着希望出门,如果事与愿违,就再把希望带回家,休息休息,明天继续带出门。4我也太孤单了吧,连个偏旁部首都没有。5人间星火,竟无半点属于我。6如果总想着以后会遇到更好的人,那我们的相遇就毫无意义。7喜欢是晨曦前的朝露,喜欢是清风拂过山间,喜欢是想要触碰却收回的双手。8世间一切皆可努力,唯独相爱全凭运气。