Git Step by Step – (3) Git对象模型

前面一篇文章介绍了本地仓库的一系列操作,下面我们将进一步了解Git的工作原理,介绍Git对象模型。

刚开始使用Git的时候,对Git对象模型、工作原理并不理解,但是经过一段时间的使用、熟悉之后,然后再来理解这些内容就比较容易了。

下面开始介绍Git对象,然后通过一个实例展示Git对象模型。

Git对象

在Git系统中有四种类型的对象,所有的Git操作都是基于这四种类型的对象。

  • "blob":这种对象用来保存文件的内容。
  • "tree":可以理解成一个对象关系树,它管理一些"tree"和 "blob"对象。
  • "commit":只指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交(初始commit没有这一项)。
  • "tag":给某个提交(commit) 增添一个标记。

SHA1哈希值

上面我们介绍了Git对象,在Git系统中,每个Git对象都有一个特殊的ID来代表这个对象,这个特殊的ID就是我们所说的SHA1哈希值。

SHA1哈希值是通过SHA1算法(SHA算法家族的一种)计算出来的哈希值,对于内容不同的对象,会有不同的SHA1哈希值。如果你读过前面一篇文章,就肯定还记得我们是怎么根据commit id撤销更新的,这里的commit id就是一个SHA1哈希值。

Git对象模型实例

下面我们通过一个例子来认识一下上面的四种对象,为了更加清楚,这里将一步步展示经过一系列操作后对象的关系变化。

第一步:新建一个仓库,添加一个"calc.py"的文件

通过"git log --pretty=raw"可以得到每个commit的SHA1哈希值,也可以得到这个commit对应的tree的哈希值。

所以,一个commit对象一般包含以下信息:

  • 代表commit的哈希值
  • 指向tree 对象的哈希值
  • 作者
  • 提交者
  • 注释

在Git对象模型的研究中,有一个很有用的命令"git cat-file",可以通过这个命令查询特定对象的信息:

  • git cat-file -t key:通过一个对象的哈希值可以通过这条命令查看对象的类型(blob、tree、commit或tag)
  • git cat-file -p key:通过对象的哈希值可以查看这个对象的内容

下面我们看一下在这次提交中commit、tree对象的类型和内容。这里可以看到,在这一次的commit中tree对象的内容指向一个blob对象。

同样,我们可以查看blob对象的类型和内容,这里可以看到blob的内容就是我们要提交的文件的内容。

所以,根据上面的一些数据,我们可以看到在这一次的提交中产生了三个对象,同时看到了commit、tree、blob三个对象的关系如下:

第二步:更新"calc.py"文件,添加sub函数

继续使用"git log --pretty=raw"查看commit log。

同样通过"git cat-file"我们可以看到每一个对象的类型和内容,这里就不一步一步上图了,直接给出所有的对象关系。

这里需要注意的一点,Perforce、SVN和CVS属于"增量文件系统" (Delta Storage systems),它们每次只存储提交(commit)之间的差异。而对于Git,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。

第三步:增加一个"app.py";增加"advance"文件夹,包括"__init__.py"和"calc.py"

$ git log --pretty=raw
commit 4ea6c317a67e73b0befcb83c36b915c1481f2efe
tree 2735b08cab34af7732970fec95a1b3e718628d53
parent c2163e267380f71373f29f922e7089abbb741772
author WilberTian <Wilber***.com> 1419771391 +0800
committer WilberTian <Wilber***.com> 1419771391 +0800

    add app.py, __init__.py and calc.py

同样的方式,我们可以得到一张更复杂的对象关系图:

总结

Git对象模型就像是Git系统特有的文件系统,以特定的方式存储更新的内容、元数据以及版本历史信息。

通过Git对象模型进一步熟悉了Git的工作原理,相信有了这些知识,我们就可以分析git命令背后到底发生了什么。

时间: 2024-10-20 03:01:58

Git Step by Step – (3) Git对象模型的相关文章

Git Step by Step – (8) Git的merge和rebase

