集中式版本控制与分布式版本控制——Git 学习笔记01

2024-09-09 05:38

本文主要是介绍集中式版本控制与分布式版本控制——Git 学习笔记01,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是版本控制

如果你用 Microsoft Word 写过东西,那你八成会有这样的经历:

想删除一段文字,又怕将来这段文字有用,怎么办呢?有一个办法,先把当前文件“另存为”一个文件,然后继续改,改到某个程度,再“另存为”一个文件。就这样改着、存着……最后你的 Word 文档变成了这样:

这里写图片描述

过了几天,你想找回被删除的文字,但是已经记不清保存在哪个文件了,只能挨个去找。真麻烦,眼睛都花了。看着一堆乱七八糟的文件,真想把不用的都删除,只保留一个终极版,可是又怕哪天会用上,还不敢删,真愁人。

这时候你想,要是有一个软件能帮你记录每一个版本,并且能显示出各个版本之间的差异,那多方便啊。幸运的是,这样的软件还真有,git 就是其中一个。

git 不仅具备记录版本、比较差异等最基本的功能,还支持分支、离线开发、多点开发…… 总之 git 有非常丰富而强大的功能等着你去学习与发现。如果说你学习 git 是为了收获一缕春风,那么最后你得到的将是整个春天。

集中式版本控制(Centralized Version Control )

开发者之间的合作方式是共用一个仓库(repository),无论这个仓库是在本地还是在远端,只要是所有成员都共同存取同一个仓库,那么这种方式就是集中式(centralized)版本控制。

集中式版本控制的特点

集中式的版本控制系统其实有三大重点,即同步、追溯、以及档案的备份。
同步是为了让所有开发者对档案所做的变更都能够同步,最终得到相同的档案内容。

而追溯,则是能够回到受控档案在变化历史中的任何一个版本,并且明白每个版本间变化的原因、以及究竟做了什么变动。

至于档案的备份,无庸置疑的,就是让所有的受控档案集中保管于仓库中,作为备份也利于备份。不但能取得最新的版本,也能够取出任意时间点上的版本。

所以说,从集中式版本控制系统的设计观点来看,它主要是维持开发者之间保持同步的状态。若是根据保持同步的手段再细分,又能衍生出两种模式:一种是锁定模式,另一种是合并模式。

在锁定模式下,当开发者想要修改某档案、签出该档案后,该档案便会进入锁定状态,其他开发成员便无法加以修改,直到签出者将该档案签回为止。对于维持同步来说,这当然是一个十分保险的作法,因为永远不会有两个或以上的开发者同时修改同一个档案。只是这种方法造成了开发者对于档案修改的互斥效应,大大降低了开发效率。

因此,许多版本控制系统采用合并模式,在合并模式下,允许多位开发者同时针对同一档案进行修改,当他们分别将档案提交回仓库时,若发生冲突的情况,便会自动进行合并,而若自动合并失败,再要求人工合并。不过即使如此,最终目的还是要维持多个开发者间的同步。毕竟,版本控制的结果在集中式档案库中是唯一的,也是每位开发者都需与此结果保持一致的。

集中式版本控制的缺点

集中式版本控制系统使用起来会有什么问题呢?

首先,开发者想要签出代码、提交到仓库,或是对档案库做一些其他的操作,都必须在能够连网的环境下进行。这会大大降低开发效率。例如,你已经在本地端做好了必要的修改,想要提交到系统上,却因为正处于无法连网的环境,所以无法将档案提交出去。

当然,或许你会想,可以等到能联网之后再提交就好了。但是,我们希望每次提交的变更都是一个不可分割的最小单位,若因无法连网,无法将已完成的修改提交出去,那么也就无法继续修改其他的项目,不然应该被分为多次提交的内容就混在一块了。

如果有的开发者处在一些连网环境、速度较不佳的地区,每次存取仓库中的数据都会耗去大量的时间,这也是非常有碍效率的。

再者,由于每个开发者的修改,时常是反复持续进行,在修改的过程中,总会遇到未能稳定、完备到足以提供其他开发者使用的程度,若是在此时提交到仓库,便有可能让仓库的代码处于不稳定、不成熟的状态。当然,也可以让开发者持续修改至足够稳定完备后,再将修改内容提交至仓库。但是,在这个空窗期里,开发者就无法享受到版本控制的好处,他没有办法将修改过程中的不同阶段,划分成为多个版本。

分布式版本控制(Distributed Version Control)

由于集中式版本控制系统有一些致命的缺点,分布式(或分散式)版本控制系统应运而生,甚至慢慢成为主流。

分散式版本控制系统和集中式版本控制系统,其最大差别在于前者的仓库可以有多份。事实上,每个开发者都可以在自己的一台或者多台电脑上建立档案库。

虽然你可能认为二者都是将受控的档案储存在本地端,但其实档案库档案在本地端的工作复本还是有很大差别的。其中最重要的意义在于档案库中包含了完整的版本管理数据、例如提交信息、版本变化记录等等。因此,所有对版本控制系统的操作,都可以直接在本机端的档案库中进行,包括提交、分支、合并、回退等。

对分散式版本控制系统来说,其核心不在于维持不同开发者间的同步,而在于让每个开发者拥有各自独立的变更集合,且开发者之间可分享自己的变更集合。

在分散式版本控制系统中,开发者可以进行“推”(push)的动作,其意义是将自身档案库中的变更送至其他的档案库;也可以进行“拉”(pull)的动作,其意义是获取其他档案库的变更。

因为每个开发者都拥有独立的档案库,所以可以直接对自己的档案库进行操作。在离线环境中,开发者既可以连续工作,也可以持续修改,和本地档案库进行交互(比如管理版本、查询修改历史、回溯、提交、……)。另一方面,开发者不需要将自己的修改持续送至集中的档案库上,造成其他开发者必须套用这些修改,引起可能的不稳定情况。

因为分散式版本控制系统本质的关系,使得此类系统更重视对分支(branch)的支持,它们通常有较好的分支及合并的能力。git 非常提倡我们利用分支来辅助日常工作流程。

有了分散式的档案库及强大的分支管理,因而衍生出多种工作流程,比如集中式(Centralized)、整合管理者式(Integration-Manager)、司令官及副官式(Dictator and Lieutenants)等等。


参考资料

[1] https://www.ithome.com.tw/node/77088
[2] https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

这篇关于集中式版本控制与分布式版本控制——Git 学习笔记01的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150310

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识