相信你们或多或少都在工做中用过svn,git之类的版本控制工具。不过,svn和git都是怎样存储数据的?svn和git存储数据有什么差异呢?git
1.本地化版本管理-rcs安全
他的原理就是在客户端本地保存并管理文件布丁。由于全部的版本信息都在客户端本地,因此他的缺点也是显而易见的:多人没法协同合做。
2.集中化版本管理-svn服务器
他的原理是有一个集中的管理服务器,在该服务器保存了全部的文件修订版本。全部人均可以聪这个服务器存取文件。固然,它相对于上一个本地化版本管理,已经解决了多人没法协同合做的问题。可是,服务器一旦宕机或者发生故障,则版本信息就会不安全了,这样其实没有太大的保障性。
3.分布式版本管理-git分布式
他的核心原理是去中心化。就像下图所示,它不只会在服务器保存版本信息。客户端不只提取了最新版本文件快照,还会把代码仓库完整镜像下来。用户能够在无网的状况下,随意在本地进行版本提交。上面提到的集中化版本管理就没有这样的优点。
以下两图分别是svn及git存储的原理图。
a.svn存储存储的是文件的差别化。如图中,版本2和版本1。文件A和文件C有修改,则在版本2的时候存储该两文件变化的部分。无论文件存储了多少次,都是一份原始文件+多份差别文件的累积。
b.git存储存储的是文件快照。所谓的文件快照相似与文件自己,不过git会进行压缩等操做。如图中,在版本2和版本1。文件A和文件C有修改,则在版本2的时候会从新存储已经变化的文件,而不是变化部分。实际上,git在版本管理的时候记录的是指针。文件有变化时,会新建指针指向新的文件。而文件B没有变化,则仍是原始版本的指针指向原来的文件。这里的原理会在稍后部分进行详细解析。
固然,git这样存储文件,而不是diff。当咱们须要查看某个版本时,只要加载对应的文件便可,不须要再merge。是一种以空间换时间的策略。svn
git的每一次提交都会有3个blob文件,一个树对象,一个提交对象,以下图所示。
树对象(绿色部分)存储目录结构及blob文件的索引。能够看到树对象里面有3个blob标示,分别对应5b1d3/911e7/cba0a三个blob文件。而提交对象指向树对象的指针及全部的提交信息。下图的提交对象98ca9里有一个tree的标示指向了92ec2,固然它还包含了做者等等提交信息。工具
而不少次的提交则会有不少次上述的提交对象,他们之间是怎样链接的呢。其实在提交对象里面还有一个parent的标示。以下图所示,34ac2的parent是98ca9。可是由于98ca9是首次提交则parent属性是空。spa
以下图所示。其实,git每次的提交不单单会有上面说的提交对象的概念,在提交对象之上,还会有分支的概念。git默认会有一个master分支。以下图所示,咱们也能够新建一个v1.0的分支。可是,如今有两个分支,咱们怎么知道咱们在哪一个分支工做呢。其实有一个HEAD的指针,该指针指向哪一个分支,目前的工做分支就是哪一个。若是咱们须要切换分支,用git checkout xxx便可。3d
关于git的工做区域,文件类型,具体的指令,开发流程等等,将在另一片文章详细介绍~版本控制