git学习日志-git剖析


虽然git用起来和其他的版本控制系统类似,但是它在对数据的存储和基本工作原理上与其他版本控制系统有很大的差异。

理解这些差异可以帮助我们更好的理解与使用git,可以避免很多在使用时的困惑。

为了更好的理解git,就需要对git的特点有所了解,那么接下来就对git的特点进行剖析。

1.git特点剖析

git的特点大致总结起来的话,有以下几点:

  • 记录快照,而不是存储差异数据
  • 操作本地化,没有网络延时困扰
  • 检验文件的完整性,杜绝文件内容或目录内容被篡改
  • 一般只添加数据,数据丢失可能性小

git学习日志-git剖析

(1)记录快照,而不是存储差异数据

大部分版本控制系统是以文件变更列表的方式存储信息,它们存储的信息由一组原文件和每个文件随时间逐步累积的差异组成。

version_1 version_2 version_3 version_4 version_5
文件A 差异1 差异2 差异3
文件B 差异1 差异2
文件C 差异1 差异2
文件D 差异1 差异2 差异3 差异4
文件E 差异1

因此,此类版本控制系统也被称为基于差异的版本控制系统。

而git不是采用上述的方式保存数据,相反,git会把数据看作是对小型文件系统的一系列快照。

version_1 version_2 version_3 version_4 version_5
文件A A1 A2 A2 A3
文件B B B1 B1 B1
文件C C1 C1 C1 C2
文件D D D D D1
文件E E E E E E

在git中,每当开发者保存或提交修改时,git都会为当前的全部文件创建一个快照,并保存这个快照的索引。如果文件没有修改,那么git不会重新存储该文件,而是只保留一个链接指向之前存储的文件。

换句话说,git对待数据更像是对待一个快照流。

(2)操作本地化,没有网络延时困扰

由于git在本地有仓库,因此git的操作都是对本地文件的操作,一般不需要连接网络,获取其它计算机的信息。因此,这会让git看起来比其它版本管理系统操作更迅速。

(3)检验文件的完整性,杜绝文件内容或目录内容被篡改

git中所有的数据在存储前都会计算校验和,这是构建在git底层的,是构成git的重要一环。

git通过SHA-1散列机制,对文件内容或目录结构计算出由40个十六进制字符组成的字符串,这些字符串充当文件或目录的索引存储在git数据库中。

(4)一般只添加数据,数据丢失可能性小

我们执行的git操作,基本上都是往git数据库中添加数据。如果我们还定期往其他仓库推送数据,那么就很难丢失数据。


2.git的三种状态及三个阶段

在git中,有三种状态经常被提及,那就是:已提交(committed)、已修改(modified)、已暂存(staged)

  • 已修改,已经修改了文件内容,但是还没保存到本地仓库中;
  • 已暂存,对一个已修改的文件的当前版本做了标记,将之包含在下次提交的快照中;
  • 已提交,数据已经保存在本地仓库中了。

此刻,对于git的三种状态,我们或许理解的还不够透彻,不过不要紧,随着我们对git的深入剖析,等下我们就会清楚的知道这三个状态的真实含义是什么。

由git的三种状态会引出git的三个阶段,那就是:工作区(working directory)、暂存区(staging area)、git仓库(.git directory或Repository)

  • 工作区,在磁盘上供开发者使用、修改;
  • 暂存区,是一个文件,保存下次将要提交的文件列表信息;
  • git仓库,用来保存项目的元数据和对象数据库。

git的三个阶段我们现在清楚了,那么这三个阶段之间的工作流程就组成了git的工作原理。

git学习日志-git剖析

  1. 在工作区修改文件;
  2. 将打算下次提交的更改选择性的添加到暂存区;
  3. 提交更新,找到暂存区的文件,将快照永久性存储到git仓库中。

git学习日志-git剖析

了解了git的工作原理,那么也就清楚git的三个状态是什么了。

  • 如果git仓库中保存了特定版本的文,那么就属于已提交状态;
  • 如果文件已经修改并放入暂存区,就属于已暂存状态;
  • 如果文件被修改了,而且还没放到暂存区,就是已修改状态。