上一节了解了 Git 的一个重要的概念:暂存区。

暂存区是一个介于工作区和版本库的中间状态,当执行commit时,实际上是将暂存区的内容提交大版本库中,而执行add则是将本次变更添加到暂存区。

上一节中也出现了很多新的问题?比如说 HEAD 是什么?它与 master 是什么关系?

Git对象库探秘

  前面我们查看提交日志的时候,出现了提交ID,一个由40位十六进制数字组成的SHA1哈希值,通过查看日志的详细输出,会看看到更多的SHA1哈希值。

  

  可以看出,一个提交当中包含了三个用 SHA1哈希值 标识的Git 对象ID

  1,commit  99447928556fbc66f267bdcdcd8b4a84678cda60  这是本次提交的唯一标识;

  2,tree     2f468676a412dd91435ad6b8c3706eebba13fa9c  这是本次提交所对应的目录树;

  3,parent   1f2cc329be37c7678bac8c2d1f696effffe61c08     这是本次提交的父提交(上一次提交,第一个提交是没有parent的)

  

  可以使用 git cat-file 命令来彻底研究Git 对象ID,分别查看一下上面的三个对象ID的类型

  

  注意:在引用对象ID的时候,没有必要把整个40位的ID写全,只要保证从头开始的前几位不冲突就行,一般在日常工作中输入前6位即可。

  

  再使用 git cat-file 命令来查看一下对象内容

  

  查看目录树(tree对象)中看到了一个新类型的对象:blob 对象(二进制大对象),这个 blob 对象就保存着 index.html 文件的内容。我们继续使用 git cat-file 命令来查看该 blob对象。

  

  

  那么这些对象都存放在什么地方呢?当然是Git版本库中(.git目录)的 objects 目录下了,对象ID的前2位作为目录,后38位最为文件名。

  

  

  下面的图片展示了Git对象库中各个对象之间的关系

  

  通过 Commit 对象之间的相互关联,可以很容易地识别出一条跟踪链条,这条跟踪链条可以在运行 git log 命令时候通过 --graph选项查看。--pretty=raw参数用于显示每个提交对象的parent属性

  

  最后一个提交没有parent属性,所以跟踪链到此为止,这实际上就是提交的起点。

  

  

  

  OK,我们再来看看 HEAD 和 master 。

  命令 git branch 是分支管理的主要命令,也可以显示当前所在分支

  

  在 master 分支名称前面的星号(*)表明这个分支是当前工作分支,至于什么是分支,后面会有一节专门介绍分支。

  现在连续执行下面的三个命令会看到相同的输出:

  1,git log HEAD

  2,git log master

  3,git log refs/heads/master

  

  这个结果说明了什么呢?

  结果表明,在当前的Git版本库中,HEAD , master 和 refs/heads/master 具有相同的指向!!!现在就到Git版本库(.git目录)中看看究竟。

  首先,在 .git 目录下找到名字为 HEAD 或者 master 的文件,并查看一下 .git/HEAD 文件的内容:

  

  

  .git/HEAD文件的内容翻译过来就是:”指向一个引用:refs/heads/master“。这个就是文件 .git/refs/heads/master了,ok,再看一下.git/refs/heads/master文件的内容:

  

  又是一个SHA1哈希值,那么用 git cat-file 命令来查看它:

  

  这个内容是不是很面熟!原来 master 分支指向的是一个最新的提交ID

  这就是Git分支的实现原理:从任何一个提交开始建立一条历史跟踪链条,用一个文件指向这个链条的最新提交,该文件就可以追踪整个提交历史了,这个文件就是 .git/refs/heads/master

  下面的图标显示了一个完整的真实的版本库结构:

  

  目录 .git/refs 是保存引用的命名空间,其中 .git/refs/heads 目录下的引用又称为分支。

  对于分支,即可以使用正规的长格式的表示打:refs/heads/master ,也可以去掉前面的两级目录用 master 来表明。

