上一节了解了 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. spring.net的简单使用(三)创建对象

    这篇主要说对象的创建方式. spring.net提供了三种创建对象的方式,分别是构造器创建,静态工厂创建,实例工厂创建. 多数的情况下,容器会根据对象定义中type属性值去直接调用相应类型的某个构造器 ...

  2. delphi如何输出当前堆栈

    想实现,输出当前运行的堆栈,有会的吗?给点思路 方法很多,参考: https://bitbucket.org/shadow_cs/delphi-leakcheck/ 的 https://bitbuck ...

  3. QT4与QT3的不同

    1)QT4中提供了大量新控件,虽然它也保持了旧的控件,并命名为Qt3XXX,但是这样的控件没准在今后的哪个QT版本中就不被支持了,所以还是换吧,控件替换的工作是巨大的,这些新的控件使用了新的方法.属性 ...

  4. 不仅仅是百万级TCP长连接框架 t-io

    t-io: 不仅仅是百万级TCP长连接框架 t-io是基于jdk aio实现的易学易用.稳定.性能强悍.将多线程运用到极致.内置功能丰富的即时通讯框架(广义上的即时通讯,并非指im),字母 t 寓意t ...

  5. 似乎是VS2017的一个BUG

    VS版本:2017(15.9.13) 新建一个c#控制台项目,把Program.cs的内容替换成如下: namespace ConsoleApp1 { class Program { static v ...

  6. 敏捷开发中如何做好Sprint规划?

    什么是Sprint规划? Sprint规划是scrum中用来启动Sprint的事件.迭代规划的目标是定义Sprint可以交付的内容,以及如何完成各项工作.迭代规划需要整个scrum团队合作完成. 与体 ...

  7. 30442数据操纵语言DML

    5.5 SQL的数据操纵功能 5.5.1 数据插入 使用CREATE语句创建的数据表还只是一个“空壳”,表中没有任何数据.利用SQL语言提供的INSERT语句可以完成向数据表插入数据的任务. INSE ...

  8. 程序代写, CS代写, 代码代写, CS编程代写, java代写, python代写, c++/c代写, R代写, 算法代写, web代写

    互联网一线工程师程序代写 微信联系 当天完成 查看大牛简介特色: 学霸代写,按时交付,保证原创,7*24在线服务,可加急.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor ...

  9. ABP开发框架前后端开发系列---(11)菜单的动态管理

    在前面随笔<ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理>中介绍了基于ABP框架服务构建的Winform客户端,客户端通过Web API调用的方式进行获取数据,从而实现 ...

  10. Zookeeper详解-安装(四)

    ZooKeeper服务器是用Java创建的,它在JVM上运行.你需要使用JDK 6或更高版本. 步骤1:验证Java安装 相信你已经在系统上安装了Java环境.现在只需使用以下命令验证它. $ jav ...