`
guibin
  • 浏览: 363859 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Git基础对象模型介绍

    博客分类:
  • GIT
阅读更多
Git基础对象模型介绍
guibin.beijing@gmail.com

本文翻译自http://book.git-scm.com/1_the_git_object_model.html ,但不是全文翻译,仅供学习参考,不贴切之处敬请指正。

Git是什么?
Git是一个快速、分布式的版本控制系统

Git的对象模型
什么是SHA?
用来代表项目历史的所有信息都存储在一个文件中,这个文件名由40个字符构成,表示所谓的“对象“,看起来象:
引用
49b1775c245cbf030f52ce0c50d3758617e02395

在Git中,象这样的40个字符组成的字符串随处可见,它是由对象的内容做SHA1哈希计算得到的。所谓的SHA1哈希是一个加密的哈希函数。这样做的意义是实际上不可能找到两个不同的对象拥有相同的SHA1值(对象名)。这样做有一系列的好处,比如:
  • Git可以快速的仅仅通过对象名称决定两个对象是否相同
  • 由于对象名称在每一个库(repository)中都由相同的方式计算得到,相同的内容存储到不同的库中将总被存储到相同的名称下
  • Git可以在读取对象时通过检查对象的内容SHA1之后是否是相同的名字来检测错误(这样做的原因是由于相同的内容经过SHA1计算之后总是具有相同的SHA1值)

什么是对象?
每个对象有三个属性:类型、尺寸和内容。
尺寸就是对象的大小,内容基于对象的类型。在Git中有四种类型,分别是"blob", "tree", "commit", and "tag"。
  • blob:用来存储文件数据,就是一个通常的文件。
  • tree:看起来象一个目录结构,它引用了一串其他的tree或者blob(就像文件和子目录一样)。
  • commit:指向一个单独的tree,标志着一个项目在一个特定的时间点看起来是什么样子。
  • 它包含了那一时间点的元信息,比如时间戳、作者、自从上次提交以来所做的改变、指向前一次提交的引用,等等。
  • tag:是用特定的方法标识特定的提交。它通常用来标记特定的commit作为特定的release,或者这条主线上的其他的什么东西。
几乎所有的Git都建立在管理操纵这些简单的结构之上,即它是建立在机器文件系统之上的一种自己的小型文件系统。
  • Blob对象(Blob Object)
  • Blob对象通常存储文件的内容。可以使用命令git show来查看人和blob对象的内容。比如:
    引用
    $ git show ced3dd435d0468
    commit ced3dd435d04684ad44232709bd35841240364c6
    Author: Guibin Zhang <guibin.beijing@gmail.com>
    Date:   Wed Apr 20 17:31:31 2011 +0800

        Fix publish with null properties

    diff --git a/libs/lib.service.securities/src/main/scala/com/aiotrade/lib/service/securities/cndbf/LevelIIDataPublisher.scala
    index 535bc85..2f1650e 100644
    --- a/libs/lib.service.securities/src/main/scala/com/aiotrade/lib/service/securities/cndbf/LevelIIDataPublisher.scala
    +++ b/libs/lib.service.securities/src/main/scala/com/aiotrade/lib/service/securities/cndbf/LevelIIDataPublisher.scala
    @@ -166,7 +166,8 @@ object LevelIIDataPublisher extends Reactor{

               if(rountingKey.isDefined && secId.isDefined) {
                 val topic = rountingKey.get + secId.get + ".SZ"
    -            publisher.publish(exchange, topic , null, recordObjs)
    +            publisher.publish(exchange, topic , props, recordObjs)


    blob对象实际上就是一块二进制数据。它不会引用任何其他东西,也没有人和其他属性,甚至都没有文件名
    既然blob对象完全由其数据决定,如果两个文件在同一个目录树下(或者在多个不同版本的库中),那么他们将会共享相同的blob对象。blob对象完全独立于它在目录树中的位置,即便是对文件重命名也不会改变与此文件相关联的blob对象的内容。
  • Tree对象(Tree Object)
  • Tree对象比较简单,它有很多指针,指向其他blob和tree,它代表目录或者子目录的内容。
    git tree命令能够用来检查tree对象的内容,或者使用git ls-tree可以查看更多细节。如下面的例子
    引用
    $ git ls-tree 49b1775c245cbf030f52ce0c50d3758617e02395
    040000 tree 7e814915c9880cb367895118333f2cd4e600855b application
    040000 tree 561d4f6709e0b27943d5f0d650f9986e74673e69 branding
    100644 blob af0ae6a9fc24e6978287d47eda2727c1c664f524 pom.xml

    就像你所看到的,tree对象包含一系列入口,每个入口保护模式(如040000,100644),对象类型(tree,blob),SHA1名称(7e814915..., 561d4f67..., af0ae6a9fc...),和名字(application, branding, pom.xml)。这些内容都是tree对象49b1775c245cbf030f52ce0c50d3758617e02395...的内容,内容列出的顺序按照名称排序。这些内容就是一个单独文件夹的内容。
    能够被tree对象引用的对象可以是:blob对象-代表文件的内容,另外的tree对象-代表子目录的内容。既然tree对象和blob对象和其他对象一样,都是由其内容的SHA1 hash值决定,因此两个tree对象当且仅当他们的内容(递归的包含其子目录的内容)相同时才具有相同的SHA1值。这个特性使得git能够快速决定两个相关的tree对象的差异,因为在判断两个tree是否相同时可以忽略tree对象下面的相同名字的对象。
    注意,具有644和755权限的文件,git实际上只对可执行权限位感兴趣。
  • Commit对象(Commit Object)
  • Commit对象链接一个Tree的物理状态和其描述。这个描述描述了我们如何提交到这个commit,怎么提交的,相当于一些注释。
    你可以用在 git show 命令和 git log 命令中使用 --pretty=raw 选项查看你所感兴趣的提交(commit)。
    引用
    $ git show -s --pretty=raw c1e78911e06
    commit c1e78911e066983c797129b196f60cef256c3a3a
    tree 1afa3f0f14c1fffed0fbf3cc05507034c61cfeb4
    parent ffbeb1730537cc139bee4358010afc9953cb8615
    author Guibin Zhang <guibin.beijing@gmail.com> 1303277354 +0800
    committer Guibin Zhang <guibin.beijing@gmail.com> 1303277354 +0800

        Fix publish to wrong topic bug

    正如你所见到的,一个commit由以下几个元素组成:
    1. Tree。即Tree对象的SHA1名字,代表在特定时间点某个目录的内容。
    2. Parent。在此次提交之前的一个或几个commit的名字。上面的例子中,只有一个parent,但是Merge commit可能就有多个parent。比如
    引用
    $ git show -s  --pretty=raw 49b1775c24
    commit 49b1775c245cbf030f52ce0c50d3758617e02395
    tree 89de7605c4ec6677b3960acd7621cdb70371362b
    parent 10096820c833d42b53ed40886bb91e37f7e2607f
    parent b0cbbf20457bc7a755391b93c0f6278cb0b47b2e

    author Guibin Zhang <guibin.beijing@gmail.com> 1303449511 +0800
    committer Guibin Zhang <guibin.beijing@gmail.com> 1303449511 +0800

        Merge branch 'master' of 192.168.80.141:/home/guibin/Project/faster/faster

    如果一个commit没有parent,那么这个commit就一定是root commit,代表当这个项目初始化时的状态。每个项目都至少有一个root。一个项目也可以有多个root,但这不常见,也不必要。
    3. Author。对此次commit负责的作者及其提交时间。
    4. Committer。谁实际执行了此次提交操作及其提交时间。committer可能和author不一样,比如作者写了些代码,发送给提交者提交。
    5. Comment。注释。
    注意:一个commit事实上并没有记录这次提交做了什么内容的改变,所有的改变都根据这次commit所引用的对象的内容和其parent计算得到,尤其是git并不试图去显示的记录rename这些操作,虽然它能够根据相同的文件内容和不同的文件路径计算出rename。commit对象通常由git commit命令创建,提交时,此次提交的parent就是提交时刻的HEAD,并且HEAD的tree提取自当前存储在index中的内容。
  • Tag对象(Tag Object)
  • Tag对象包含了对象名称,对象类型,tag名称,打tag的人(tagger)和一条注释。可以使用git tag命令去创建或者验证tag,细节请参考git tag --help


Git与SVN的区别
非常重要的一点是Git与多数你所熟悉的SCM系统都不同。Subversion, CVS, Perforce, Mercurial都使用 Delta Storage systems,即他们都存储一个commit和另一次commit之间的区别,而Git却不是这样做的,它存储在项目中所有文件在这种树型结构中的快照。在使用Git时这是一个非常重要的概念。

0
0
分享到:
评论
1 楼 yuenkin 2013-08-28  
有些翻译的错误太明显了,
“既然blob对象完全由其数据决定,如果两个文件在同一个目录树下(或者在多个不同版本的库中),那么他们将会共享相同的blob对象。”
    两个文件需要内容完全相同。

相关推荐

    Git Community Book(中文版)

    GIT对象模型 Git目录 与 工作目录 Git索引 2. 第一步 安装Git 安装与初始化 3. 基本用法 获得一个Git仓库 正常的工作流程 分支与合并@基础 查看历史 -Git日志 比较提交 - Git Diff 分布式的工作流程 Git标签 4...

    Git权威指南

    第4篇全面介绍了git的协同模型,即它在实际工作中的使用模式,包括各种经典的git协同模型、topgit协同模型、子模组协同模型、子树合并、android多版本库协同、git与svn协同模型等。第5篇介绍了git服务器的架设,首先...

    Git权威指南【样张】

    第4篇全面介绍了git的协同模型,即它在实际工作中的使用模式,包括各种经典的git协同模型、topgit协同模型、子模组协同模型、子树合并、android多版本库协同、git与svn协同模型等。第5篇介绍了git服务器的架设,首先...

    ios-在FMDB基础上,Runtime实现的Database数据存储读取直接面向对象,递归存储读取模型嵌套模型.zip

    还能将模型中的模型转成表数据存储,数据读取与存储直接面向对象:上传的代码是实现源代码不是demo(比较大),大家可以看看,完整demo地址:https://github.com/qq912276337/MLRuntimeDatabase.git

    ARM Linux 开发基础技能实战演练-视频教程.rar

    本系列视频教程由广州创龙工程师精心录制,主要介绍 Linux 应用开发基础技能,包括以下五方面的内容: 1、Git 的使用 1.1、使用 Git 的必要性、意义。 1.2、Git 的原理讲解。 1.3、Git 实践演示。 2、面向...

    全国计算机等级二级公共基础知识课件

    (20) 数据模型按不同的应用层次分为三种类型,它们是______数据模型、逻辑数据模型和物理数据模型。 答:概念 (21) 栈的基本运算有三种:入栈、退栈和______。 答:读栈顶元素#读栈顶的元素#读出栈顶元素 (22) 在...

    threeJS开发指南pdf版,内有git下载素材地址

    9.4 使用外部模型创建动画 9.5 总结 第10章 加载和使用纹理 10.1 在材质中使用纹理 10.2 纹理的高级用途 10.3 总结 第11章 定制着色器和渲染后期处理 11.1 设置后期处理 11.2 后期处理通道 11.3 创建自定义...

    tf-object-detection:用于Tensorflow对象检测API的更简单的应用程序

    介绍这是一个用于在张量流上使用预训练的模型(如下所示)实现对象检测的存储库。 型号名称速度可可地图产出 快速地21岁盒子 快速地24 盒子 中等的30 盒子 中等的32 盒子 慢的37 盒子依存关系: Tensorflow&gt; = 1.2.0...

    kottans-frontend:自学完成的任务

    7-文档对象模型-练习 进阶主题 8-建立Tiny JS World(pre-OOP)-练习 9-面向对象的JS-练习 10-OOP练习-练习 11-脱机Web应用程序 12-记忆对游戏-真实的项目! 13-网站性能优化 14-好友应用-真实项目! Git和...

    CoreObject:分布式版本控制+对象持久性框架

    中心是使用SQLite的ACID兼容对象存储,并在此基础上构建了语义合并,丰富的撤消/重做支持,协作编辑以及用于查看内存中数据库快照并批量提交更改的事务API。 在阅读更多 主要特征 修订控制 建立在DVCS(分布式版本...

    linux内核调试分析指南

    对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq ...

    Web-Development:DevIncept 30天贡献者计划对Web开发的贡献

    文档对象模型(DOM) CSS显示属性 弹性盒 CSS网格 jQuery基础知识 版本控制:Git 模块3 高级网页开发 深入探讨:JavaScript 现代JavaScript(ECMAScript 6,ES7) 面向对象的编程(使用JavaScript) 异步...

    Server-Side-Integration:Node JS - CodeAbode 课程 3

    文档对象模型 (DOM) 1.操作DOM a.访问DOM b. 创建 DOM c.改变DOM 2. ii.Event Handling 3. iii.Debugging JavaScript c.服务器端JavaScript 1. i.Example Technologies 1.PHP、Java、| 2.Node.js 是什么? ...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】java多态的理解 13 【基础】transient关键字 15 【基础】访问修饰符区别 15 【基础】java基本数据类型(四类八种) 15 Java自动...

    marc4j:截至2013.01.25,最初从Tigris CVS存储库导入的Git存储库

    MARC4J使命MARC4J的目标是提供一个易于使用的应用程序编程接口( API ),以在Java中使用MARC和MARCXML 。 MARC代表机读目录,是书目数据的一种广泛使用的交换格式。... 一个MARC记录对象模型(例如DOM

    以spring+mybatis为框架的jee开发基础包.zip

    对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让...

    django3-site-template:一个基本Django 3.2站点的模板,带有一些有用的基础对象,Bootstrap 4.6.0,FontAwesome 5.15.3免费版和入门模板

    一个基本Django 3.2站点的模板,带有一些有用的基本抽象模型, , Free和一些入门模板。 要求 Python 3.6以上版本。 这是,是类型提示和f字符串支持所必需的。 (使用以下安装说明中的命令与Pip一起安装。 您想...

    icj-class:UT-奥斯丁的记者编码入门课程

    记者介绍编码 此回购用于UT-奥斯汀新闻学院课程“记者简介编码”的课堂作业和资源。 Canvas课程是您指定作业截止日期等的正式用语,但是大多数讲座,作业详细信息和文件都在此存储库中。 为2021年Spring更新:Git...

    python入门到高级全栈工程师培训 第3期 附课件代码

    01 今日内容介绍以及基础测试题答案讲解 02 Python 列表的魔法 03 Python 元组的魔法 04 Python 字典的魔法 05 Python 错误更正:布尔值可以作为字典的key 06 Python 今日内容整理 第13章 第13章共1课 第14章 01...

    数据:数据提取,转换,处理和可视化

    提供了一个文档对象模型,该模型除了可以验证XML之外还可以读取和写入XML格式。 提供一个绘图画布,可以在其上放置图形原语,例如线条,圆形,文本和矩形。 另外,可以应用图元的转换,分组和样式化。 画布目前可以...

Global site tag (gtag.js) - Google Analytics