码迷,mamicode.com
首页 > 其他好文 > 详细

第四章:基本Git概念(重点)

时间:2020-06-30 13:05:52      阅读:49      评论:0      收藏:0      [点我收藏+]

标签: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通常给包含版本库整个层次结构的树对象的提交对象打标签。

第四章:基本Git概念(重点)

标签:one   应用   dex   细节   散列码   col   分离   包含   数据传输   

原文地址:https://www.cnblogs.com/changdasheng/p/13199708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!