版本控制那点事--简述Git与SVN
2018-04-10 本文已影响391人
kirito_song
关于版本控制
公司用的SVN。
自己写demo用的Git、用的时候基本也就是简单的上传。
忽然心血来潮想仔细看看Git。于是就有了这一篇帖子。
Git与SVN的区别
-
集中式管理&&分布式管理
- SVN是集中式管理
- SVN十分简单粗暴、版本库只保存在中央服务器上。所有的使用者都需要连接到这台服务器、进行提交更新/拉取最新文件的操作。
- 中央服务器就相当于是一个共享文件夹、每个人都可以进去操作文件。
- 当你操作完毕、再把这个文件放进共享文件夹里。
这样就会出现一个问题。由于是共享文件夹、需要联网。如果网络情况不佳的话、下过电影的各位都懂的
SVN.png
- Git是分布式管理
- Git版本库分散在每个使用者的电脑上。每个终端都是一个仓库、每次拉取操作都是备份对应的整个版本库而不仅限于最新的文件快照。
- 因为版本库就在自己的电脑上、你不再需要联网去修改版本库。
- 小明修改了版本库中的A文件、只需要将推送给小亮、小亮的版本库中也能看到A文件的修改。
-
那么远程仓库的作用是什么呢。远程仓库并不是必须的、他只是方便大家协作、交换工作结果(通常是各个分支上的版本库信息)的云盘而已。(比如两个仓库不在一个局域网、或者某天你同事的电脑没开机、你就没有办法直接从他的本地仓库拉取数据了)。
Git.png
- SVN是集中式管理
-
也有相似的地方
不考虑分支切换的话(因为通常SVN大家都是在主分支上)。Git和SVN的使用上极其相似。
流程图_01
最大的区别、就是有无本地仓库。进而导致在Git在commit到本地仓库之后、还需要再次push到远程仓库。
主要的区别
-
Git 只关心文件数据的整体是否发生变化、而SVN这类版本控制系统则只关心文件内容的具体差异。
- SVN会每次记录有哪些文件作了更新、以及都更新了哪些行的什么内容。
- SVN 服务器上保存着唯一的一份历史版本库、当然是越详细越好了。
-
Git 更像是把变化的文件作快照后、记录在一个微型的文件系统中。每次提交更新时、它会纵览一遍所有文件的指纹信息并对文件作一快照、然后保存一个指向这次快照的索引。为提高性能、若文件没有变化、Git 不会再次保存、而只对上次保存的快照作一连接。
Git快照_01
Git快照_02
-
Git如何查找数据
- Git为了快速查找数据、将数据添加一个header封装为数据对象、然后进行Hash、将此Hash值当作对象名字、以后根据此Hash值变可找到数据。
- 具体的实现方式为:Hash值的前2位是文件的目录名字、后面的值为文件名。由于进行Hash、一旦文件内容改变、其对应的Hahs值就会变化、因而很适合变化的数据。
-
在Git 中的绝大多数操作都只需要访问本地文件和资源、不必联网就可以看到所有的历史版本记录、而SVN 却需要联网。
- 因为 Git 在本地磁盘上就保存着所有当前项目的历史更新、所以处理起来速度飞快、当我们需要浏览项目的历史更新摘要、Git 不用跑到外面的服务器上去取数据回来、而直接从本地数据库读取后展示给你看。
- 如果想要看当前版本的文件和一个月前的版本之间有何差异、Git 会取出一个月前的快照和当前文件作一次差异运算。
-
Git 的内容完整性要优于SVN
- Git每次Commit或者push动作都会通过哈希值进行文件校验、保证传输过程中不会意外的丢包。
- Git数据库中所有的索引都是通过哈希值来实现、而不是文件名。
-
Git把内容按元数据方式存储,而SVN是按文件
- 这也是为什么.git文件比.svn文件要大的原因。
分支不同
这大概是最大最大的不同了。
- SVN也是有分支的、只是开启分支的代价比Git要大得多。
- SVN的分支确实是有些蛋疼的、因为每一个分支都是一套完完整整的文件。虽然SVN可以针对某个目录做分支、但是你真能保证你的代码只影响到一个目录么...
- Git的分支你只要下载一份主文件、然后获取文件的每个分支的元素。
-
对于存在分支的项目、SVN的克隆速度要成倍的慢于Git。
- SVN每个分支、都是一个完整的文件拷贝。
- Git只需要载入单个分支的文件、在载入其他分支不同的元素即可。
关于分支合并:
- Git从数据结构上更好的支持了分支合并、但我们都知道合并的麻烦程度总是取决于冲突的数量。
- 如果你将Git那种每个小Bug都开一个新分支的习惯、挪到SVN上、一样不用处理多少冲突。
关于该用啥
个人觉得哟
-
如果你们经常需要做并行开发。
用Git会让你养成很多好习惯并且十分舒服。虽然需要一些学习成本。 -
如果你不需要并行开发。
大家都只需要在主分支上操作同一份版本库。用SVN吧、就当成一个共享文件夹来用。