Git对象的更多相关文章

  1. 完整学习git四git对象

    1查看git对象 git cat-file 实践 git head到底指向的是什么 ➜ gittest git:(master) find .git -name HEAD -o -name maste ...

  2. git对象存储

    之前提到当存储数据内容时,会在objects文件夹下存储一个git对象.我们花些时间来看看 Git 是如何存储对象的.你将看来如何通过 Ruby 脚本语言存储一个 blob 对象 ,有必要了解一下对象 ...

  3. 版本控制-Git对象

    Git对象 版本控制在于文件的控制,git的控制方法在于为每个文件生成(key,object)的结构.git利用sha-1加密算法,对每一个文件生成一个唯一的字符序列(明文大小不超过2^64位,对于普 ...

  4. Git 内部原理之 Git 对象哈希

    在上一篇文章中,将了数据对象.树对象和提交对象三种Git对象,每种对象会计算出一个hash值.那么,Git是如何计算出Git对象的hash值?本文的内容就是来解答这个问题. Git对象的hash方法 ...

  5. git分布式版本控制系统权威指南学习笔记(三):简单了解git对象、head以及sha1sum

    文章目录 git对象(简单了解) 对象是存在哪里的? head和master分支 上面的hash值怎么来的? git对象(简单了解) 每次提交都有tree.parent.author.committe ...

  6. 『现学现忘』Git对象 — 15、blob对象介绍

    目录 (一)Git对象的存放目录 (二)Git中对象类型 (三)blob对象 1.blob对象说明 (1)blob对象定义 (2)blob对象说明 (3)blob对象存储的方式 (4)查看blob对象 ...

  7. 『现学现忘』Git对象 — 16、Tree对象详解

    目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...

  8. 『现学现忘』Git对象 — 17、Commit对象

    目录 1.Commit对象介绍 2.Commit对象说明 3.本地库中对象之间的关系 4.总结 5.练习 6.本文用到的命令总结 1.Commit对象介绍 现在来介绍最后一种Git对象commit对象 ...

  9. 『现学现忘』Git基础 — 18、Git对象的总结

    目录 1.Git操作最基本的流程 2.工作目录中文件的状态 3.Git效率说明 提示:前面三篇文章已经分别的对blob对象.tree对象.commit对象进行了详细的说明,这篇文章我们总结一下,Git ...

随机推荐

  1. mencache的使用二

    在这里说的是在C#中的使用,在C#中使用是需要引入驱动的, 可以在网上找,这里推荐一个链接http://sourceforge.net/projects/memcacheddotnet/ 将Memca ...

  2. QT5.6,5.7,5.8的新特征以及展望(Qt5.7首次正式支持Qt3D,以前都是预览版)

    https://wiki.qt.io/New_Features_in_Qt_5.6 (跨平台High-DPI,改进WebEngine到45,支持WIN 10,Canvas3D,3D) https:// ...

  3. QML学习【一】Basic Types

      QML入门教程(1) QML是什么? QML是一种描述性的脚本语言,文件格式以.qml结尾.语法格式非常像CSS(参考后文具体例子),但又支持javacript形式的编程控制.它结合了QtDesi ...

  4. Z Order of Controls in Delphi FireMonkey(Tom Yu的博客)

    Get and set the Z Order of controls at runtime in Delphi FireMonkey. This is a follow on to my earli ...

  5. 彻底删除kafka topic步骤

    基于kafka-2.11-0.9.0.0 . a.kill掉kafka进程,然后在server.properties里面加上delete.topic.enable=true.重启kafka.集群中的每 ...

  6. 【canvas】高级功能一 变形

    [canvas]Demo1 scale缩放 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  7. 大数据基础之Kafka(1)简介、安装及使用

    kafka2.0 http://kafka.apache.org 一 简介 Kafka® is used for building real-time data pipelines and strea ...

  8. Java基础(二) 基本类型数据类型、包装类及自动拆装箱

    我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...

  9. Protoc Buffer 优化传输大小的一个细节

    Protoc Buffer 是我们比较常用的序列化框架,Protocol Buffer 序列化后的占空间小,传输高效,可以在不同编程语言以及平台之间传输.今天这篇文章主要介绍 Protocol Buf ...

  10. 系统学习 Java IO (八)----装饰流 FilterInputStream/FilterOutputStream

    目录:系统学习 Java IO---- 目录,概览 这两个流的作用是:"封装其它的输入流,并为它们提供额外的功能" 他们的直接子类有: BufferedInputStream 的作 ...