图解git原理

article/2025/9/11 18:37:01

用了这么久git,你有没有想过git的原理是什么?为什么git做回退这么快?创建、切换分支也这么快?git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体?打开一个git仓,看看目录下的.git文件夹,所有秘密都藏在这个.git里面。

下面举个栗子说明。我先git init了一个空仓,然后创建了两个txt文件,目录结构如下:

--dir1

   └ a.txt  内容是"hello"

--dir2

   └ b.txt 内容是"world"

然后再git add;此时发生了如下几件事:

  • git分别把各个文件经过计算得到SHA1值,并生成blob object(这种object的内容是文件经过无损压缩后的字节流),并存储到.git/objects目录下。
  • 此外还会更新.git/index文件(即暂存区的索引文件),我们可以用git ls-files --stage来看看它当前的内容:

其中b6fc4c、04fea0这两串数字分别是a.txt和b.txt的SHA1值。

我们去.git/objects里找到这个b6fc4c,打开看看:

 

 是串乱码。因为是被压缩过的。我们可以用git cat-file -t [sha1]来查看它的类型,用git cat-file -p [sha1]来查看它被压缩之前的原始内容:

现在我们执行git commit做一次提交。此时发生了如下几件事:

  • git从此次commit修改的每个文件向上遍历,将其父目录、祖父目录...等等都重新生成tree object(这种object用于记录某个目录的文件结构,即目录树)
  • git生成一个commit object(即一个提交,记录了根目录树的SHA1、父提交的SHA1、以及提交的commit message)
  • git将分支索引文件中的内容替换为这个最新的commit的SHA1

我们从上往下看。先打开.git/HEAD文件(HEAD用来表示当前分支):

当前分支叫refs/heads/master。

我们再打开.git/refs/heads/master:

意思是master分支当前指向37de56这个提交。

那再用git cat-file来看看这个提交的内容:

这个提交指向tree 83c4ae,继续往下看:

tree 83c4ae记录了根目录的结构,它有两个子目录,dir1和dir2,分别对应tree 658293和tree

098076:

这两个tree又分别指向一个blob object。

此时来张图就一目了然了:

上图第1列(绿色)是第一次提交,

修改a.txt的内容,做第二次提交(蓝色),可以看到更新后的a.txt产生了一个新的blob 620ffd,而b.txt我没做修改,所以复用上次的blob 04fea0;并且a.txt的更新影响了其父目录dir1和其祖父目录(即根目录)的tree object的刷新。

将b.txt从dir2移动到dir1,做第三次提交(橙色),由于只是移动,所以没有新的blob产生,但由于我更新了目录结构,所以dir1目录以及根目录需要重新生成tree object。

综上:git使用.git中的各式各样的文件、以及文件之间的指向关系来管理整个仓库。

需要注意的几点:

  • commit object会通过tree object来管理目录结构,但index文件不会指向任何tree object,它直接在自身的内容中记录每个文件的名字和所在的目录。
  • 一旦执行了git add,只要你别删除.git目录,你被add进去的代码就不会丢失。之前我还傻傻以为git reset --hard后文件都没了,实际上.git/objects里对应的blob全都在。

参考资料:这才是真正的Git——Git内部原理揭秘! - 知乎 (zhihu.com)

 


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

相关文章

Git 的原理

文章目录 什么是 Git?版本库是由什么构成的版本库(项目文件夹)的构成版本库(对象数据库)的结构提交的组成SHA1 算法 总结 暂存区什么样的文件,不应该上传到版本库中?查看暂存区清空暂存区选择性…

Git学习之git原理

git对象 当我们使用git进行版本管理时,git会将我们的文件和目录结构转化成git方便操作的数据(git对象),然后再对这些git对象进行管理,从而实现版本管理的目的,这些git对象存放在git的对象库中。 我们眼中的文件会被git转化成&qu…

Git 必知必会:原理剖析

作为程序员,最常用的版本管理工具便是 Git。但我相信大多数人和我一样,从没有认真了解过其具体实现的原理。但了解 Git 的原理,能有助于我们工作更好的使用 Git。下面,让我们一起来了解 Git 中的一些概念,以及实现。 一…

git 原理简介

文章目录 关于版本控制分为三种版本控制方案本地版本控制集中化的版本控制分布式版本控制 git基本底层原理git提交流程原理Git的引用(分支)git log原理总结参考链接 关于版本控制 什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文…

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

林修平在亚太区以太坊社区培训与交流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…