一、本地vs分布式版本控制系统
1. 本地版本控制系统
采用简单的数据库或文件系统来记录本地文件的历次更新差异。
2. 集中化的版本控制系统
有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的开发者通过客户端连到这台服务器,取出最新的文件或者提交更新。缺陷:单点故障,可靠性问题。
3. 分布式版本控制系统
客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。
任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
每一次的提取操作,实际上都是一次对代码仓库的完整备份。
二、Git的基本思想
其他大多数SCM系统则关心文件内容的具体差异(每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容);Git关心文件数据的整体是否发生变化,并不保存这些前后变化的差异数据。
1. 把变化的文件作快照后,记录在一个微型的文件系统中。
2. 每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。
3. 为提高性能,若文件没有变化,Git不会再次保存,而只对上次保存的快照作一链接。
对于任何一个文件,在Git内都只有三种状态:
1. 已提交(committed):表示该文件已经被安全地保存在本地数据库中;
2. 已修改(modified):表示修改了某个文件,但还没有提交保存;
3. 已暂存(staged):表示把已修改的文件放在下次提交时要保存的清单中。
Git管理项目的三个工作区域:
1. Git目录(仓库)
2. 工作目录
3. 暂存区域
Git的工作区
每个项目都有一个Git目录(Git directory),用来保存元数据和对象数据库。每次clone镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从Git目录中取出某个版本的所有文件和目录,用以开始后续工作,形成工作目录(working directory),接下来就可以在工作目录中对这些文件进行编辑。
暂存区域(staging area):本质上是一个文件,保存了下次将要提交的文件列表信息。