【Git】从快照到内容寻址,浅析Git版本管理的实现方式
学习使用Git的过程中,常常对Git的原理与机制感到好奇:Git为什么能通过一个小小的仓库实现庞大文件的版本管理?为什么明明没有倍增式存储却还能轻松地完成合并与分支操作?Git的功能实现究竟是通过保存差异化文件?还是通过保存差异(diff)?本篇博客将从Git的快照机制入手,以十万个为什么的方式,介绍Git底层机制的一部分。
1.快照
2.哈希与内容寻址
<1>啥是快照?快照和文件差异有啥区别?
此处需要先引出SVN版本控制系统(貌似经常捞出来跟Git比较),只关注两者存储方式的区别:
SVN:
SVN以文件为水平维度,意味着它记录的是每个文件在每个版本下的变化(delta改变)。每次提交只记录文件的变化部分,而不是整个文件。这使得SVN存储的数据相对较小,因为它只存储了每个文件的变化,而不是整个文件的副本。
Git:
Git则是以每次提交为一次快照,即每次提交时,对当前所有文件做一次全量快照,然后将该快照作为一个整体存储。这意味着每次提交都包含了整个项目的状态,而不仅仅是文件的变化部分。
Git存储的数据量相对较大,因为每次提交都包含完整的文件副本,但这也使得Git在操作上更加灵活,例如,可以轻松地进行分支、合并等操作。
这里有两张图可以比较明确地显示出两者之间的区别:
全…量?很全吗?有多全?
快…照?很快嘛?有多快?
这么多奇怪的名词,倘若读者第一次见,必然会感到晕头转向,不过不用担心,接下来笔者会一一解释:
快照(snapshot)
这个概念源于摄影学,在摄影中,snapshot可以翻译成:抓拍,指记录某一瞬间的影像。
从英文原意来看,Snap指的是相机的快门,在快速开合时发出的咔嗒声。Snapshot意为抓拍——捕捉特殊的瞬间。