哈希
- 哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
- 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
- 哈希算法确定,输入数据确定,输出数据能够保证不变。
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大。
- 哈希算法不可逆。
- Git 底层采用的是 SHA-1 算法
- 哈希算法可以被用来验证文件。
- 原理如下图所示:
- Git 就是靠这种机制来从根本上保证数据完整性的。
Git 保存版本的机制
- 【SVN】集中式版本控制工具的文件管理机制
- 以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异,也叫增量式的版本控制。
- 也就是说每个版本只保存文件的修改部分,当我想要某个历史版本的数据的时候,我们会把当前版本的修改和历史版本的修改,再加上原始文件,将这三部分拼到一块,就是我们需要的版本的状态。
- 举例:我们想要File C的Version 3版本,那么需要原始文件File C和历史版本的修改△1,再加上当前版本的修改△2,将这三个文件拼到一起就是我们需要的版本状态。
- 【Git 】分布式的文件管理机制
- Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
- 举例:File A 的版本Version2和Version3从图中可以看出版本都是A1,没有改动,那么Version3的A1不是重新存储该文件,而是保留一个链接指向之前存储的文件
- Git 文件管理机制细节
- Git 的 " 提交对象 "
- 每次使用Git提交都会创建一个提交对象【下图中的白色框】,每个提交对象都包含一个hash值,同时也包含一个树对象【下图中蓝色框】的hash值,每个树对象包含很多文件【下图中黄色框】的内容以及该文件的hash值,每个文件对象都包含自己文件的内容以及该文件的hash值。
- 提交对象及其父对象形成的链条【父子关系】
Git 分支管理机制
- 分支的创建【本质上还是创建了一个指针指针的指向和master分支的指向相同】
- 分支的切换
- 切换分支到testing分支,就是移动了HEAD指针
- testing分支提交了新的内容,testing就相对于master向前移动了一步
- 再次切换到master分支,就是将HEAD指针再次指向master分支
- 将master分支提交一次,testing和master分别指向两个不同的版本,这两个版本都以f30ab为父对象
- 到这里才开始了分差