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时这是一个非常重要的概念。
分享到:
相关推荐
GIT对象模型 Git目录 与 工作目录 Git索引 2. 第一步 安装Git 安装与初始化 3. 基本用法 获得一个Git仓库 正常的工作流程 分支与合并@基础 查看历史 -Git日志 比较提交 - Git Diff 分布式的工作流程 Git标签 4...
第4篇全面介绍了git的协同模型,即它在实际工作中的使用模式,包括各种经典的git协同模型、topgit协同模型、子模组协同模型、子树合并、android多版本库协同、git与svn协同模型等。第5篇介绍了git服务器的架设,首先...
第4篇全面介绍了git的协同模型,即它在实际工作中的使用模式,包括各种经典的git协同模型、topgit协同模型、子模组协同模型、子树合并、android多版本库协同、git与svn协同模型等。第5篇介绍了git服务器的架设,首先...
还能将模型中的模型转成表数据存储,数据读取与存储直接面向对象:上传的代码是实现源代码不是demo(比较大),大家可以看看,完整demo地址:https://github.com/qq912276337/MLRuntimeDatabase.git
本系列视频教程由广州创龙工程师精心录制,主要介绍 Linux 应用开发基础技能,包括以下五方面的内容: 1、Git 的使用 1.1、使用 Git 的必要性、意义。 1.2、Git 的原理讲解。 1.3、Git 实践演示。 2、面向...
(20) 数据模型按不同的应用层次分为三种类型,它们是______数据模型、逻辑数据模型和物理数据模型。 答:概念 (21) 栈的基本运算有三种:入栈、退栈和______。 答:读栈顶元素#读栈顶的元素#读出栈顶元素 (22) 在...
9.4 使用外部模型创建动画 9.5 总结 第10章 加载和使用纹理 10.1 在材质中使用纹理 10.2 纹理的高级用途 10.3 总结 第11章 定制着色器和渲染后期处理 11.1 设置后期处理 11.2 后期处理通道 11.3 创建自定义...
介绍这是一个用于在张量流上使用预训练的模型(如下所示)实现对象检测的存储库。 型号名称速度可可地图产出 快速地21岁盒子 快速地24 盒子 中等的30 盒子 中等的32 盒子 慢的37 盒子依存关系: Tensorflow> = 1.2.0...
7-文档对象模型-练习 进阶主题 8-建立Tiny JS World(pre-OOP)-练习 9-面向对象的JS-练习 10-OOP练习-练习 11-脱机Web应用程序 12-记忆对游戏-真实的项目! 13-网站性能优化 14-好友应用-真实项目! Git和...
中心是使用SQLite的ACID兼容对象存储,并在此基础上构建了语义合并,丰富的撤消/重做支持,协作编辑以及用于查看内存中数据库快照并批量提交更改的事务API。 在阅读更多 主要特征 修订控制 建立在DVCS(分布式版本...
对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq ...
文档对象模型(DOM) CSS显示属性 弹性盒 CSS网格 jQuery基础知识 版本控制:Git 模块3 高级网页开发 深入探讨:JavaScript 现代JavaScript(ECMAScript 6,ES7) 面向对象的编程(使用JavaScript) 异步...
文档对象模型 (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 是什么? ...
【基础】面向对象的特征有哪些方面 13 抽象 13 继承 13 封装 13 多态性 13 【基础】java多态的理解 13 【基础】transient关键字 15 【基础】访问修饰符区别 15 【基础】java基本数据类型(四类八种) 15 Java自动...
MARC4J使命MARC4J的目标是提供一个易于使用的应用程序编程接口( API ),以在Java中使用MARC和MARCXML 。 MARC代表机读目录,是书目数据的一种广泛使用的交换格式。... 一个MARC记录对象模型(例如DOM
对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让...
一个基本Django 3.2站点的模板,带有一些有用的基本抽象模型, , Free和一些入门模板。 要求 Python 3.6以上版本。 这是,是类型提示和f字符串支持所必需的。 (使用以下安装说明中的命令与Pip一起安装。 您想...
记者介绍编码 此回购用于UT-奥斯汀新闻学院课程“记者简介编码”的课堂作业和资源。 Canvas课程是您指定作业截止日期等的正式用语,但是大多数讲座,作业详细信息和文件都在此存储库中。 为2021年Spring更新:Git...
01 今日内容介绍以及基础测试题答案讲解 02 Python 列表的魔法 03 Python 元组的魔法 04 Python 字典的魔法 05 Python 错误更正:布尔值可以作为字典的key 06 Python 今日内容整理 第13章 第13章共1课 第14章 01...
提供了一个文档对象模型,该模型除了可以验证XML之外还可以读取和写入XML格式。 提供一个绘图画布,可以在其上放置图形原语,例如线条,圆形,文本和矩形。 另外,可以应用图元的转换,分组和样式化。 画布目前可以...