2019独角兽企业重金招聘Python工程师标准>>>

设计模式的差异

1、集中化的版本控制系统

集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法(见下图1)。

图1

这种系统最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端偶然提取出来的保存在本地的某些快照数据就成了恢复数据的希望。但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

2、分布式版本控制系统

分布式版本控制系统( Distributed Version Control System,简称 DVCS )会把服务器上的代码仓库完整地镜像下来。这样每个人的电脑上都有一份完成的服务器代码仓库的镜像,任何一处协同工作用的服务器发生故障,事后都可以用个人的电脑上的像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见下图2)。我们可以看到电脑A与电脑B与服务器上的版本内容完全一致

图2

版本存储方式的差异

1、直接记录快照,而非差异比较

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看下图3。

图3 . 其他系统在每个版本中记录着各个文件的具体差异

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像图 4 所示。

图 4. Git 保存每次更新时的文件快照

这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。稍后在第三章讨论 Git 分支管理的时候,我们会再看看这样的设计究竟会带来哪些好处。

2、近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。但如果用 CVCS 的话,差不多所有操作都需要连接网络。因为 Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。

举个例子,如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。

用 CVCS 的话,没有网络或者断开 VPN 你就无法做任何事情。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。同样,在回家的路上,不用连接 VPN 你也可以继续工作。换作其他版本控制系统,这么做几乎不可能,抑或非常麻烦。比如 Perforce,如果不连到服务器,几乎什么都做不了(译注:默认无法发出命令 p4 edit file 开始编辑文件,因为 Perforce 需要联网通知系统声明该文件正在被谁修订。但实际上手工修改文件权限可以绕过这个限制,只是完成后还是无法提交更新。);如果是 Subversion 或 CVS,虽然可以编辑文件,但无法提交更新,因为数据库在网络上。看上去好像这些都不是什么大问题,但实际体验过之后,你就会惊喜地发现,这其实是会带来很大不同的。

3、时刻保持数据完整性

在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。

Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,看起来就像是:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

4、多数操作仅添加数据

常用的 Git 操作大多仅仅是把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。在别的 VCS 中,若还未提交更新,就有可能丢失或者混淆一些修改的内容,但在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。

这种高可靠性令我们的开发工作安心不少,尽管去做各种试验性的尝试好了,再怎样也不会弄丢数据。

参考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80

转载于:https://my.oschina.net/wangyuzhan/blog/1619534

SVN与git的区别【图文经典版】相关推荐

  1. SVN的学习(SVN的简单说明、SVN的安装与配置、SVN与GIT的区别)

    一.SVN的简单说明 SVN是subversion的缩写,属于集中化的版本控制系统,是一个开放源代码的版本控制系统,SVN不是分布式的 工作场景 进入公司需要做的关于开发的第一件事, 就是向项目经理索 ...

  2. 话说Svn与Git的区别

    把第一条理解到位思想到位了做起来才会有的放矢,其他几条都是用的时候才能体会到 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本 ...

  3. SVN和Git的 区别

    SVN工作流程 git工作流程 区别: 1.SVN属于集中化的版本控制系统,有个不太精确的比喻:SVN = 版本控制+ 备份服务器    SVN使用起来有点像是档案仓库的感觉,支持并行读写文件,支持代 ...

  4. svn cvs git的区别

    SVN 和 CVS 都是免费的-集中式版本控制 缺点: 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,结果不敢想象. Gi ...

  5. mysql maven 自动生成_【图文经典版】maven自动生成dao层

    第一步:POM文件 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/mav ...

  6. SVN和Git 介绍,区别,优缺点以及适用范围

    SVN: SVN是Subversion的简称,是一个开放源代码的版本控制系统,支持大多数常见的操作系统.作为一个开源的版本控制系统,Subversion管理着随时间改变的数据.这些数据放置在一个中央资 ...

  7. 从svn到git开发转变

    前言:目前的公司的开发技术还是处于刀耕火种的年代,react,vue已经火到不行了,可是还在用jQuery一遍遍处理着dom.版本控制用的是svn,这里也不是说svn不好,在windows下svn的& ...

  8. idea查看svn前分支提交_SVN与Git的区别,读完之后,大部分程序员都收藏了...

    SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版本控制器!这是两者之间最核心的区别. 1) 最核心的区别Git是分布式的,而Svn不是分布的.能理解这点,上手会很容易, ...

  9. Svn、Git、GitHub、GitLab、码云 区别

    一.吐槽个黑历史 git诞生: git 由Linus Linus花了两周时间自己用C写了一个分布式版本控制系统,在2008 正式上线.(这里和Linux有一段黑历史). github: github代 ...

最新文章

  1. 一文详解随机一致性采样算法:RANSAC
  2. 百思不得其解,一个钻石玩家可以短时间上王者?因为猎游?
  3. 【EasyUI】easyui 设置表头颜色 - 多级表头
  4. STL 容器和迭代器连载6_顺序容器的操作3
  5. rsyslod服务配置
  6. android 学习之URI
  7. 无线访问域服务器,管理用户的RADIUS服务器认证无线局域网控制器WLC配置-Cisco.PDF...
  8. php mysql可以跨站_Laravel5中防止XSS跨站攻击的方法
  9. 蓝牙设备删除失败_这软件能让你的蓝牙耳机,用上AirPods的功能
  10. linux脚本循环创建用户,shell应用之批量添加用户实例
  11. 常见Shell编程脚本
  12. 计算机视觉那些事 | 深度学习基础篇
  13. 【docker】学习docker
  14. linux yum安装rar解压软件
  15. keyshot场景素材导入_Keyshot怎么导入Rhino室内场景渲染?
  16. UVa515-King
  17. 影院服务器可以给投影机信号吗,投影机有哪些接口类型 投影机接口类型与连接知识【介绍】...
  18. Mac技巧:如何在拥挤的桌面上拖动文件
  19. 疫情微博内容情感分析
  20. 微信浏览器是什么内核,以及它的兼容性。

热门文章

  1. boost::fusion::clear用法的测试程序
  2. boost::function_types::is_nonmember_callable_builtin用法的测试程序
  3. boost :: swap交换整数数组的测试程序
  4. Boost:测试bind <void>
  5. ITK:多相Chan和Vese稀疏场水平集分割
  6. VTK:可视化算法之FindCellIntersections
  7. VTK:图表之ConstructTree
  8. Qt Creator在问题窗格中显示任务列表文件
  9. Qt Creator缩进文字或代码
  10. OpenGL Tessellation细分曲面的实例