现代化程序开发笔记(13)——Git与Monorepo

本系列文章以我的个人博客的搭建为线索(GitHub 仓库:Evian-Zhang/evian-blog),记录我在现代化程序设计中的一些笔记。在这篇文章中,我将简要介绍代码版本管理利器Git,同时谈一谈Monorepo的工作方式。

代码版本管理工具

作为开发者,我们通常会遇到两种写代码的场景:一种是写一个简单的程序或者demo,也许就几行,顶多也就两三个文件,要么用于自己的测试,要么用于展示,总之没有什么重要性,而且用完就被删了;另一种情况则是和他人合作,一起写一个很大的项目,并且会长期维护。第一种情况并不需要什么,我们自己配好编辑器、编译器就OK了,而第二种情况,除了自己开发代码以外,还需要关注很多代码之外的事,而这些事,就需要许多别的工具来帮忙了。

在维护一个大型项目的时候,我们会有一些最基本的编写代码之外的需求:

  • 能够回滚代码
  • 能够和他人双工写不同文件的代码
  • 能够知道某处代码是谁写的

这些需求都是最基本也是必要的需求。回滚代码,就是指我们在编写代码的过程中,发现这个思路是彻底错误的,那么我们就需要回到写这些代码之前重来,再比如我们写完了代码以后发现这个需求被取消了,那么我们也需要回滚这些代码。而双工写不同文件,则是指我们和合作者一起合作写一个项目,如果我们和他写的文件不一样,那么从情理上来讲我们应该可以同时写,最终得到的效果就是他的文件得到了改变,我的文件也得到了改变,而不是他得等我写完才能写他的,而我也得等他写完才能写我的。

除此之外,还有许多关于版本、作者、合作的需求。解决这些需求的一个利器,就是Git。

Git

大多数代码版本管理工具的原理都很直观,每一次修改代码,都是一个新的代码版本。我们只需要同时保存所有代码版本就能实现回滚代码了,并且在提交代码版本的时候加上提交者的签名,就能知道某处代码是谁写的了。

根据这个原理,我们理清思路,写代码究竟意味着什么。我们写代码,就是:

  1. 从那些保存的所有版本信息中,找出最新的一版

  2. 对这一版进行修改

  3. 作为一个新版本提交到所有版本信息中

只要是使用我们上面思路进行版本控制的工具,都无外乎这种做法。

那么,Git又与别的代码版本管理工具有什么区别呢?最大的区别,就在1和3两步。看到1、3两步,我们会有一个疑问:所有版本的信息是储存在哪的?Git采用的是分布式存储,也就是说,这些所有版本的信息是存储在开发者电脑本地的,也就是我们项目中的.git目录中。我们要和他人合作,只需要一个服务器实时同步我们本地的版本信息,合作者从服务器上拉取即可。而SVN等其他集中式版本管理系统则不一样,所有版本信息只存储在服务器上,我们在本地的,只有最新的一个版本。这两者各有好处。

关于Git具体原理和常用的命令,在其官方编写的指南Pro Git中有非常清晰、易懂的讲解,在网上也有许多相关的文章,太多人讲过的东西我就不讲了。

Monorepo

我们在进行大项目的版本管理时,有一个问题,就是每次的版本信息,存储多少代码?这个看上去显而易见,不就是全部代码嘛。然而,有些情况下,是需要我们考虑的。比如说,我的博客,有后端、Web端、iOS端和Android端。每个端的代码并不是紧耦合的,每个端都可以看作一个单独的项目。那么,我们究竟是把所有的代码放在一个Git仓库中(称为Monorepo),还是每个端的代码单独放一个仓库呢?

我们知道,如果两个项目完全没有关系,一个是做快餐店的页面展示,一个是校园成绩管理系统,那么这两个项目必然不会放在同一个仓库中。而如果两个目录的代码很相关,一个是数据库连接,一个是根据数据库连接,返回服务器响应,那么这两个目录必然会在同一个仓库。只有我们上面那种,几个项目并不是完全没有关系,而是逻辑相关,但代码并不是紧耦合的情况,最需要考虑了。

我的博客代码是使用的Monorepo,而我发现,React, actix-extras等都是采用的Monorepo形式,而且有的甚至是以前是多仓库,后来改成Monorepo的。

总结而言,Monorepo的好处有许多。

第一,Monorepo可以方便代码回滚。在许多大型项目中,一个新的需求会同时要求前端和后端都修改。当这个需求不需要时,前端和后端可以同时直接回滚到之前的版本,而不是分别回滚,有可能产生版本差异。

第二,Monorepo不会导致代码太过分散。当我们寻找一个大项目所有相关的项目时,只需要找这一个repo就可以了。

第三,当使用Docker compose,Docker swarm等集群容器编排时,多个微服务的代码放在同一个仓库里有利于我们配置文件的编写和发布。

其实,Monorepo和多仓库这两种方案,对于我们这种小项目并没有什么区别。只有像Google、Facebook那样非常大的项目时,才需要审慎考虑选择哪种方案。我个人比较喜欢Monorepo的方案,因为这样更加简洁一些。

热门文章

暂无图片
编程学习 ·

C语言期末考试内容(2)选择填空答案整理(基础章节内容)

