Git之旅① - 历史起源与特点( 二 )


6.1 SVN vs GITsvn:是集中化的版本控制系统, 只有一个单一的集中管理的服务器 , 保存所有文件的修订版本 , 而协同工作的人们都通过客户端连到(必须联网)这台服务器(中央服务器保存版本库元数据) , 取出最新的文件或者提交更新 。
git:是分布式的版本控制系统 , 每一个终端都是一个仓库(不联网也可以,在各个客户端都保留有版本库元数据) 。 客户端并不只提取最新版本的文件快照 , 而是把原始的代码仓库完整地镜像下来 。 每一次的提取操作 , 实际上都是一次对代码仓库的完整备份(如果想测试的话 , 可以把 .git/object/*删除,然后再次pull 。 不建议实际中操作 , 可以测试使用) 。 最重量级的是创建分支so easy!
6.2 关于仓库
Git之旅① - 历史起源与特点文章插图
图中的圆柱体(数据版本库)说明了SVN代码仓库的位置 , 单点 。
Git之旅① - 历史起源与特点文章插图
图中的圆柱体说明了GIT代码仓库的位置 , 多点(堪比鸣人影分身) 。
6.3 关于版本
Git之旅① - 历史起源与特点文章插图
中央服务器完了 , 就全完了 。
Git之旅① - 历史起源与特点文章插图
什么?全完?不存在的!
7. 常用的保存方式
常用的2种方式
1. 记录文件每个版本的 快照2. 记录文件每个版本之间的 差异
GIT采用第一种方式 。 像Subversion和Perforce等版本控制系统都是记录文件每个版本之间的差异(增量保存各个版本) , 这就需要对比文件两版本之间的具体差异 。 但是GIT不关心文件两个版本之间的具体差别 , 而是关心文件的整体是否有改变 。 若文件被改变 , 在添加提交时就生成文件新版本的快照 , 而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和 。
GIT能正常工作完全信赖于这种SHA-1校验和 , 当一个文件的某一个版本被记录之后会生成这个版本的一个快照 , 但是一样要能引用到这个快照 , GIT中对快照的引用 , 对每个版本的记录标识全是通过SHA-1校验和来实现的 。
当一个文件被改变时 , 它的校验和一定会被改变(理论上存在两个文件校验和相同 , 但机率小到可以忽略不计,大概 16^40) , GIT就以此判断文件是否被修改 , 及以记录不同版本 。
在工作目录的文件可以处于不同的状态 , 比如说新添加了一个文件 , GIT发现了这个文件 , 但这个文件是否要纳入GIT的版本控制还是要由我们自己决定 , 比如编译生成的中间文件 , 我们肯定不想纳入版本控制 。
7.1 什么是快照
举几个日常生活中的例子
1. 游戏 (存档点 save point)
2. 搜索引擎 (百度快照)
Git之旅① - 历史起源与特点文章插图
3. 数据库同步 (数据快照)
简要概括就是:记录某一刻的样子 。
8. Git特点其他版本管理系统主要差别:
① Git只关心文件数据的整体是否发生了变化 , 而其他多数版本管理系统则只关心文件内容的具体差异(需要增量保存差异) 。
② Git并不保存文件前后变化的差异数据 , 更像是把变化的文件整体做一个快照 , 然后记录在一个微型的文件系统中 。 每次提交更新时 , 会比较这个快照 。 若文件没有变化 , Git则只对上次保存的快照作一个链接 。
Git保存的是文件的完整快照 , 而不是差异变化或者文件补丁 。 Git每一次提交都是对项目文件的一个完整拷贝 , 因此你可以完全恢复到以前的任一个提交而不会发生任何区别 。 这里有一个问题: 如果我的项目大小是10M , 那Git占用的空间是不是随着提交次数的增加线性增加呢?我提交(commit)了10次 , 占用空间是不是100M呢?很显然不是 , Git是很智能的 , 如果文件没有变化 , 它只会保存一个指向上一个版本的文件的指针 。 即:对于一个特定版本的文件 , Git只会保存一个副本 。 但可以有多个指向该文件的指针 (该指针与C语言指针不同 。 C语言指针内容可以变化 , 指针不变 。 但是,git的指针指向的文件发生细微变化 , 指针就会立即变化 。 )
Git之旅① - 历史起源与特点文章插图
核心特点
1. Git底层自行维护的存储文件系统:存储的是文件快照 。 即整个文件内容 , 并保存指向该快照的索引
2. 去中心化的分布式控制系统