Git 内部原理
首先要弄明白一点,从根本上来讲 Git 是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。 马上你就会学到这意味着什么。
- git object
头部信息和任意内容做SHA-1校验的结果作为文件名(前两个字符用于命名目录,剩下的38个字符命名文件);文件内容由zlib压缩所得,存在
.git/objects/
- tree object
它能解决文件名保存的问题,也允许我们将多个文件组织到一起。 Git 以一种类似于 UNIX 文件系统的方式存储内容,但作了些许简化。 所有内容均以树对象和数据对象的形式存储,其中树对象对应了 UNIX 中的目录项,数据对象则大致上对应了 inodes 或文件内容。 一个树对象包含了一条或多条树对象记录(tree entry),每条记录含有一个指向数据对象或者子树对象的 SHA-1 指针,以及相应的模式、类型、文件名信息。
- commit object
现在有三个树对象,分别代表了我们想要跟踪的不同项目快照。然而问题依旧:若想重用这些快照,你必须记住所有三个 SHA-1 哈希值。 并且,你也完全不知道是谁保存了这些快照,在什么时刻保存的,以及为什么保存这些快照。 而以上这些,正是提交对象(commit object)能为你保存的基本信息。
- git refs
我们可以借助类似于 git log 1a410e 这样的命令来浏览完整的提交历史,但为了能遍历那段历史从而找到所有相关对象,你仍须记住 1a410e 是最后一个提交。 我们需要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值。在 Git 里,这样的文件被称为“引用(references,或缩写为 refs)”;你可以在 .git/refs 目录下找到这类含有 SHA-1 值的文件。
- tag object
前文我们刚讨论过 Git 的三种主要对象类型,事实上还有第四种。 标签对象(tag object)非常类似于一个提交对象——它包含一个标签创建者信息、一个日期、一段注释信息,以及一个指针。 主要的区别在于,标签对象通常指向一个提交对象,而不是一个树对象。 它像是一个永不移动的分支引用——永远指向同一个提交对象,只不过给这个提交对象加上一个更友好的名字罢了。
最新文章
- java语言一维数组,对象数组
- 谈谈如何在面试中发掘程序猿的核心竞争力zz
- DSP28335矩阵键盘的检测
- Winform 打印PDF顺序混乱,获取打印队列
- linux modprobe.conf怎么不见了—-CentOS 6
- js 基于函数伪造的方式实现继承
- touches,motion触摸事件响应
- 不同的extend 在调用构造函数时不同的写法
- ASP.NET中常用方法
- UVA - 12230 Crossing Rivers (期望)
- RecyclerView中装饰者模式应用
- input取值区间实例
- 在CentOS 上搭建nginx来部署静态页面网站
- Linux简单学习
- s11 Docker+DevOps实战--过程和工具
- 使用tpcc-mysql进行性能测试
- lambda表达式,map函数
- DNS使用的是TCP协议还是UDP协议(转)
- Pandas对行情数据的预处理
- 二进制搭建kubernetes多master集群【三、配置k8s master及高可用】
热门文章
- golang简介
- eclipse新建maven项目出错 pom.xml报错
- vue2.0中router-link详解
- [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
- Codeforces 1119D(差分)
- 验证客户端的合法性、socketserver模块
- C# PDF文件转图片
- crack Tut.ReverseMe1.exe
- jq中的ajax传参
- ApacheHttpServer修改httpd.conf配置文件