前面一篇文章中提到了"git pull"等价于"git fetch"加上"git merge",然后还提到了pull命令支持rebase模式,这篇文章就介绍一下merge和rebase之间有什么差别. 由于我们主要是想看看merge跟rebase之间的区别,这里就是用本地仓库的分支进行演示了. merge 其实在介绍分支的那篇文章中已经介绍过了一些分支merge的内容,这里就进行一些补充和总结. 下面我们基于本地一个仓库开始介绍,当前仓库的分支情

Git Step by Step – (4) 探索.git目录

前面一篇文章介绍了Git对象模型,接下来我们就进入".git"目录看看到底有什么东西,目录中哪些东西又跟Git对象模型相关.结合这个目录,我们将进一步了解Git的工作原理. .git目录 下面就开始进入.git目录了,通过"ls"命令可以看到.git目录中的文件和子目录: 对于这些文件和目录,下面给出了一些基本的描述.在后面后有logs.objects.refs.index和HEAD更详细的介绍 (D) hooks:这个目录存放一些shell脚本,可以设置特定的gi

Git Step by Step – (6) Git远程仓库

前面文章中出现的所有Git操作都是基于本地仓库的,但是日常工作中需要多人合作,不可能一直都在自己的代码仓库工作.所以,这里我们就开始介绍Git远程仓库. 在Git系统中,用户可以通过push/pull命令来推送/获取别的开发人员的更新,当时对于一个工作组来说,这种方式会效率比较低.所以,在一个Git系统中,都会有一个中心服务器,大家都通过中心服务器来推送/获取更新. 为了方便本篇例子的进行,我就使用多个目录来模拟多个用户以及中心服务器,这样就不用搭建Git服务器了. 中心服务器:C:\VM\Ce

Git Step by Step – (5) Git分支(branch)

在前面两盘文章中介绍了Git的基本原理,都是理论知识.这篇文章我们再次回到实践中,看看Git分支(branch)的使用. 在代码版本控制工具中,都会有branch的概念.刚开始建立版本仓库的时候,我们只有一个主分支(master branch),我们不可能把日常的新功能开发.代码优化以及bug修复等概念工作全都放在主分支上,这样会使主分支很难维护.这就是为什么会有branch. 分支的创建及删除 分支的创建 在Git中,branch的创建很简单,我们可以通过下面的命令创建一个"release-1

Git Step by Step – (7) Git远程仓库(续)

上一篇文章介绍了Git远程仓库的一些使用,但是还是有些东西需要补充一下,所以有了这个续篇. .gitignore 前一篇中,我们介绍了Git的patch功能,当我们生成patch之后,"git status"就会显示patch文件是"Untracked files".当然,我们也没有必要去跟踪这个patch文件. 同样,项目中可能会经常生成一些Git系统不需要追踪(track)的文件,在编译生成过程中 产生的文件或是编程器生成的临时备份文件.我们可以在使用"

Git Step by Step – (2) 本地Repo

前面一篇文章简单介绍了Git,并前在Windows平台上搭建了Git环境,现在就正式的Git使用了. Git基本概念 在开始Git的使用之前,需要先介绍一些概念,通过这些概念对Git有些基本的认识,这将会对我们后面的操作有很大的帮助. 在Git中,每个版本库都叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新. 现在我们已经知道什么是repository(缩写repo)了,假如我们现

FreeSWITCH 1.2.5.3 Step by Step Install

Ubuntu: apt-get -y install build-essential automake autoconf git-core wget libtool apt-get -y install libncurses5-dev libtiff-dev libjpeg-dev zlib1g-dev 从 Git 仓库安装: 从代码库安装能让你永远使用最新的版本: git clone git://git.freeswitch.org/freeswitch.git cd freeswitch .

Git专题--系统的学习Git之二

本文为整理自:伯乐在线 1.Git详解之一:Git起步 2.Git详解之二:Git基础 3.Git详解之三:Git分支 4.Git详解之四:服务器上的Git 5.Git详解之五:分布式Git 6.Git详解之六:Git工具 7.Git详解之七:自定义Git 8.Git详解之八:Git与其他系统 9.Git详解之九:Git内部原理 Git详解之四:服务器上的Git 服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.

Git详解之九 Git内部原理

来自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认为这些内容对于初学者来说可能难以理解且过于复杂.正因如此我把这部分内容放在最后一章,你在学习过程中可以先阅 读这部分,也可以晚点阅读这部分,这完全取决于你自己. 既然已