标签:one 应用 dex 细节 散列码 col 分离 包含 数据传输
本章通过讨论Git的基本架构组成和一些重要概念,来探讨Git的不同之处和原因。
一: 基本概念
1、版本库。
1】Git版本库只是一个简单的数据库,包含所有用来维护与管理项目的修订版本和历史记录。
2】Git版本库不但提供版本库中的所有文件的副本,还提供版本库本身的副本。
3】版本库配置是不随着clone转移的。
4】Git维护的两个主要结构: 对象库和索引。
5】版本库数据存放在 .git目录中。
6】索引是暂时的信息,对版本库来说是私有的。并且可以按需要创建和修改。
2、Git对象类型
1】对象库是Git版本库实现的心脏。
2】对象库包含: 原始数据文件、日志消息、作者信息、日期以及其他用来重建项目的任意版本或分支
信息。
3】GIt对象库里的对象只有4种: 块(blob)、目录树(tree)、提交(commit)、标签(tag)。
3、索引
1】索引是一个临时的、动态的二进制文件,它描述整个版本库的目录结构。
2】项目的状态可以用一个提交和一棵目录树表示。
3】索引使开发的推进与提交的变更之间能够分离开来。
4】索引在暂存后会保存变更,知道提交。索引可以将一个复杂的版本库状态过渡到,可推测的更好的状态
5】索引在合并中起到很重要的作用,例如: 允许管理、检查和同时操作同一个文件的多个版本。
6】文件位置在 .git/index二进制文件中
4、可寻址内容名称(对象内容的SHA1散列值)
1】Git对象库被组织及实现成一个内容寻址的存储系统。(对象库中的每一个对象都有一个唯一名称)
2】名称是:向对象的内容应用SHA1得到的SHA1散列值。(就是对象的名字和索引)
3】SHA1、散列码、对象ID都是这个散列值。
5、Git追踪内容
1】Git追踪的不是文件,而是内容。
2】Git对象库基于其对象内容的散列值,而不是基于用户原始文件布局的文件名和目录名设置。
3】如果两个文件内容完全一样,对象库里只存一份blob形式的内容副本。
4】Git使用文件的完整内容作为散列值,所以Git内部数据库有效地存储每个文件的每个版本,而不是差异。
5】总结:Git用不同散列值的blob区块来记录文件的历史版本,而不是存储一个文件名和一系列差异。
6、路径名与内容
1】Git需要维护一个文件列表组成版本库的内容,但它不基于文件名。
2】Git把文件名视为一段区别于文件内容的数据,Git就把索引从传统数据库的数据中分离了出来。
3】Git与其他类似系统的比较:
4】Git不关系文件名和目录名,而是记录每一个路径名。通过路径名精确的重建文件和目录。
7、打包文件
1】Git使用更有效的存储机制:打包文件。
2】创建打包文件: 首先定位内容非常相似的全部文件,然后为其中的一个文件,存储该文件的整个文件。
之后在计算其他相似文件与该文件之间的差异并且只存储差异。
3】只更改或添加文件中的一行,Git可能会存储新版本的全部内容,然后记录修改的那一行作为差异,
并存储在包里。
4】Git是内容驱动,计算的差异可以是版本库任何地方的两个文件的差异
(1、同一个版本的两个相似文件。 2、同一个文件的两个版本)
5】打包文件和对象库中其他对象存储在一起。也用于网络中版本库的高效数据传输。
二: 对象库图示
8、对象库图示。(引用: 也叫指向)
1】Git对象之间通过协作形成完整的系统。
2】blob对象是数据结构的"底端"。它被(tree)树对象引用。
3】树对象引用若干个blob对象,也可以引用其他树对象。
4】一个提交对象只能引用一个特定的树对象。
5】一个标签对象只能引用一个提交对象。
6】分支不是基本的Git对象,但它在命名提交时很重要。
7】对象在图示中的表示:
blob对象: 矩形、 树对象: 三角形、 提交对象: 圆形、 标签对象: 平行四边形、 分支: 圆角矩形。
8】新建一个目录添加一个新文件提交。(稍微复杂点的情况)
9、扩展知识:查看Git对象(git cat-file)
1】git cat-file commit 提交ID,查看提交ID对象。
2】git ls-tree 树对象ID,查看树对象
3】git cat-file blob blob对象ID,查看blob对象。
4】每一个对象都存在: .git/objects/目录中。
对象ID前两位是对应的文件名。后面是是文件的名字。
例如: 2】图 blob对象 cfb80a4.......ce139
三、Git在工作时的概念。
1、对象、散列和blob
1】Git 计算一个blob的SHA1的散列值,把散列值的十六进制会作为文件名放进对象库中
2】160位的散列值几乎不发生碰撞, 160位对应20个字节。 20个字节对应16进制的40个字节。(一个字节8位, 16进制一个字节4位)
3】16进制的40个字节,前两个数字是目录名。可以提高文件系统效率。(16进制两个字节,可以生成256个空间,均匀分布提高效率)
4】 git rev-parse 索引ID前缀 ,通过索引ID前缀,查询完整的散列值
2、文件和树
1】Git通过 目录树对象追踪文件的路径名。
2】Git会给每一个添加的文件创建一个对象,但Git并不会马上为树创建一个对象。
3】索引更新了,索引跟踪文件的路径名和blob对象。
4】任何时候都可以从当前索引创建一个树对象。
5】git write-tree 命令: 可以捕获索引当前信息的快照。
6】git ls-files XXX 命令: 显示索引和工作区的文件的信息。
3、SHA1的说明。
1】特性: 散列函数在数学意义上是一个真正的函数,对于一个给定的输入,会产生相同的输出。
2】不同的内容产生了相同的散列值,这才叫做碰撞。
3】Git通过原始提交的散列值,唯一标识整个数据结构在提交时的状态。
4、树层次结构
1】Git处理复杂的树层次结构: 文件对应 blob对象,子目录对应 树对象。
5、提交
1】一个提交对象包含。
丶标识关联文件的树对象名称。
丶创作新版本的作者的名字和提交时间。(add)
丶把新版本放到版本库的提交者的名字和提交时间。(commit)
丶对本次修订原因的说明。(提示消息)
2】即使是相同的内容,也会因为提交者名字不同或者提交时间不同。而生成的提交对象不同。
3】git show --pretty=fuller 命令,查看给定提交的其他细节。(比 show 多一个提交者和提交日期信息)
6、标签
1】有两种基本的标签类型。 轻量型和带附注型。
2】轻量型: 只是提交对象的引用,被版本库视为私有。这些标签不在版本库中创建永久对象。
3】带附注型: 创建永久对象,包含我们提供的消息。(根据 RFC4880来使用GnuPG密钥进行数字签名)。
4】默认情况下,Git命令只对带附注的标签起作用。
5】git tag 命令可以创建一个带有提交信息、带有附注且未签名的标签。
6】通常情况下,Git通过某些分支来给特定的提交命名标签。
7】Git通常给包含版本库整个层次结构的树对象的提交对象打标签。
标签:one 应用 dex 细节 散列码 col 分离 包含 数据传输
原文地址:https://www.cnblogs.com/changdasheng/p/13199708.html