直接记录快照,而非差异比较
Git 和其它版本控制系统的主要差别在于 Git 对待数据的方法,其它大部分系统以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。存储每个文件与初始版本的差异,如图所示
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化, Git 不会再次保存,而只对上次保存的快照作一链接。 Git 的工作方式如图所示
近乎所有操作都是本地执行
在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理速度飞快。
例如,如果要浏览项目的历史更新摘要, Git 可以直接从本地数据库读取后展示给你看。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。如果是svn,虽然可以编辑文件,但无法提交更新,因为数据库在网络上。
时刻保持数据完整性
在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。这项特性作为 Git的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
Git使用SHA-1
算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1
哈希值,作为指纹字符串。该字串由40个十六进制字符(0-9 及 a-f)组成。
Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
多数操作仅添加数据
你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。
同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
文件的三种状态
对于任何一个文件,在 Git 内都只有三种状态:
已提交(committed)
,已修改(modified)
和已暂存(staged)
。
已提交表示该文件已经被安全地保存在本地数据库中了;
已修改表示修改了某个文件,但还没有提交保存;
已暂存表示把已修改的文件放在下次提交时要保存的清单中。
由此我们看到 Git 管理项目时,文件流转的三个工作区域:
Git的工作目录(working directory)
,暂存区域(staging area)
,以及本地仓库(repository)
。
基本的Git工作流程
- 在工作目录中修改某些文件
- 对修改后的文件进行快照,然后保存到暂存区域
- 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中
我们可以从文件所处的位置来判断状态:
如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;
如果作了修改并已放入暂存区域,就属于已暂存状态;
如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。