聊聊版本控制

版本控制系统的简介及历史
SVN与Git


前言

项目一直以SVN进行版本控制,感觉上线后,分支的管理会比较繁琐;加上我之前一直用Git,就推荐用Git来管理项目。

推荐一个东西,要有凭有据,所以就看了一下版本控制这块的内容,了解了一下版本控制的发展史,感觉收获颇丰,也修正了我以前的一些观点(褒Git 贬SVN)。


本文主要内容:

  • 版本控制系统简介及历史
  • SVN与Git的应用




简介

what?

版本控制系统(Version Control System)是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。(源自 百度百科)

内容包括:

  • 检入检出控制
  • 分支和合并
  • 历史记录


历史

这里简单的列几个时期,更加详细内容可参考 版本控制的历史


1. 本地版本控制系统

采用的模式为锁定文件模式:lock-modify-checkin-unlock

多客户端在同一个服务器上工作,修改文件前先锁定文件,再去修改,提交,并解除锁定。类似于多线程中的锁机制。

代表:

  • RCS(Revision Control System)


2. 集中式版本控制系统(CVCS - Centralized Version Control System)

采用的模式为复制修改合并模式:copy-modify-merge

此时的服务器成为一个中央存储服务器,各客户端都有一个中央服务器的备份(分支),并基于此修改,再去合并到中央服务器,修改文件不需要加锁,但是在合并的时候要处理冲突,。

代表:

  • CVS(Concurrent Versions System)

    • CVS管理下的每个文件都有一系列独立的版本号,比如:r1.1, r1.2 …,然后用标签(tag)来记录一个集合,这个集合的元素是一对(文件名:版本号)。比如创建个v1.0的标签:

      1
      tag v1.0 (file1: r1.1) (file2: r1.6) (file3: r1.3)
  • VSS(Visual Source Safe)

  • Perforce

  • SVN(Subservision)

    不同于CVS,SVN采用关系型数据库来存储改变集,并依赖于硬链接的方式来提高效率,避免复制文件本身。


3. 分布式版本控制系统(DVCS - Distributed Version Control System)

不再像本地版本控制系统与集中式版本控制系统的 C/S结构,而采用P2P结构。

相对于集中式版本控制系统,在创建、合并分支上更为便捷。支持离线的相关操作,脱离网络的控制。

代表:

  • BitKeeper
  • Git
    • Git有四种对象
      • tag对象,作为标签指向某个commit对象
      • commit对象代表一次提交,它保存有修改人、修改时间、附加信息并且指向一个文件系统树(tree对象),每次commit实际上都是一次对文件系统树的快照。
      • tree对象代表一个文件夹,保存指向blob对象或tree对象的指针
      • blob对象代表一个文件
    • 所有的对象都有HASH值,通过HASH值变化来判断commit间是否有变化,当不同commit间某文件没有变化时,不同commit的指针都指向该文件,并不会创建一个新的blob对象
  • Mercurial



下一代?

版本控制的历史 网站中,也给出了对下一代版本控制系统的畅想。

  • 语义化的版本控制系统;通过了解代码结构去合并文件或对比文件差异,辅助提高代码质量
  • 分析并提取有价值信息辅助开发;版本控制系统不仅仅作为一种交付机制,更应该成为提高生产力的工具
  • 企业级的分布式版本控制系统;消除悲观锁等模式,并可以遵守企业所需的规定和安全策略
  • 更好的可视化工具
  • 更优的性能



使用

目前最常用的无外乎 SVN和Git,本文章主要讨论的也是这两个。

SVN(Subversion)

Apache项目底下的一个开源版本控制系统,目的是取代CVS,特点是 集中式管理

优点:

  • 集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便,操作简单,容易上手。
  • 在服务端统一控制好访问权限,利用代码的安全管理
  • 所有的代码以服务端为标准,代码一致性高

缺点:

  • 性能要求高。所有操作都需要通过服务端进行同步,这会导致服务器性能要求比较高。如果服务器宕机就无法提交代码。
  • 分支管理不灵活。SVN分支是一个完整的目录,且这个目录拥有完整的实际文件,这些操作都是在服务端进行同步的,不是本地化操作,如果要删除分支(即删除远程分支),需要所有人都同步。
  • 需要联网。如果无法连接到SVN服务器,就无法提交自己的代码,更别说还原、对比等操作。如果在外网,网速不稳定,同步时间会久一些。

工具:

教程:


Git

Git是一个开源的版本控制软件,它的特点是 分布式管理

优点:

  • 分布式开发时,可以克隆一个本地版本,然后在本地进行操作提交,本地可以完成一个完整的版本控制。在发布的时候,推送到远程服务器即可。
  • 分支的本质是一个指向提交快照的指针,速度快、灵活,分支之间可以任意切换,都可以在本地进行操作可以不同步到远程服务器。
  • 可以离线工作。如果远程服务器出现问题,也可以在本地进行切换分支的操作,等联网后再提交、合并等。

缺点:

  • 没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制。
  • 工作目录只能是整个目录,而SVN可以单独检出某个有权限的目录。
  • 上手难度较高。

工具:

  • 命令行(专业的Coder是不需要图形化界面的! 手动狗头..)
  • SourceTree
    • 之前用Mac的时候用过,感觉可视化工具里面算比较好用的;Windows上效果也不错
  • GitKraken
    • 没用过,看UI风格,挺不错的

教程:


总结

现在很多人都无比推崇Git,贬SVN(好吧,我承认之前我也有一些),也看了许多人对此的讨论,比如 StackOverFlow 中的 Why is Git better than Subversion?Why to use SVN? Any hidden pros (over GIT/Mercurial/Bazaar) there?

但是,现在我觉得无论是SVN还是Git,各有特色,没有哪个是占据绝对优势,

对于技术开发,所管理的大部分是文本文件,需求灵活多变且频繁,所以能够便捷的 创建合并 分支的Git,显然是有益处的。

对于非技术开发,再加上管理文件为 文档文件、音乐音效、图片视频等,没有diff需求,使用上手快速简单的SVN,更为稳妥。

而且对于企业,对访问控制、权限分配、安全性有较强需求,使用SVN相对于Git更好一些。


在所在的游戏开发这行,我觉得小孩子才做选择,我全都要!

对于策划、美术、测试等维护的文件采用SVN管理,上手简单、定向拉取;

对于技术开发,使用Git来维护,对代码管理更加灵活便捷。





参考资料: