《Git学习指南》——1.2 版本库,分布式工作的基础所在

1.2 版本库,分布式工作的基础所在

其实,版本库本质上就是一个高效的数据存储结构而已,由以下部分组成。

文件(即blob):这里既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保存。
目录(即Tree):目录中保存的是与文件名相关联的内容,其中也会包含其他目录。
版本(即commit):每一个版本所定义的都是相应目录的某个可恢复的状态。每当我们创建一个新的版本时,其作者、时间、注释以及其之前的版本都将会被保存下来。
对于所有的数据,它们都会被计算成一个十六进制散列值(例如像1632acb65b01 c6b621d6e1105205773931bb1a41这样的值)。这个散列值将会被用作相关对象的引用,以及日后恢复数据时所需的键值(见图1.3)。

图1.3 版本库中的对象存储

也就是说,一个提交对象的散列值实际上就是它的“版本号”,如果我们持有某一提交的散列值,就可以用它来检查对应版本是否存在于某一版本库中。如果存在,我们就可以将其恢复到当前工作区相应的目录中。如果该版本不存在,我们也可以从其他版本库中单独导入(拉回)该提交所引用的全部对象。

接下来,我们来看看采用这种散列值和这种既定的版本库结构究竟有哪些优势。

高性能:通过散列值来访问数据是非常快的。
冗余度——释放存储空间:相同的文件内容只需存储一次即可。
分布式版本号:由于相关散列值是根据文件,作者和日期来计算的,所以版本也可以“离线”产生,不用担心将来会因此而发生版本冲突。
版本库间的高效同步:当我们将某一提交从一个版本库传递给另一个版本库时,只需要传送那些目标版本库中不存在的对象即可。而正是因为有了散列值的帮助,我们才能很快地判断相关对象是否已经存在。
数据完整性:由于散列值是根据数据的内容来计算的,所以我们可以随时通过Git来查看某一散列值是否与相关数据匹配。以检测该数据上可能的意外变化或恶意操作。
自动重命名检测:被重命名的文件可以被自动检测到,因为根据该文件内容计算出的散列值并没有发生变化。也正因为如此,Git中并没有专用的重命名命令,只需移动命令即可。

时间: 2024-07-31 06:42:59

《Git学习指南》——1.2 版本库,分布式工作的基础所在的相关文章

《Git学习指南》——导读

** 前言 **Git的背后有着一个非常精彩的成功故事.2005年4月,Linus Torvalds因不满当时任何一个可用的开源版本控制系统,就亲自着手实现了Git.时至今日,如果我们在Google中搜索"git version control"这几个关键词,都会看到数以百万计的返回结果.Git已经俨然成为了新型开源项目的一个标准.许多大型的开源项目都已经或正在计划迁移到Git上来. 下面,我们来看一下这么多人之所以会选择Git的原因. Git允许我们利用分支来开展工作:在一个由多个开

Git 2.8改进子版本库、身份处理和Windows支持

近日发布的Git 2.8带来了许多新特性.改进和Bug修复.其中,最值得注意的是子版本库并行获取.Git用户身份处理方式改进以及更好的Windows支持. 子版本库并行获取允许一次获取多个版本库,旨在减少获取版本库及其所有相关子版本库所需的时间.这可以通过使用新增的--jobs选项来实现,例如: git fetch --recurse-submodules --jobs=4 据Git团队介绍,对于包含许多子版本库的版本库,这可以大大增加更新速度.当使用--recurse-submodules而不

《Git学习指南》——第1章 基本概念 1.1分布式版本控制,有何过人之处

第1章 基本概念 在本章中,我们将介绍一个分布式版本控制系统的设计思路,以及它与集中式版本控制系统的不同之处.除此之外,我们还将带你了解分布式版本库的具体工作方式,以及为什么我们会说,在Git中创建分支和合并分支不是个大不了的问题. 1.1 分布式版本控制,有何过人之处 在具体探讨分布式版本控制的概念之前,让我们先来快速回顾一下传统的集中式版本控制架构. 图1.1中所显示的就是一个集中式版本控制系统(例如CVS或Subversion)的典型布局.每个开发者都在他或她自己的计算机上有一个包含所有项

