理解Git

理解Git

——《Git版本控制管理(第2版)》读书笔记一

Git特点或设计理念

  • 有助于分布式开发
  • 能够胜任上千开发人员的规模
  • 性能优异(压缩技术、差异比较技术)
  • 保持完整性和可靠性(安全散列函数)
  • 强化责任(对所有改动可追踪)
  • 不可变性
  • 原子事务(Git通过记录完整、离散的版本库状态来实现原子事务。)
  • 支持并且鼓励基于分支的开发(分支、合并)
  • 完整的版本库(每个人的版本库中都有一份关于每个文件的完整的历史修订信息)
  • 一个清晰的内部设计(对象模型)
  • 免费自由

基本概念

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

两个主要数据结构:

  • 对象库:Git版本库实现的心脏。包含你的原始数据文件、所有日志信息、日期等等。它包括4中对象类型:
    • 块(blob):二进制大对象。文件的每一个版本表示为一个块。一个blob只保存一个文件的数据。
    • 目录树(tree):一个tree对象代表一层目录信息。它记录blob标识符、路径名和一个目录里所有文件的一些元数据。可递归引用其他目录树或子树对象。
    • 提交(commit):一个commit对象保存版本中每一次变化的元数据,包括作者、提交者、提交日期和日志消息。
    • 标签(tag):一个tag对象分配一个任意的且人类可读的名字给一个特定对象。
  • 索引:一个临时的、动态的二进制文件,它描述整个版本库的目录结构。更具体具体地说,索引捕获项目在某个时刻的整体结构的一个版本。

其中,对象库描述了Git的数据存储结构,索引描述了Git的目录索引结构。

对象之间的关系:

  • blob对象是数据结构的“底端”。只能被树对象引用。
  • 树对象指向若干blob对象,也可能指向其他树对象。
  • 每一个提交对象指向一个目录树对象。
  • 每个标签可以指向最多一个提交对象。

图说
状态1:一个版本库在添加了两个文件的初始提交后的状态。
git_obj_relation0.jpg
状态2:添加一个包含一个文件的新子目录。
/image/git_obj_relation1.jpg

SHA1散列值:160位的数,表示为40位的16进制。(Git中,SHA1 == 散列码 == 对象ID)

Git追踪的是内容而不是文件。
理解:如果两个文件的内容完全一样,无论是否在相同的目录,Git在对象库中只保存一份blob形式的内容副本。其中,Git根据文件的内容计算每个文件的散列值,根据散列值来判断文件的内容是否一样。当文件内容发送变化,Git会为它计算一个新的SHA1值,并把新的blob加到对象库里。
注意到,文件变更时,Git内部数据库有效地存储每个文件的每个版本,而不是它们的差异。

对此,我们需要进一步理解两个问题。

  • 不同的文件内容对应的散列值是否存在相同的可能?
  • 每次变更文件内容时Git都会存储一个新的blob到对象库中,存储效率是不是太低?

对于第一个问题,确实,从理论上来说存在这种可能,但概率极小。“这里有一个强大的推论,在互联网上,文件或任意大小的blob都可以通过仅比较它们的SHA1标识符来判断是否相同。”因此,不用太过担忧。

对于第二个问题,Git使用了一种叫做打包文件的更有效的存储机制。
打包文件:Git使用的一种高效的存储机制。Git首先定位内容非常相似的全部文件,然后为它们之一存储整个内容,之后基于该内容计算其他相似文件的差异。这是一种更高级的打包技巧。事实上,Git有更复杂的打包算法。

配置文件:.ini文件风格的文本文件。

Git中的文件分类

  • 已追踪的(Tracked):指已经在版本库中的文件,或是已暂存到索引中的文件。
  • 被忽略的(Ignored):在版本库中被明确声明为不可见或被忽略的文件。可通过.gitignore文件配置。
  • 未追踪的(Untracked):不在版本库中的文件,但在工作目录中文件。

理解Git中的文件分类,或者说文件的不同状态,将会对Git中命令的使用非常有帮助。后续会整理Git中一个文件不同状态之间的关系,以及如何通过Git命令来进行状态之间的转换。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值