GIT 数据结构
Git doesn’t think of or store its data this way. Instead, Git thinks of its data more like a series of snapshots of a miniature filesystem. With Git, every time you commit, or save the state of your project, Git basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot. To be efficient, if files have not changed, Git doesn’t store the file again, just a link to the previous identical file it has already stored. Git thinks about its data more like a stream of snapshots.
Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
git内部commit, tree, blob 三者的关系如下
需要用到的命令:
- 查看“blob”对象:git show + 对象名(SHA1哈希值)
- 查看“tree”对象:git show + 对象名 / git ls-tree + 对象名
- 查看“commit”对象:git show / git log + -s + --pretty=raw +对象名
- 查看“tag”对象:git cat-file tag v1.5.0
实例:
$ cd D:\playspace\git\git-study
$ git init
在该文件夹下新建三个txt,分别是a.txt ,b.txt, c.txt ,然后文件的内容分别写上 a, b, c
$ git add *
"暂存操作会为每一个文件计算校验和(使用我们在 起步 中提到的 SHA-1 哈希算法),然后会把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交"
引用自 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B
$ git commit -m "first commit"
"当使用 git commit
进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。"
引用自 https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%AE%80%E4%BB%8B
$ git log
commit 33c92d3c005e1697725d5b91687a9ce6fa2f93dc
Author: <@qq.com>
Date: Tue May :: +
$ git ls-tree HEAD
blob 2e65efe2a145dda7ee51d1741299f848e5bf752e a.txt
blob 63d8dbd40c23542e740659a7168a0ce3138ea748 b.txt
blob 3410062ba67c5ed59b854387a8bc0ec012479368 c.txt
或
$ git ls-tree 33c92
blob 2e65efe2a145dda7ee51d1741299f848e5bf752e a.txt
blob 63d8dbd40c23542e740659a7168a0ce3138ea748 b.txt
blob 3410062ba67c5ed59b854387a8bc0ec012479368 c.txt
可见上面git ls-tree 这个命令,是将哈希值为33c92d的这个commit对象对应的tree对象显示了出来,而这个tree对象含有3个blob
假设增加一个文件d.txt,对将其add后提交,然后再来看看git ls-tree HEAD的情况
$ git log
commit ff2151f2f05f0f5fd3d136705ef0112f8520ba43
Author: <@qq.com>
Date: Tue May :: + add d.txt commit 33c92d3c005e1697725d5b91687a9ce6fa2f93dc
Author: <@qq.com>
Date: Tue May :: + first commit $ git ls-tree HEAD
blob 2e65efe2a145dda7ee51d1741299f848e5bf752e a.txt
blob 63d8dbd40c23542e740659a7168a0ce3138ea748 b.txt
blob 3410062ba67c5ed59b854387a8bc0ec012479368 c.txt
blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 d.txt
可见 a.txt, b.txt 和 c.txt 的哈希值在新的tree对象里面并没有发生改变,新的commit对应的tree对象里对于没有修改过的文件,只保存了指针
也可以看出,每个commit对应的版本,也就是快照,是包含了全部的文件的
但是有个疑问,现在一个文件是对应一个blob,如果是一个文件夹呢,是一个blob呢,还是文件夹里每个文件一个blob呢,来试一下,根目录下增加一个文件夹folder1,里面增加两个文件a.txt和b.txt然后提交,然后再看看git ls-tree的结果
$ git ls-tree HEAD
blob 2e65efe2a145dda7ee51d1741299f848e5bf752e a.txt
blob 63d8dbd40c23542e740659a7168a0ce3138ea748 b.txt
blob 3410062ba67c5ed59b854387a8bc0ec012479368 c.txt
blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 d.txt
tree 4e2fd0b481a785eb99cab80ec1c582e1caf6cb44 folder1
看来是一个文件夹对应一个blob
使用git show,可以看到这个文件夹blob包含的内容
git show 4e2fd0b
tree 4e2fd0b a.txt
b.txt
使用git ls-tree来看这个blob,发现这个blob包含了两个blob...
git ls-tree 4e2fd0b
blob 2e65efe2a145dda7ee51d1741299f848e5bf752e a.txt
blob 63d8dbd40c23542e740659a7168a0ce3138ea748 b.txt
看来blob是可以包含blob的,blob既可以是文件夹,也可以是文件
GIT 数据结构的更多相关文章
- IPFS: Merkle DAG数据结构
今天带大家来深入探索一下IPFS的核心数据结构Merkle DAG 什么是 Merkle DAG? Merkle DAG是IPFS系统的核心概念之一,当然Merkle DAG并不是IPFS团队发明的, ...
- [转帖]Git数据存储的原理浅析
Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008 写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...
- java面试技巧
简历 1.HR看简历,都是看技术关键词.可以多看招聘要求,简历上要多写些关键词.比如io,集合,多线程,并发,spring,mysql,分布式等等. 2.可以准备多份简历,根据不同的jd发送不同的简历 ...
- IPFS - 可快速索引的版本化的点对点文件系统(草稿3)
摘要 星际文件系统是一种点对点的分布式文件系统, 旨在连接所有有相同的文件系统的计算机设备.在某些方面, IPFS类似于web, 但web 是中心化的,而IPFS是一个单一的Bittorrent 群集 ...
- 2016-2017-2《程序设计与数据结构》学生博客&git@OSC
2016-2017-2<程序设计与数据结构>学生博客&git@OSC 博客园 20162301张师瑜 20162302杨京典 20162303石亚鑫 20162304张浩林 201 ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- git查看本地和创建分支、上传分支、提交代码到分支、删除分支等,git分支、git查看本地和创建分支以及上传分支到服务器
以下是git命令行里边的命令操作 ##进入项目目录下 giscafer@Faronsince2016 /G/002_project $ cd Comments ##查看远程分支有哪些 giscafer ...
随机推荐
- P1262 间谍网络 (tarjan缩点 水过去)
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- inux下配置rsyncd服务
创建配置文件 touch /etc/rsyncd/rsyncd.conf #主配置文件 touch /etc/rsyncd/rsyncd.secrets #用户名密码文件,一组用户一行,用户名和密码使 ...
- Openssl编程--源码分析
Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...
- 快速安装freeswitch
前不久在Centos 6.4上安装了一台Freeswitch,测试已经OK.为了测试FS 的集群效果,从新在安装一台FS,快速安装的过程如下: 方案一:快速安装前提:不用重新下载Freeswitch. ...
- python decorators
it's a syntatical sugar: @function1 def function2: do something equal to: function2 = function1(func ...
- 用layui搭建的后台框架
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux中ping带时间及打印内容到文件
ping命令就不多说了,-i是时间间隔,-c是ping的次数 这种是每隔30秒ping一次,并在后面显示时间: ping 192.168.30.123 -i 30 | awk '{ print $0& ...
- 来,了解一下Java内存模型(JMM)
网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...
- Swift 学习- 05 -- 集合类型
// 集合类型 // swift 提供 Arrays , Sets 和 Dictionaries 三种基本的集合类型用来存储数据 , 数组(Arrays) 是有序数据的集, 集合(Sets)是无序无重 ...
- Java对象之间的深度复制拷贝
/* * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETA ...