git 原理简介

article/2025/9/11 20:44:26

文章目录

    • 关于版本控制
    • 分为三种版本控制方案
      • 本地版本控制
      • 集中化的版本控制
      • 分布式版本控制
  • git基本底层原理
  • git提交流程原理
  • Git的引用(分支)
  • git log原理
  • 总结
  • 参考链接


关于版本控制

  1. 什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
    在本书所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
  2. 作用:
    如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能),采用版本控制系统(VCS)是个明智的选择。 有了它你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。

分为三种版本控制方案

本地版本控制

例如:

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。
这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。

在这里插入图片描述
其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 RCS 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
问题:显而易见的漏洞 ,如何让在不同系统上的开发者协同工作

集中化的版本控制

于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。
这类系统,诸如 CVS、Subversion 以及 Perforce
等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
多年以来,这已成为版本控制系统的标准做法。

在这里插入图片描述
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。

事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

分布式版本控制

于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。
在这类系统中,像
Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,
而是把代码仓库完整地镜像下来,包括完整的历史记录。
这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

在这里插入图片描述
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
这就是git 分布式版本系统的优势。

git基本底层原理

Git的核心是它的对象数据库,其中保存着git的对象,其中最重要的是blob、tree和commit对象,blob对象实现了对文件内容的记录,tree对象实现了对文件名、文件目录结构的记录,commit对象实现了对版本提交时间、版本作者、版本序列、版本说明等附加信息的记录。这三类对象,完美实现了git的基础功能:对版本状态的记录。

blob数据对象记录内容,tree对象记录文件名和文件目录结构,commit对象记录版本的信息

git提交流程原理

git add 添加文件到暂存区,并且创建数据对象添加到tree对象中且记录到git数据库 (作用)

Git根据某一时刻暂存区所表示的状态创建并记录一个对应的树对象(一个暂存区对应一个tree对象)

git commit (作用)
然后把以上的tree对象添加到commit 对象中记录到git 数据库中。

bolob(文件)>tree(目录)>commit(汇总提交和提交信息)>Git数据库

每次我们运行 git add 和 git commit 命令时, Git 所做的实质工作是将被改写的文件保存为数据对象,更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。 这三种主要的 Git 对象——数据对象、树对象、提交对象——最初均以单独文件的形式保存在 .git/objects 目录下(对象数据库)。

Git的引用(分支)

Git的引用(references)保存在.git/refs目录下。git的引用类似于一个指针,它指向的是某一个hash键值。

创建一个引用实在再简单不过。我们只需把一个git对象的hash键值保存在以引用的名字命名的文件中即可。

分支
创建一个新分支:它只是为你创建了一个可以移动的新的指针
分支指针指向commit对象集中的某一个对象而已。

这里我要说一个容易被误导的地方:
我们创建一个新分支会感觉此分支是一个独立的单元,其实分支指针和commit集是一对一的关系,只是commit集根据时间序列排列,分支的指针会自动指向最新的commit对象。
区别在于不同分支指向的commit对象前后顺序不同而已。有新有旧的commit

这基本就是 Git 分支的本质:一个指向某一系列提交之首的指针或引用。 (分支也就是一个指针或引用)
合并分支分为三种情况:

  1. 快进步合并:
    基于master创建的hosfix分支合并 (master指针向右移动至hotfix最新commit对象)

注意:快进步合并方式会把hotfix的所有commit记录合并至master,其原理是在master源commit节点C2 处追加了hotfix分支的所有commit记录并且将master指针向右移动至最新的commit记录

在这里插入图片描述
2. hotfix合并到master后,现需要iss53分支合并到master,但是iss53分支并没有hotfix分支commit记录
出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并。
三方合并:
在这里插入图片描述
一次典型合并中所用到的三个快照
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。

这种三方合并,类似于合并三个分支各自最新的commit代码,最后一次性做一次提交。 特殊之处在于,master分支有多个父commit节点 例如:C2、C4、C5

  1. 合并冲突
    冲突的产生是因为在合并的时候,不同分支修改了相同的位置。所以在合并的时候git不知道那个到底是你想保留的,所以就提出疑问(冲突提醒)让你自己手动选择想要保留的内容,从而解决冲突,最后 重新创建 commit 合并提交。