Git版本控制工具(一)----git的安装及创建版本库

[正文] 一.初识Git: Git是目前世界上最先进的分布式版本控制系统(没有之一).它的开发者就是大名鼎鼎的Linux操作系统的作者Linus Torvalds.Git被开发出来的初衷是为了更好的管理Linux内核,而现在却广泛应用于各种项目中.Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等. 那那什么是版本控制系统呢?如果有一个软件,不但能自动帮我记

《Git学习指南》——1.4 本章小结

1.4 本章小结 在阅读完本章之后,我们希望你现在基本上熟悉了Git中的这些基本概念.也就是说,即使你现在放下了这本书(当然,希望不会!),你也可以参加与分布式版本控制系统有关的讨论,阐述其中使用散列值的必要性和实用性,介绍Git中的分支创建与合并操作了. 当然,你可能还会有以下疑问. 我们应该如何利用这些基本概念来管理项目呢?我们应该如何协调多个版本库呢?我们究竟需要多少分支呢?我们应该如何整合自己的构建服务器呢?对于第一个问题,你可以继续阅读下一章内容.在下一章中,你将会看到那些具体用于创建

《Git学习指南》——2.3 Git的协作功能

2.3 Git的协作功能 现在,我们已经有了一个存放项目文件的工作区,以及一个存放项目历史的版本库.在一个像CVS和Subversion这样传统的集中式版本系统中,尽管每个开发者也都有属于他/她自己的工作区,但所有人都共享了一个通用的版本库.而在Git中,每个开发者拥有的是一个属于他/她自己的.自带独立版本库的工作区,因此这已经是一个不依赖于中央服务器的.完整的版本控制系统了.开发者们可以通过交换各自版本库中的提交来实现项目合作.下面我们就来做个试验,先创建一个新的工作区,以便我们模拟第二位开发

《Git学习指南》——2.2 第一个Git项目

2.2 第一个Git项目 在这里,我们建议你最好能为接下来的Git测试单独开辟一个项目.总之应先从一个简单的小项目开始.在我们这个小小的示例项目中,first-steps目录下只有两个文本文件,如图2.1所示. 图2.1 我们的示例项目 在开始摆弄这个玩具项目之前,我们建议你最好先做一个备份!尽管在Git中,想要造成永久性的删除或破坏也不是件容易的事情,而且每当你要做某些"危险"动作的时候,Git通常也会发出相应的警告消息.但是,有备无患总是好的. 2.2.1 创建版本库现在,我们首先

《Git学习指南》——2.4 本章小结

2.4 本章小结 工作区与版本库:工作区是一个包含.git子目录(内含版本库)中的目录.我们可以用init命令在当前目录中创建版本库.版本提交:一次版本提交通常定义了版本库中所有文件的一个版本,它详细说明了该版本是由何人在何时何地创建的.当然,我们需要用add命令来确定哪些文件将被纳入下一次提交,然后再用commit命令创建新的版本提交.查看信息:通过status命令,我们可以查看哪些文件已被本地修改,以及哪些修改将被纳入下次提交.另外,log命令可用来显示提交历史.diff命令可用来显示两个版

《Git学习指南》——1.3 分支的创建与合并很简单

1.3 分支的创建与合并很简单 对于大多数版本控制系统来说,分支的创建与合并通常会因其特殊性而被认为是高级拓展操作.但由于Git最初就是为了方便那些散落在世界各地的Linux内核开发者而创建的,合并多方努力的结果一直都是其面临的最大挑战之一,所以Git的设计目标之一就是要让分支的创建与合并操作变得尽可能地简单且安全. 在下面的图1.4中,我们向你展示了开发者是如何通过创建分支的方式来进行并行开发的.图中的每一个点都代表了该项目的一个版本(即commit).而由于在Git中,我们只能对整个项目进行