您的位置:首页 > 其它

第4章 基本的Git概念

2017-04-23 14:29 148 查看
4.1 基本概念

4.1.1 版本库

Git版本库(repository)只是一个简单的数据库,其中包含所有用来维护与管理项目的修订版本和历史的信息。

在版本库中,Git维护两个主要的数据结构:对象库(object store)和索引(index)。所有这些版本库数据存放在工作目录跟目录下一个名为.git的隐藏子目录中。

对象库在复制操作的时候能进行有效复制。

索引是暂时的信息,对版本库来说是私有的并且可以在需要的时候按需求进行创建和修改。

4.1.2 Git对象类型

Git放在对象库里的对象有:

块(blob):文件的每一个版本表示为一个块。一个blob保存一个文件的数据,但不包含任何关于这个文件的元数据,甚至连文件名也没有。

目录树(tree):一个目录树对象代表一层目录信息。记录blob标识符、路径名和在一个目录里所有文件的一些元数据。它也可以递归引用其他目录树或子树对象。

提交(commit):一个提交对象保存版本库中每一次变化的元数据、包括作者、提交者、提交日期和日志信息。

标签(tag):一个标签对象分配给一个任意的且人类可读的名字给一个特定对象,通常是一个提交对象。

4.1.3 索引

索引是一个临时的、动态的二进制文件,它描述整个版本库的目录结构。

4.1.4 可寻址内容名称

Git对象库被组织及实现成一个内容寻址的存储系统。具体而言,对象库中的每个对象都有一个唯一的名称,这个名称是向对象的内容应用SHA1得到的SHA1散列值。

4.1.5 Git追踪内容

Git的内容追踪主要表现为两种关键的方式:

1 Git的对象库基于其对象内容的散列计算的值,而不是基于用户原始文件布局的文件名或目录名的设置。

2 当文件从一个版本到下一个版本的时候,Git的内容数据库有效地存储每个文件的每个版本,而不是它们的差异。

4.1.6 路径名与内容



4.1.7 打包文件

Git使用了一种叫做打包文件(pack file)的更有效的存储机制。要创建一个打包文件,Git首先定位内容非常相似的全部文件,然后为它们之一存储整个内容。之后计算相似文件之间的差异并且只存储差异。

4.2 对象库图示



4.3 Git在工作时的概念

4.3.1 进入.git目录

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello
$ git init
Initialized empty Git repository in D:/gittest/hello/.git/

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ find .
.
./.git
./.git/config
./.git/description
./.git/HEAD
./.git/hooks
./.git/hooks/applypatch-msg.sample
./.git/hooks/commit-msg.sample
./.git/hooks/post-update.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/pre-commit.sample
./.git/hooks/pre-push.sample
./.git/hooks/pre-rebase.sample
./.git/hooks/pre-receive.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/update.sample
./.git/info
./.git/info/exclude
./.git/objects
./.git/objects/info
./.git/objects/pack
./.git/refs
./.git/refs/heads
./.git/refs/tags

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ find .git/objects
.git/objects
.git/objects/info
.git/objects/pack

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ echo "hello world" > hello.txt

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory.

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ find .git/objects
.git/objects
.git/objects/3b
.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad
.git/objects/info
.git/objects/pack


4.3.2 对象、散列和blob

Git只关心文件里面的内容:表示“hello world”的12个字节和换行符。Git对这个blob执行一些操作,计算它的SHA1散列值,把散列值的十六进制表示作为文件名放进对象库中。

160位的SHA1散列值对应20个字节,这需要40个字节的十六进制来显示,因此这内容另存为.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad。

Administrator@BGUJ9QLXIRFWC3S MINGW32 /d/gittest/hello (master)
$ git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello world
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  git