在直接解释Git原理之前,我们要先讲解什么是本地版本控制系统,快照,版本控制,集中化版本控制系统。
本地版本控制系统
本地控制版本系统的工作原理:在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
不要和另存为混淆:
本地版本控制系统保存一次文件的初始版本,剩下只记录修改后的差异,例如增加的行,删除的行(很类似ps的历史记录面板),而另存为则是完全把每次修改的文件全部存储一遍。
快照与版本控制
快照的官方定义:对项目某一特定时间点所有文件和目录结构的完整记录。
简单来说在文件不同的时间节点给文件拍个照,你可以回到这个时间段,很多人认为备份和快照是一样的,实际不同,备份多个文件了,但快照只是对某一文件在某一时间的状态进行记录。
可以类比为游戏存档,如果源文件删除,快照没用了的。
版本控制其实就是操作记录文件的快照,然后方便用户回溯到快照的时间点。
官方的定义是:版本控制是一种记录一个或若干文件内容变化以便来查阅特定版本的系统。
有了版本控制系统,你就可以轻松地把文件回溯到过去的某个时间点的状态了。
集中化版本控制系统
本地化版本控制系统稍有局限,因为在真正的工作中更多情况是多人协作,这就引出集中化版本控制系统。
工作原理:文件保存于一个服务器中,用户从中取出文件的副本,修改,再次提交,系统根据用户的修改给文件打补丁,也就是识别文件的增量变化。
有人会有疑问,假如A和B两人同时取出文件,但A先提交了自己的修改,B再提交的话是否会覆盖A呢?实际是不会,因为系统会检查B的文件版本,然后拒绝B的提交申请。
但集中化版本控制系统的一个很大缺陷是,一旦服务器出现问题,原来的所有数据将会丢失,只有用户手里的单独快照了。
Git原理(分布式版本控制系统)
Git的出现能够很好地解决集中化版本控制系统的缺陷,下面简单介绍一下Git的工作原理:
首先为了避免出现服务器故障后数据丢失的情况,用户会从服务器镜像整个代码仓库到本地,接下来在本地进行修改,并提交到本地的仓库里,再从本地的仓库同步到服务器的远程仓库。这样哪怕服务器出现问题,我们手里是有代码仓库的备份的。
工作目录:从仓库拿出的文件副本。
暂存区域:可以理解为对要提交的文件的一种标记,表示这些文件已经准备好了,可以提交到本地仓库。
Git有三种状态:
1.已修改(modifeid):修改了文件,但没有保存到本地数据库
2.已暂存(staged):对当前修改的文件做了标记,使其包含在下次提交的快照中
3.已提交(committed):已经安全保存到本地数据库中
知道了这些,让我们细节一点的讲解git的原理:
首先我们将代码仓库下载到本地,在本地修改文件,将需要修改的程序全部修改好后,放入暂存区域,给本地仓库,本地仓库检查提交文件的变化,若没变化,则不会再存储一遍,有变化,添加到源文件。每次上传到本地仓库后都会生成一次快照,方便回溯。
上传到本地仓库后,通过一系列指令可以上传到远程仓库,我们要更新仓库的话,也是通过指令,仓库不会自动更新。
差异存储和快照存储
除去本地代码仓库的有无,差异存储和快照存储是集中化版本控制和分布式版本控制的重要区别。
差异存储主要关注的是增量变化,而快照存储则是记录此时文件的全部状态。
差异存储回溯到某一时间点较难,只能从初始版本开始,按照记录打补丁回到,而快照存储则可以更容易。
当然快照存储也有劣势,因为要记录文件的全部状态,所以占用的存储空间会更大。