git log原理

列出所有分支log及所有父节点commit

查找HEAD指针对应的分支,本例是master
找到master指针指向的快照,本例是785f188674ef3c6ddc5b516307884e1d551f53ca
找到父节点(前一个快照)c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa
以此类推,显示当前分支的所有快照

总结

Git的核心是它的对象数据库,其中保存着git的对象,其中最重要的是blob、tree和commit对象,blob对象实现了对文件内容的记录,tree对象实现了对文件名、文件目录结构的记录,commit对象实现了对版本提交时间、版本作者、版本序列、版本说明等附加信息的记录。这三类对象,完美实现了git的基础功能:对版本状态的记录。

Git引用是指向git对象hash键值的类似指针的文件。通过Git引用,我们可以更加方便的定位到某一版本的提交。Git分支、tags等功能都是基于Git引用实现的。

参考链接

底层原理
底层原理2
git官网
git pull原理


http://chatgpt.dhexx.cn/article/Xf84I2Bg.shtml

相关文章

【转】以太坊钱包分析与介绍

林修平在亚太区以太坊社区培训与交流Meetup深圳站上跟我们分享了他对以太坊各种钱包模式的介绍,还分析了Parity多签名钱包安全事件的技术原因。昨日,EthFans得到作者授权,分享他的PPT。鉴于PPT较长,为保证阅读体验,编者…

币久网好像暂停ZEC交易了,各位的ZEC币暂时不要转入币久网了

今天突然发现币久网不能交易ZEC了,然后看到了官方公告,难不成ZEC也是P网的? 各位如果需要其他的钱包地址,比如Windows本地Zcash钱包地址,可以移步去我的其他博文看看 http://blog.csdn.net/squirrel1311/article/detai…

『0001』 - 如何通过 MyEtherWallet 创建钱包以及如何通过 Ethereum Wallet 和 MetaMask 恢复钱包账号

视频教程 来源: 黎跃春区块链博客 学习目标 钱包介绍创建钱包发送和接收以太币恢复钱包如何获取以太币 钱包介绍 Ethereum Wallet 钱包 开启Ethereum智能合约开发(Smart Contract)最快的方式就是Ethereum Wallet,它支持Windows, MacOSX 和 Linux开发…

web3.js链接以太坊并查询钱包u余额

web3.js链接以太坊并查询钱包USDT余额 环境:一、链接以太坊主网:二、创建一个ABI那么该如何获取ABI? 三、查询代码四、输出结果五、整体代码 环境: web3.js版本:6.14.15 不会安装以及使用web3.js的小伙伴看:https://blog.csdn.net/qq_45844443/article/details/124330035 一…

Clickhouse 以太坊分析:基础交易数据清洗

概述 读者可前往我的网站获得更好的阅读体验。 笔者最近遇到了许多关于数据分析的文章,大部分都使用了 Dune 等 SaaS 工具,这些工具往往提供了清洗后的区块链数据和数据库分析工具。对于大部分数据分析师而言,这些工具可以应对一系列复杂的…

DApp创建本地钱包并实现签名转账(BSC,Polygon,ETH)

