资源点滴干货iCoder

Git学习笔记(一)—— Git对象模型

2015-08-19  本文已影响1374人  sellse
Git学习笔记(一)—— Git对象模型

Git对象

在Git系统中有四种类型的对象,几乎所有Git操作都是在这四种Git对象上进行的,所以了解这四种对象的作用对于应用Git有很大帮助。这四种对象是:

例如我们有一个项目,如果我们把它提交(commit)到一个Git仓库中, 在Git中“blob”、“commit”和“tree”对象的关系看起来会如下图:

objects-example.jpg

可以看到: 每个目录都创建了“tree”对象, 每个文件都创建了一个对应的“blob”对象。最后有一个“commit”对象来指向根“tree”对象,这样我们就可以追踪项目每一项提交内容。

SHA1哈希值

另外在Git里随处可见一种“40个字符”的字符串。由于Git中每一个“对象名”都是对“对象”内容做SHA1(SHA1是一种密码学的哈希算法)哈希计算得来的,所以对于内容不同的对象,会有不同的SHA1哈希值。这样就意味着两个不同内容的对象不可能有相同的“对象名”。

例如  6ff87c4664981e4397625791c8ea3bbb5f2279a3

这样做的好处是:

查看对象

着重说一下“tree”和“commit”对象

$ git ls-tree fb3a8bdd0ce
100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c    .gitignore
100644 blob 5529b198e8d14decbe4ad99db3f7fb632de0439d    .mailmap
100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3    COPYING
040000 tree 2fb783e477100ce076f6bf57e4a6f026013dc745    Documentation
100755 blob 3c0032cec592a765692234f1cba47dfdcc3a9200    GIT-VERSION-GEN
100644 blob 289b046a443c0647624607d471289b2c7dcd470b    INSTALL
100644 blob 4eb463797adc693dc168b926b6932ff53f17d0b1    Makefile
100644 blob 548142c327a6790ff8821d67c2ee1eff7a656b52    README

如上:一个tree对象包括一串条目,每一个条目包括:mode(mode位都是644 或 755,这意味着Git只关心文件的可执行位.)、对象类型、对象名和文件名字。它用来表示一个目录树的内容。
一个tree对象可以指向一个包含文件内容的blob对象,也可以是包含某个子目录内容的其它tree对象。“tree”对象、“blob”对象和其它所有的对象一样,都用其内容的SHA1哈希值来命名的;只有当两个tree对象的内容完全相同(包括其所指向所有子对象)时,它的名字才会一样,反之亦然。这样就能让Git仅仅通过比较两个相关的tree对象的名字是否相同,来快速的判断其内容是否不同。在有些情况下,“tree”对象也可以指向“commit”对象。

$ git show -s --pretty=raw 2be7fcb476
commit 2be7fcb4764f2dbcee52635b91fedb1b3dcf7ab4
tree fb3a8bdd0ceddd019615af4d57a53f43d8cee2bf
parent 257a84d9d02e90447b149af58b271c19405edb6a
author Dave Watson <dwatson@mimvista.com> 1187576872 -0400
committer Junio C Hamano <gitster@pobox.com> 1187591163 -0700

    Fix misspelling of 'suppress' in docs

    Signed-off-by: Junio C Hamano <gitster@pobox.com>

可以看到,一个提交(commit)由以下的部分组成:

一个提交本身并没有包括任何信息来说明其做了哪些修改;所有的修改(changes)都是通过与父提交(parents)的内容比较而得出的。尽管git可以检测到文件内容不变而路径改变的情况,但是它不会去显式(explicitly)记录文件的更名操作。

一般用git commit来创建一个提交(commit), 这个提交的父对象一般是当前分支(current HEAD),同时把存储在当前索引(index)的内容全部提交。

上一篇 下一篇

猜你喜欢

热点阅读