深入理解Git (二) - 内部的数据结构

Git是来管理数据的,也存储数据,所以可以说也是一个数据库,一个特殊的数据库,不同于RDBMS和NoSQL的数据库,一种索引数据可以快速查找数据变化的数据库。这节我们学习Git的对象存储方式。

Git为了快速查找数据,将数据添加一个header封装为数据对象,然后进行Hash,将此Hash值当作对象名字,以后根据此Hash值变可找到数据。具体的实现方式为:Hash值的前2位是文件的目录名字,后面的值为文件名。由于进行Hash,一旦文件内容改变,其对应的Hahs值就会变化,因而很适合变化的数据。

注意,本篇使用指针这个术语指代对象的Hash值。

Git总共有四类对象:

1 blob对象,就是存真正数据的对象。这种对象的SHA-1 Hash值只跟内容有关,跟文件名,文件模式,Hash时的时间没有关系。

2 tree对象,管理对象的对象,其内容指出包含了哪些子对象,tree对象是递归的。跟blob指针,文件名,文件模式有关,跟Hash时的时间无关。

3 commit对象,Git历史记录对象,里边存储tree对象和父亲commit对象,tree对象可以找到相应的数据,父亲commit对象可以找到历史纪录。跟cache中的tree指针和Hash时的时间有关,如果cache中的内容都一样,不同时间生成的commit对象的Hash值也不同。

4 tag对象,上面三种对象的别名表达方式。由于Git对象对名字是Hash值,所以很不容易记住,所以需要用户自定义一些好记的名字指引别的对象。

原文:http://blog.csdn.net/hongchangfirst/article/details/45332429

作者:hongchangfirst

hongchangfirst的主页:http://blog.csdn.net/hongchangfirst

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 15:31:39

深入理解Git (二) - 内部的数据结构的相关文章

理解git常用命令原理

git不同于类似SVN这种版本管理系统,虽然熟悉常用的操作就可以满足大部分需求,但为了在遇到麻烦时不至于靠蛮力去尝试,了解git的原理还是很有必要. 文件 通过git管理的文件版本信息全部存放在根目录.git下,稍微看下: $ ls .git COMMIT_EDITMSG HEAD branches description index logs packed-refs FETCH_HEAD ORIG_HEAD config hooks info objects refs git除了提供给我们平时

给你一个团队,你能怎么管? 读后感之二 内部的沟通方式

很显然,不管什么时候,团队内部的顺畅沟通都是最为重要的. 作为管理者,你必须有足够的方案去应付手下千奇百怪的思维,同时还有他们无所不能的信息获知手段. 无论任何时刻.任何情景,你都需要知道,哪怕再忠诚的员工,都会向你隐瞒一些重要的东西.假如没有为这个团队建立一个通畅的沟通渠道,你将一无所知,被隔离在这些内幕之墙的外面.时间久了,你就变成了瞎子和聋子,坐在一个最关键的位置上,却对手下正在干什么缺乏了解. 这些人是否执行了我的意图? ------- “执行力”是沟通的目标 他们的工作效率怎么样?彼此

Android学习笔记十四.深入理解fragment(二) 之《图书详情》实战

深入理解fragment(二) 之<图书详情>实战 通过上一篇博文<深入理解fragment一>,我们学习了Android-Fragment的核心知识点.现在在此基础上,利用Fragment技术开发一款适用于大屏幕手机/平板的查找图书详情的应用软件.该项目主要在于两方面,一是Activity.Fragment的源码实现:二是,布局界面资源文件的实现. 1.res/../BookListFragment.java: 自定义类,继承于ListFragment,无需实现OnCreateV

使用git微命令深入理解git工作机制

首先,这篇不是真正意义上的翻译,所以大家在看的时候不要找对应的英文文章对应着看.这篇文章之所以归类为翻译,是因为最开始有一篇英文文章让我对git内部机制有了清楚的认识,它可以说是我git的启蒙老师吧.然后很久过去后,自己也有了很多的git项目实践,觉得有必要从自己的理解角度(微命令和常用命令对应分析)来整理下自己的理解,于是有了这篇博文. git是一种管理数据的工具,一种支持快速索引查找数据并管理数据变化的工具.它为数据添加一个头封装为对象块(本文称为git对象)然后保存为文件,并根据数据生成一

git plumbing 更加底层命令解析-深入理解GIT

原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目repo有一个深入的理解. 除非你想通读Git源代码,你可能永远没有必要使用下面的命令.但是通过手工的操作一个repo将会让你对于GIT如何保存数据的概念细节有个深入理解,你也将对于git是如何工作的有更好的理解. 我们首先来检阅Git的object database,然后我们使用git的低级命令手工

深入理解OOP(二):多态和继承(继承)

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

再理解Windows程序内部运行机制

参照孙鑫<VC++深入详解> 创建Win32程序的步骤: 1. 编写WinMain函数 2. 设计窗口类(WNDCLASS) 3. 注册窗口类 4. 创建窗口 5. 显示并更新窗口(ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);) 6. 消息循环(不断地从消息队列中取出消息,并进行响应) 7. 窗口过程函数(处理发送给窗口的消息) 测试代码如下(在VS2010编译通过): #include <stdafx.h> #include

设计模式理解(二)创建型——单例、原型

设计模式理解(二)单例(Singleton)与原型(Prototype) 为什么一起写,因为懒.... 单例,就是用了面向对象语言的一些奇技淫巧,把构造函数私有了,然后用一个自身类型的静态指针作为全局唯一的实例的引用.碰到并发之类就呵呵了. 这么简单都能画个UML图,还煞有介事似的,我晕. -----------------------   分割线   ------------------------ 原型(Prototype) 我理解就是给一个类糊弄个cloneable之类的接口,让它自己决定

深入理解Git (一) - 元数据

三分钟教你学Git仅仅是教我们会用Git了,但是内部的一些实现原理假设我们也知道一些的话会使我们使用起来更加顺手.这个系列就是在你用了Git一段时间之后,并想继续到Git的内部看一下到底而准备的. Git仓库是依据什么知道仓库的元信息呢?我们首先git init,git会在文件夹下创建一个.git的隐藏文件夹,这个文件夹里存储了关于这个仓库的全部元数据.Git对象就存在其下的objects文件夹内.所以有必要看一下这里边都还存储了什么东西: 首先.git文件夹下有五个文件夹和三个文件: 1 br