Git 原理简谈
Git 本身是一个对 reference 进行管理的数据库,reference 指的是对原始数据的引用。通过对原始数据的追踪,那么就可以做到对版本的控制。Git 使用一个 DAG 存储了整个的reference,根据DAG 的特性,你不会找到一个环,也就是说对于版本的控制始终是有顺序保证的。
Git 有三个最基本的元素,Commit,Tree 和 Blob。Commit 记录了一次commit需要的信息,作者,comment和指向tree的指针。Tree 是一个指针,指向 Blob 和其他的 Tree,Tree 在逻辑上类似于 Unix 文件系统的文件夹,总对应着当前文件夹的情况。Blob 就是数据本身,例如代码或者其他本身需要追踪的数据。Tree 数据和 Blob 数据在逻辑上类似于文件夹和文件夹下的文件的关系。
Git 使用了SHA值作为文件名,对于三种内置类型的数据,都采用他们的本身计算出的 SHA-1 值作为文件名。为了方便索引,会把 SHA 值的前几个字符当作文件,然后进行索引。所有的文件都存储在 .git/ 目录。
Git 基本的工作模型如下
每一个 branch 会记录了一个对应的 commit,如果有多个 branch 就记录对应的 commit 信息。一次commit在逻辑上代表了一次的版本。每一次的 commit 指向了上一次的commit 和一个 tree。显然,指向上一次的 commit 是用来进行每一次版本控制,每一个的 tree 则是用来指向当前的文件夹信息,这里 tree 也有指向另一个 tree 的部分,这说明这当中有文件夹嵌套出现,一个文件夹中还有一个文件夹就会出现这样的情况。blob 就是对应的文件信息。
一个最基本的 Git 模型如下。
我们可以使用一个最基本的文件夹进行说明。在初始化的时候,产生所有的文件如图所示。
这里,我们重点关注 .git/objects/ 下的文件,git 产生的三种内置类型的文件都会存放在这里。
在使用 git add 命令新添加了一个文件的时候,我们可以看到 .git/objects/ 文件下已经有了新的数据。这个 1d0aaf744db6fea2b31826dc11a36ade43fdfdd9 是文件计算的 SHA-1 结果,存放在 1d 文件夹下是方便进行索引。我们可以使用 git 命令查看这个文件类型和文件内容。
使用 git cat-file -t {SHA-1 名} 可以用来查看文件类型, git cat-file -p {SHA-1名} 可以用来查看文件内容。
查看结果如下
可以看到这个记录是 blob 类型,也就是记录了原始的数据。原始的数据内容我们也可以看到。
在进行 git commit 命令之后,我们继续看下文件夹的变化。
此时,多了两个新的文件,分别是 a918c…. 和 41131a….,这两个文件对应的是 tree 类型的文件和 commit 类型的文件,通过 commit 信息,我们可以知道 a918c… 是 commit 类型的文件,而 41131a… 是 tree 类型的文件。
根据 git cat-file 命令,我们可以看到具体的 tree 文件的内容。指向了 blob 类型的文件,文件名是 1d0a… 真实对应的文件名是 foo.txt 。具体的 commit 文件记录了 Author 信息,comment 信息,并指向了一个对应的 tree 文件。
接下来,我们进行新的一次 commit,继续看看对应的 commit 文件信息和 tree 的信息。
可以看到,新的 commit 信息记录了上次的 commit 文件的名称,方便进行切换版本,也记录了这次的 tree 文件的信息。tree 文件记录了对应两个 blob 实体的名称。
如果新创建了一个文件夹,然后在文件夹中添加新的文件,就会出现 tree 指向新的 tree 文件的情况。而另一个tree 指向自己对应的文件信息
如果创建了新的 branch,那么会在对应的 .git/refs/heads 目录下创建新的 branch 文件,并指向此时的 commit 文件。
如果在新的 branch 中,改变了原来的文件,那么会直接创建一个新的 blob,记录这个文件信息,并且改变 tree 原来指向的位置,即两个文件是两个完全不同,但都存在的文件。
如在 new_branch 中,改变了 foo.txt 内容,那么此时 tree 指向的文件也发生了变化,有了在这个分支中新添加的文件,也有了改变的文件。
而在原先的 master 分支中,tree 仍然记录的是之前的信息。
Git 原理简谈的更多相关文章
- Git原理入门简析
为了获得更好的阅读体验,建议访问原地址:传送门 前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的 ...
- .NET简谈构件系统开发模式
转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
- Java线上问题排查神器Arthas快速上手与原理浅谈
前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...
- Git原理及常用操作命令总结
git原理介绍及操作 git 原理——
- .NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- PHP的错误报错级别设置原理简析
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
随机推荐
- 【前端】之HTML5基础知识
HTML5 文件格式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- OOXML中回车等特殊字符处理方法
问题点:NPOI处理xlsx文档时,将\r写成了换行符. 实例:以下字符abc\rcde 如果直接复制到Excel 2016,显示结果如下(单元格设置为折行显示): 如果用NPOI写入Xlsx文档,显 ...
- 这是一个测试 hello world
第一次写博客,冒着生命危险尝试一下,发说说 搞了半天,发现原创文章在随笔发,我以为在文章目录发,白白在文章那里建了分类,太难了吧我
- 更适合Pythoner的标记语言Yaml学习总结
pythonic的标记语言 之前总结过一篇关于小数据存储文件大比拼,当时着重介绍了json,因为它在各类编程语言的通用性较强.但今天,我想给大家介绍一款更加适合pythoner使用的语言Yaml. Y ...
- APP Distribution Guide 苹果官网
https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduct ...
- [TimLinux] JavaScript 元素动态显示
1. css的opacity属性 这个属性用于:设置元素的不透明级别,取值范围:从 0.0 (完全透明)到 1.0(完全不透明),元素所在的文本流还在.这个属性的动态变化可以用来设置元素的淡入淡出效果 ...
- 2019CCPC秦皇岛D题 Decimal
Decimal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- HihoCoder 1398 网络流 - 最大权闭合子图
周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1. ...
- ARTS-S ISO C
一些简称 ANSI: American National Standards Institute. ANSI是the International Organization for Standardiz ...
- 使用ExcelPackage进行Excel报表
Nuget包名为 epplus.core 命名空间OfficeOpenXml string localFileName = path + Path.DirectorySeparatorChar + f ...