文章目录 1. 项目准备2. 钱包相关概念3.随机创建一个钱包4.根据助记词导入钱包5.根据keystore导入钱包6.签名转账 1. 项目准备 安装ether.js npm install --save ethers引入ether.js:的三种方法 es3: var ethers require(‘ethers’);es5/es6 const ethers require(‘et…

使用ethers.js开发以太坊Web钱包 - 将私钥保存在客户端

为什么需要 Keystore 文件 通过这篇文章理解开发HD 钱包涉及的 BIP32、BIP44、BIP39,私钥其实就代表了一个账号,最简单的保管账号的方式就是直接把私钥保存起来,如果私钥文件被人盗取,我们的数字资产将洗劫一空。 Keystore 文件就…

CEX暴雷怎么办 一文读懂加密钱包产业现状

你的钱其实并不在你的借记卡里,借记卡只是授权你的银行帐户向银行系统数据库发送交易。同样,你的代币也并不在你的加密钱包里。加密钱包只是持有私有密钥以证明对数字资产的所有权,而这些资产是存储在公共区块链网络上的。私钥能让你对加密钱…

区块链隐私保护文献 An Efficient NIZK Scheme for Privacy-Preserving Transactions over Account-Model Blockchain

读:An Efficient NIZK Scheme for Privacy-Preserving Transactions over Account-Model Blockchain 本文的目的 找到一种适用于轻量级设备及智能合约的高效零知识证明 前人的工作 不能直接迁移UTXO模型的隐私保护方案的原因 在考虑用户余额的隐私时&#xff0…

最新消息,我的Zcash钱包收到鱼池的ZEC打款了

最新消息,我的Zcash钱包收到鱼池的ZEC打款了 有图有真相哈,竟然价值17元啊,哈哈,看到钱途了。。。 如果你们需要测试打款的,可以往我Zcash钱包打款哈 我的Zcash钱包地址:t1PH7xk25VYdJcR5TnkEuEq8jpsiQ…

区块链钱包—BTC Java版离线签名交易

对于离线交易不做过多解释~,说白了就是拿上一笔未发出交易记录进行私钥的签名然后广播到链上。 主要是对区块链离线交易进行utxo上链。 代码参考: https://gitee.com/DHing/signature-transaction UnspentUtxo交易查询参考:https://blog.c…

Zcash钱包(ZEC钱包)官方客户端常见命令实测(一)

一、如何查询链接节点 $ ./src/zcash-cli getpeerinfo 二、如何获取一个 t- 开头的钱包地址 $ ./src/zcash-cli getnewaddress 三、如何获取一个 z- 开头的钱包地址 $ ./src/zcash-cli z_getnewaddress

通过代码生成以太坊助记词、根据钱包地址获取私钥

生成助记词、公私钥 新建一个目录 在目录下执行 npm init (需安装nodejs)nodejs中文官网 安装依赖 (没有yarn的需要安装,直接执行 npm install -g yarn) yarn add bip39 ethereum-hdwallet 在目录下新建js文件 将下…

windows下的Zcash钱包(ZEC钱包)-zcash4win 1.0.12

官方下载地址:https://zcash4win.com/ 百度云盘下载地址:https://pan.baidu.com/s/1i46zcSt 密码: by6b QQ群交流分享:480956296

windows下的Zcash钱包(ZEC钱包)-zcash4win 1.0.11

官方下载地址:https://zcash4win.com/ 下载完后,直接下一步下一步,安装即可 技巧: 1、安装好后打开,开始下载文件,然后关闭 2、下载这两个文件:https://s3.amazonaws.com/zcashfinalmpc/sprou…

可能最详细的教程,新手如何获取Zcash钱包(ZEC钱包)官方客户端地址的方法

折腾了2天,终于折腾出了Zcash的官方地址了(非第三方交易平台的) 先上个图,有图有真相嘛,哈哈,图片有水印,看下面那个命令也是获取钱包地址的 好了,开始上教程,我这边使用…

今天终于找到了一款windows下的Zcash钱包(ZEC钱包),推荐给大家

折腾了好几天,想说下linux真心不适合我这类新人,所以导出百度,终于在官网看到一个链接 MacOS,想来这个应该是苹果系统的,有苹果,肯定也会有Windows的,于是点进去继续淘宝 后台请教朋友&#xff…

可能最详细的教程,新手如何获取Zcash钱包(ZEC)官方地址的方法

折腾了2天,终于折腾出了Zcash的官方地址了(非第三方交易平台的) 先上个图,有图有真相嘛,哈哈,图片有水印,看下面那个命令也是获取钱包地址的 好了,开始上教程,我这边使用…

Python中使用中文正则表达式匹配指定的中文字符串

业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌…