# Git
是目前最先进的版本控制管理系统。
本质上讲, git
是一个内容寻址文件系统。其核心部分是一个简单的键值对数据库 ( key-value data store
). 你可以想像 git
仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。
# git
先进在哪里?
-
直接记录快照,而不是比较差异。
这也是git
和其他版本管理系统的主要差别。其他版本管理系统 (CVS
,Subversion
,Perforce
,Bazaar
等) 存储各个版本之间,每个文件随时间逐渐累积的差异。这类版本管理系统称为 基于差异的版本控制。如下图:
git
则不然,当你提交更新或者保存项目状态的时候,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。为了效率,如果没有没有修改,git
不再重新存储该文git
件,而是只保留一个连接指向之前存储的文件。Git
对待所管理的数据更像是一个快照流。如下图:
git
更像是一个小型的文件系统,而不只是一个简单的 CVS。 -
git
近乎所有操作都在本地执行
这意味着不管有无网络,你都可以工作。没有网络的时候,你照常可以提交代码,等到有网的时候,在进行上传到远程仓库。而使用Subversion
,CVS
的话,只能修改文件,但是不能提交。 -
git
保证完整性
Git
中所有的数据在存储前都计算校验和,然后以校验和来引用。这就是说,Git
会知道你所有的更改任何文件内容或者目录内容,这个是构成 git 哲学不可或缺的部分。Git
使用计算校验和的机制叫做SHA-1
散列 (hash
, 哈希)。这是一个由40
个十六进制字符 (0-9
和a-f
) 组成的字符串,基于 Git 中文件的内容和目录结构计算出来的。Git
数据库中保存的信息都是以文件内容的哈希值来索引数据,而不是文件名。 -
Git
一般都只添加数据
执行的所有的git
操作,几乎只往数据库中添加数据。一旦你提交了快照到git
中,就难以再丢失数据,特别是定期的推送到了远程仓库。
# git
的三种状态
git
对文件的管理,有三种状态。
- 已修改:表示修改了文件,但还没有保存到数据库中。
- 已暂存:表示对一个已修改文件的当前版本做了标记,使之在下次提交的快照中。
- 已提交:表示数据已经安全的保存到了本地的 git 数据库中。
这三种状态分别代表了 git
的三个工作区。工作区,暂存区以及 git
目录 (版本库)。如下图
工作区是对项目的某个版本独立提取出来的内容。这些从 git
仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区是一个文件,保存了下次将要提交的文件列表信息。 git
中称为索引,不过一般都是称为暂存区。
Git
仓库目录指的就是 .git 目录 (.git)。下节就从创建仓库开始学起。
# 最后
期望与你一起遇见更好的自己