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


    本章通过讨论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二进制文件中

      

      7】无法直接查看, 文件对应的对象(object中都有)

      

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

  • 相关阅读:
    B轮公司技术问题列表(转)
    mysql函数之截取字符串
    谁才是真正的水果之王
    Mysql几种索引方式的区别及适用情况 (转)
    web安全之攻击
    css学习之样式层级和权重
    mysql中engine=innodb和engine=myisam的区别(转)
    mysql 创建表格 AUTO_INCREMENT
    mysql数据表的字段操作
    navicate使用小技巧
  • 原文地址:https://www.cnblogs.com/changdasheng/p/13199708.html
Copyright © 2020-2023  润新知