美文网首页
Git底层数据结构和原理之二:对象模型

Git底层数据结构和原理之二:对象模型

作者: longLiveData | 来源:发表于2020-05-22 17:45 被阅读0次

    本文仅供笔者学习记录之用,侵删
    来源:阿里技术公众号,作者 与水
    原文:https://mp.weixin.qq.com/s/l5JU9e6_HrS_-ixiBIrqsA

    一、Git仓库结构

    仓库结构git分布式的一个重要体现是:
    git 在本地是有一个完整的 git 仓库,也就是 .git 文件目录,
    通过这个仓库,git 可以完全离线化操作。
    在这个本地化的仓库中存储了 git 所有的模型对象。

    下面是 git 仓库的 tree 和相关说明:

    git仓库

    二、Git四个对象模型

    git 主要有四个对象,分别是 Blob,Tree, Commit, Tag,这些对象模型之间的关系大致如下:

    对象模型关系

    这些模型都用 SHA-1 进行命名,可以用 git cat-file -t 查看每个 SHA-1 的类型,用 git cat-file -p 查看每个对象的内容和简单的数据结构。git cat-file 是 git 的瑞士军刀,是底层核心命令。

    三、Blob对象

    Blob 对象只用于存储单个文件内容,一般都是二进制的数据文件,不包含任何其他文件信息,比如不包含文件名和其他元数据。

    四、Tree对象

    Tree 对象对应文件系统的目录结构,里面主要有:子目录 (tree),文件列表 (blob),文件类型以及一些数据文件权限模型等。如下图输出:

    → git cat-file -t ed807a4d010a06ca83d448bc74c6cc79121c07c3
    tree
    → git cat-file -p ed807a4d010a06ca83d448bc74c6cc79121c07c3
    100644 blob 36a982c504eb92330573aa901c7482f7e7c9d2e6    .cise.yml
    100644 blob c439a8da9e9cca4e7b29ee260aea008964a00e9a    .eslintignore
    100644 blob 245b35b9162bec4ef798eb05b533e6c98633af5c    .eslintrc
    100644 blob 10123778ec5206edcd6e8500cc78b77e79285f6d    .gitignore
    100644 blob 1a48aa945106d7591b6342585b1c29998e486bf6    README.md
    100644 blob 514f7cb2645f44dd9b66a87f869d42902174fe40    abc.json
    040000 tree 8955f46834e3e35d74766639d740af922dcaccd3    cli_list100644 blob f7758d0600f6b9951cf67f75cf0e2fabcea55771    dep.json
    040000 tree e2b3ee59f6b030a45c0bf2770e6b0c1fa5f1d8c7    doc
    100644 blob e3c712d7073957c3376d182aeff5b96f28a37098    index.js
    040000 tree b4aadab8fc0228a14060321e3f89af50ba5817ca    lib040000 tree 249eafef27d9d8ebe966e35f96b3092d77485a79    mock
    100644 blob 95913ff73be1cc7dec869485e80072b6abdd7be4    package.json
    040000 tree e21682d1ebd4fdd21663ba062c5bfae0308acb64    src
    040000 tree 91612a9fa0cea4680228bfb582ed02591ce03ef2    static
    040000 tree d0265f130d2c5cb023fe16c990ecd56d1a07b78c    task100644 blob ab04ef3bda0e311fc33c0cbc8977dcff898f4594    webpack.config.js
    100644 blob fb8e6d3a39baf6e339e235de1a9ed7c3f1521d55    webpack.dll.config.js
    040000 tree 5dd44553be0d7e528b8667ac3c027ddc0909ef36    webpack
    

    详细解释如下:

    五、Commit 对象

    Commit 对象是一次修改的集合,当前所有修改的文件的一个集合,可以类比一批操作的“事务”。是修改过的文件集的一个快照,随着一次 commit 操作,修改过的文件将会被提交到 local repository 中。通过 commit 对象,在版本化中可以检索出每次修改内容,是版本化的基石。

    → git cat-file -t fbf9e415f77008b780b40805a9bb996b37a6ad2c
    commit
    → git cat-file -p fbf9e415f77008b780b40805a9bb996b37a6ad2c
    tree bd31831c26409eac7a79609592919e9dcd1a76f2
    parent d62cf8ef977082319d8d8a0cf5150dfa1573c2b7
    author xxx  1502331401 +0800
    committer xxx  1502331401 +0800
    修复增量bug
    

    详细解释如下:

    六、Tag 对象

    tag 是一个"固化的分支",一旦打上 tag 之后,这个 tag 代表的内容将永远不可变,因为 tag 只会关联当时版本库中最后一个 commit 对象。分支的话,随着不断的提交,内容会不断的改变,因为分支指向的最后一个 commit 不断改变。所以一般应用或者软件版本的发布一般用 tag。

    git 的 Tag 类型有两种:

    1 lightweight (轻量级)创建方式:

    git tag tagName
    

    这种方式创建的 Tag,git 底层不会创建一个真正意义上的 tag 对象,而是直接指向一个 commit 对象,此时如果使用 git cat-file -t tagName 会返回一个 commit。

    → git cat-file -t v4
    commit
    → git cat-file -p v4
    tree ceab4f96440655b0ff1a783316c95450fa1fb436
    parent 7f23c9ca70ce64fc58e8c7507c990c6c6a201d3d
    author 与水  1506224164 +0800
    committer 与水  1506224164 +0800
    
    rawtest2
    

    2 annotated (含附注)创建方式:

    git tag -a tagName -m''
    

    这种方式创建的标签,git 底层会创建一个 tag 对象,tag 对象会包含相关的 commit 信息和 tagger 等额外信息,此时如果使用 git cat-file -t tagname 会返回一个 tag。

    → git cat-file -t v3
    tag
    → git cat-file -p v3
    object d5d55a49c337d36e16dd4b05bfca3816d8bf6de8   //commit 对象SHA-1
    type commit
    tag v3
    tagger xxx  1506230900 +0800
    
    与水测试标注型tag
    

    相关文章

      网友评论

          本文标题:Git底层数据结构和原理之二:对象模型

          本文链接:https://www.haomeiwen.com/subject/ixiqahtx.html