C语言期末考试内容(2)选择填空答案整理(基础章节内容)文章目录C语言期末考试内容(2)选择填空答案整理(基础章节内容)作业二:变量定义/读/写与数据的存储表示一、判断题:答案: F F F F解析:1-4:C语言中的结束符是以分号来结束的,一个分号就代表一条语句。二、单选…
暂无图片
编程学习 ·

python从入门到放弃篇8(while True的使用,列表,if嵌套)实现选举小程序

今天,我又开始了新的征程,开始学习Java,但是老本不能忘,所以,我打算先把python的全套入门到放弃做完,再开始Java的新篇章,我刚刚装了Java的Esclipe编辑器全英文,还不太适应,过一段时间,慢慢熟悉,应该就会好起来了。路一步步走,饭一口口吃。 while循环,我是很喜欢的…
暂无图片
编程学习 ·

用Python读取pg数据库,准确统计每一张表的数据量,输出中英文表名和数据量

1 前言 在我们工作中,有时候老板关系我们手上到底有多少数据,每一张表中到底有多少数据量,整个库又有多少数据量?要给他一个准确的数据,给出一张详细清单。 在网上遇到的一种做法是使用navicat写SQL语句统计pg_class里面的reltuples这个列数据,但是发现这个数据有很大偏…
暂无图片
编程学习 ·

实战系列-Spring Cloud微服务中三把利器Feign、Hystrix、Ribbon

导语在之前的分享中分享过关于Fegin的底层实现原理,以及Spring Cloud OpenFegin的启动原理。在这次的分享中主要总结一下Spring Cloud 微服务架构的三把利器。对于Fegin、Hystrix、Ribbon三个组件来说它们之间是什么样的关系。怎么样综合使用等这些问题就是这次分享的内容文章…
暂无图片
中恒嘉业 ·

关于主从复制的超详细解析(全)

目录前言1. 主从复制1.1 方式2. Mysql的主从复制2.1 一主一从2.1.1 window和linux通讯2.1.2 linux和linux的通讯2.2 双主双从3. Redis的主从复制3.1 哨兵模式3.2 java代码结合前言 主要介绍mysql的主从复制以及redis的主从复制 能由浅入深的明白原理以及如何操作 再者&#xf…
暂无图片
郑州普通话 ·

android路由实现,flutter登录界面设计

二、Android面试知识框架三、Java 基础叩关 3.1 数据结构与算法 3.1.1 常用的数据结构有哪些?3.1.2 数组(1).如何在一个1到100的整数数组中找到丢失的数字?(2).如何在给定的整数数组中找到重复的数字? 小米(3).如何在未排序整数数组中找到最大值和最小值? 字节…
暂无图片
郑州普通话 ·

android语言基础教程,Android开发自学技巧

技术面 具体哪面问的忘了,就统一写一起了,具体的顺序也是随便写的。 Java相关String、StringBuffer、StringBuilder的比较。好,那你给我说个需要使用StringBuffer的场景(囧),还真没想出来。。。 finalize知道吧?不知道,但是我知道final和finally,好,那try catch fina…
暂无图片
代理记账 ·

在web应用中发送和接收Jakarta消息

Running the websimplemessage Example To Package and Deploy websimplemessage Using Maven _1、Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server). _2、In a terminal window, go to: tut-install/examples/jms/websimp…
暂无图片
cgfy ·

C++学习日记2——函数、封装、对象特性

一、函数 1.1 函数默认参数 1.1.1 简介 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 1.1.2 语法 返回值类型 函数名 (参数 默认值) {} 1.1.3 代码 #include <iostream> using namespace std;// 函数的默认参数 int func(int a, int b 20, int c 30…
暂无图片
coreui ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
coreui ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
未来博客 ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
未来博客 ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
建站日记 ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
建站日记 ·

NLP聊天机器人原理(seq2seq模型)

一、seq2seq模型 1.概念 seq2seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder将这个固定长度的向量变成可变长度的目标的信号序列。这个结构最…
暂无图片
mfbz ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
mfbz ·

全渠道会员通-天猫会员通3: 会员运营内容准备

在天猫会员通技术对接开发过程中&#xff0c;为了通知存量会员的通知工作&#xff0c;发挥会员通的优势&#xff0c;品牌需要做好以下事宜&#xff1a; 会员体系暂停公告&#xff1a;因会员通技术升级期间&#xff0c;会员服务将被暂停&#xff0c;店铺tab中会员入口将被下线&…
暂无图片
珊珊日记 ·

C# 执行Javascript脚本

c#教程https://www.xin3721.com/eschool/CSharpxin3721/ 前一阵子使用C#编写SCXML状态机&#xff0c;需要解析EMCScript表达式&#xff0c;使用了Jint库&#xff08;https://github.com/sebastienros/jint/)&#xff0c;当时感觉与C#之间的数据转换不是很方便。这两天有时间又关…
暂无图片
珊珊日记 ·

第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

A.大学期末现状 题目描述 作为一名大学生的你&#xff0c;现在又到了期末查成绩的时候&#xff0c;当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。 输入描述: 一行&#xff0c;一个整数x代表你的成绩&#xff08;0<x<100&a…