是什么

  版本控制系统(Version Control System,VCS)是一种软件,可以帮助软件团队的开发人员协同工作,并存档他们工作的完整历史记录。

为什么

在我们的实际开发过程中,经常会有这种需求或问题:

  1. 实际项目开发中,总是需要将源码拷贝多份,以满足不同的需求。例如,每发布一个版本,就需要复制一份来存档当前版本的源码。
  2. 实际项目开发中,基本都是多个人合作完成,在多个人写代码时,就牵扯到代码合并成一份的问题。

历史分类

  纵观版本控制系统的发展历史,《Version Control By Example》一书的作者 Eric Sink 在他的书中对版本控制进行了分类,广义上讲,版本控制工具的历史可以分为三代:

网络 操作 并发性 示例
第一代 仅一个文件 锁定的 RCS, SCCS
第二代 集中式 多文件 提交之前合并 CVS, SourceSafe, Subversion, Team Foundation Server
第三代 分布式 变更的集合 合并之前提交 Bazaar, Git, Mercurial

《Version Control By Example》可以直接在作者的网站下载电子版(PDF 或 EPUB)

第一代

  第一代版本控制系统被称为本地版本控制系统。通过加锁将并发执行转换成顺序执行。 一次只能有一个人处理某个文件。具体流程如下:

  1. 首先应该把文件放在一个服务器上,方便使用者上传或下载文件
  2. 任何人想对某文件修改时,需要先把这个文件加锁,通过 checkout 指令,使得其他人无法修改
  3. 当修改完成之后,需要释放锁,通过 checkin 指令,形成一个新的版本,存放到服务器端。

  第一代版本控制系统主要有 RCS、SCCS(1972 年发布)和 DSEE(被认为是 Atria ClearCase 的前身)。目前,有些项目还在使用!

悲观锁
  每次获取数据的时候,都会担心数据被修改,所以每次获取数据的时候都会进行加锁,确保在自己使用的过程中数据不会被别人修改,使用完成后进行数据解锁。由于数据进行加锁,期间对该数据进行读写的其他线程都会进行等待。

第二代

  第二代版本控制系统被称为集中式版本控制系统(Centralized Version Control Systems,CVCS),其对同步修改更加宽容,但有一个明显的限制,用户必须在允许提交之前将当前修订合并到他们的工作中。

  由上图可看到,在集中式版本控制系统中,如果服务器嗝屁了,那么所有的开发者就只能干瞪眼了!因为,SVN 对于项目的管理是依赖于服务器中的中心仓库的!我们的更改必须要提交到服务器中的中心仓库。

  第二代版本控制系统主要有 CVS、SourceSafe、Subversion、Team Foundation Server、SVK。

乐观锁
  每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。
  乐观锁一般会使用版本号机制或 CAS 算法实现。

第三代

  第三代版本控制系统被称为分布式式版本控制系统(Distributed Version Control Systems,DVCS),其允许合并和提交分开。在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用。

  由上图可看到,分布式式版本控制系统也可以有个服务器端的仓库,用来同步各开发者的私有仓库!在分布式版本控制系统中,每个参与者的本地也会有一个完整的仓库。即使服务器端崩溃,我们仍然可以使用 Git(仅在本地仓库管理我们的代码),在网络具备时,再和服务器进行同步即可!

  第三代版本控制系统主要有 Bazaar、Git、Mercurial、BitKeeper,、Monotone。目前,第三代版本控制系统已经大有一同江湖的趋势(具体见 RhodeCode 在 2016 年做过的一项分析报告 Version Control Systems Popularity in 2016)!

RCS

  修订控制系统(Revision Control System,RCS) 是第一代的版本控制系统。它是一组 UNIX 命令(暂时没有找到有 UI 界面的软件),允许多个用户开发和维护程序代码或文档。

  RCS 于 1982 年由 Purdue University 的 Walter F. Tichy 首次发布。 它是当时流行的源代码控制系统(SCCS,它几乎是第一个版本控制软件工具,早期 Unix 开发人员于 1972 年开发)的替代工具。

  RCS 目前由 GNU 项目维护。GNU 官网介绍:https://www.gnu.org/software/rcs/;项目维护地址:http://savannah.gnu.org/projects/rcs/。目前,我们可以从 GNU RCS 的项目地址: http://savannah.gnu.org/projects/rcs/ 或者 Purdue University 的 RCS 官网 https://www.cs.purdue.edu/homes/trinkle/RCShome/ 下载最新版本的可执行程序、源码、文档。

  其中,GNU 官网只有源代码,没有预编译的可执行程序。Purdue University 的 RCS 官网倒是有一个旧版本的 Windows 平台的可执行程序。

CVS

  并发版本系统(Concurrent Versions System,CVS)是最初的第二代版本控制系统。大约十年间,它是最为流行的版本控制系统,直到 2000 年被 Subversion 所取代。CVS 的安装教程可以在其项目主页 上找到。

  由于 CVS 是集中式版本控制系统,所以它有客户端和服务端之区分。但要开始使用 CVS 的话,即使只在你的本地机器上使用,也必须设置 CVS 的服务端。

  CVS 最早是由一位名叫 Dick Grune 的荷兰科学家在 1986 年开发的,当时有一个编译器项目,他正在寻找一种能与其学生合作的方法。我在英文网站 http://dickgrune.com/Programs/CVS.orig/#History 中找到如下一段话:

I created CVS to be able to cooperate with my students, Erik Baalbergen and Maarten Waage, on the ACK (Amsterdam Compiler Kit) C compiler. The three of us had vastly different schedules (one student was a steady 9-5 worker, the other was irregular, and I could work on the project only in the evenings). Their project ran from July 1984 to August 1985. CVS was initially called cmt, for the obvious reason that it allowed us to commit versions independently.

  Grune 于 1986 年 6 月 23 日公开发布了该代码。CVS 最初仅仅只是一个包装了 RCS( 修订控制系统(Revision Control System)) 的 Shell 脚本集合。最终演变成当前版本的 CVS 的代码始于 1989 年 4 月的 Brian Berliner 的贡献,后来由 Jeff Polk 和许多其他贡献者提供帮助。

  Brian Berliner 撰写了一篇论文,介绍了他对 CVS 程序的改进 - 该程序描述了该工具是如何在 Prysma 内部扩展和使用的。 1990 年 11 月 19 日,CVS 1.0 版被提交给自由软件基金会进行开发和分发。关于 CVS 的使用可以参考这篇文章:https://zhuanlan.zhihu.com/p/51792519

SVN

  SVN(Subversion 的缩写)是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统。SVN 由 CollabNet 公司于 2000 年资助并发起开发,目的是创建一个更好用的版本控制系统以取代 CVS。

  2000 年 2 月,CollabNet 联系了 Open Source Development with CVS 的作者 Karl Fogel,问他是否愿意为这个新项目工作。这时 Karl 已经在和他的朋友 Jim Blandy 讨论一个新的版本控制系统的设计。他不仅已经起好了名字 “Subversion”,而且做了一些 Subvesion 的基本设计。

  经过 14 个月的编码,在 2001 年 8 月 31 号,Subversion 可以“自我寄生”了。就是说,Subversion 开发人员停止使用 CVS 管理 Subversion 的源代码,开始使用 Subversion 代替。

  2009 年 11 月,Subversion 被 Apache Incubator 项目所接收。2010 年 1 月,正式成为 Apache 软件基金会的一个顶级项目。项目地址:https://subversion.apache.org/,我们可以从中下载源代码、文档,没有预编译的可执行程序。

官方文档:https://svnbook.red-bean.com/

以下是几款常用的 SVN 客户端图形化软件:

  • TortoiseSVN:开源软件,在 Windows 上非常受到欢迎的一套客户端软件,它与资源管理器集成得相当不错,可以透过资源管理器在文件或目录上用鼠标右键的菜单完成 SVN 的操作。官方网站:http://tortoisesvn.net/
  • SnailSVN:Mac OS X 平台下类似 TortoiseSVN 的图形化 SVN 客户端,可自动标记文件状态,并通过右键菜单提供各种常用 SVN 功能。 网站:https://langui.net/snailsvn/
  • Ankhsvn:将 subversion 的操作集成进 Visual Studio 的 SVN 客户端软件。官方网站:http://ankhsvn.open.collab.net/
  • Subclipse:将 Subversion 的操作集成进 Eclipse 的 SVN 客户端软件。官方网站:http://subclipse.tigris.org/
  • SmartSVN:收费的 SVN 工具,同时支持 Mac、Linux、Windows。

VSS

  VSS 的全称为 Visual Source Safe,是美国微软公司出品的版本控制系统。兼容 Check out-Modify-Check in(独占工作模式)与 Copy-Modify-Merge(并行工作模式)。它也属于集中式版本控制系统。

  VSS 通常与微软公司的 Visual Studio 产品同时发布,并且高度集成。VSS 使用文件系统作为存储方式,每次版本变更时就需要大量地读写硬盘。这也是 VSS 最广受垢弊的缺点。VSS 2005 开始拥有 Web 访问功能,不再与 Visual Studio 同时发布。

  2008 年,微软发布了 Team Foundation Server 的项目生命期管理工具,以替代 VSS。其不仅仅包含版本控制系统,还包括一系列的项目生命期管理工具。此中使用的还是集中式版本控制系统。

  • Team Foundation Server:本地版本,用户安装使用!
  • Team Foundation Service:云端版本,使用微软账户登录!

  2019 年,微软发布了全新的 Azure DevOps Server。这不仅仅是个改名,整个软件的架构都进行了重新的调整!有了它,我们就可以使用一系列的项目生命期管理工具。版本控制系统仅仅是其中的一小部分。注意,其中的版本控制系统是基于 Git 的分布式版本控制系统。

  • Azure DevOps Server:本地版本,用户安装使用!是 Team Foundation Server 的升级版本。
  • Azure DevOps Service:云端版本,使用微软账户登录!是 Team Foundation Service 的升级版本。

BitKeeper

  BitKeeper是一套 BitMover 公司开发的分布式版本控制软件,最初作为一款专有软件发行。BitKeeper 是最初的分布式源代码控制系统。

BitKeeper 的许多概念取自 TeamWare(Larry McVoy 在 Sun 公司时开发的产品)。

  BitMover 公司 CEO Larry McVoy 与 Linus 曾是好友, Larry 说服 Linus 在内核开发中使用 BitKeeper。而 BitKeeper 在免费使用的许可证中加入很多限制条件,惹恼了内核开发者,最终促使 Linus 开发出了毁灭 BitKeeper 的 Git。

2016 年 5 月 11 日,BitKeeper 宣布以 Apache 2.0 许可证开源。

Mercurial

  Mercurial 是跨平台的分布式版本控制软件,主要由 Python 语言实现。Mercurial一开始的主要运行平台是 Linux,现在 Mercurial 已经移植到 Windows、Mac OS X 和大多数的类 Unix 系统中。

  Mercurial 主要由命令行程序组成,现在也有了图形用户界面。Mercurial 的创建者和主要开发人员是 Matt Mackal。其源代码采用 GNU 通用公共许可证第二版为授权,确保了 Mercurial 是一个自由软件。

Git

  在 Linux 开源的初期,Linux 开源项目的代码是 linus 本人通过 linux 命令 diffpatch 两条命令手动完成。随着 Linux 代码越来越壮大,靠 Linus 一个人来手动合并已经不现实。

  2002 年,Linus 选择了一个商业版本控制系统 BitKeeper 作为 Linux 内核的代码管理工具(BitKeeper 的开发商 BitMover 授权 linux 社区免费使用)。但是,免费使用是有很多的限制的,因此 linux 社区的大佬开始破解 BitKeeper。其中,samba 的作者 andrew 破解成功了。但是被 BitMover 公司发现,收回免费使用权。

  迫不得已,Linus 选择了自己开发一个分布式版本控制工具以替代 BitKeeper。传说,Linus 闭关一个月,写出了 Git。此后,Git 成功接管了 Linux 社区的版本控制工作,并且开始开源。维基百科中,有如下历史记录:

  在 2005 年 7 月 26 日,Linus 功成身退,将 Git 的维护交给另外一个 Git 的主要贡献者 Junio C Hamano。

在 Linus Torvalds 开发出 Git 分布式版本控制系统 11 年后的 2016 年,BitKeeper 宣布在 Apache 2.0 许可证下开源。

参考

  1. https://blog.51cto.com/12805107/2089757
  2. https://www.imooc.com/article/details/id/44217
  3. https://softwareengineering.stackexchange.com/questions/35074/im-a-subversion-geek-why-should-i-consider-or-not-consider-mercurial-or-git-or
  4. https://www.jianshu.com/p/a46f1cdada53
  5. https://gotgit.readthedocs.io/en/latest/index.html
  6. https://blog.csdn.net/qq_36647038/article/details/84022363
  7. http://www.worldhello.net/gotgit/

项目管理 之五 版本控制系统(CVS、SVN、BitKeeper、Git )概念、分类相关推荐

  1. 版本控制系统(SVN,Git)与项目托管平台(Github,Gitee,Coding)

    1.版本控制系统 版本控制系统(version control system)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于软件源代码的文本文件,而且 ...

  2. 在Eclipse 2.0中使用版本控制系统CVS

    董向辉 (xianghui.dong@mail.ia.ac.cn) 2002 年 7 月 2002年6月28日,Eclipse 2.0正式版已经正式完成,这将是Java开发工具历史上的一个重要事件,E ...

  3. 版本控制器:SVN和Git比较

    在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?今天在此详细记录下: SVN(Subversion)是集中式管理的版本控制器,而 ...

  4. (Git)了解Git(分布式版本控制系统)和安装Git步骤

    前言 日期:2020/04/25 心情:

  5. 分布式版本控制系统Git的安装与使用

    作业要求 1.(本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 2.  我的Github远程仓库地址: ht ...

  6. 版本控制工具(CVS、SVN、GIT)简介

    2019独角兽企业重金招聘Python工程师标准>>> 版本控制工具:  提供完备的版本管理功能,用于存储.追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基 ...

  7. GIT (分布式版本控制系统)

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. [1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版 ...

  8. Git分布式版本控制系统简介和使用

    Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.[1] Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本 ...

  9. 版本控制系统GIT文档

    版本控制系统GIT文档 李达 20180629 引用博客教程+实践总结 目录 1.     版本控制系统... 2 1.1.      简介... 2 1.2.      常见的版本控制器... 3 ...

最新文章

  1. 经典mysql 语句收录
  2. easyui 动态设置单元格控件_插入控件-gt;引用变量-gt;实现动态图表纵横筛选
  3. 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
  4. zookeeper 入门讲解实例 转
  5. mysql点击计数器_MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能...
  6. html动图放大太模糊怎么调,如何解决图片放大画质失真问题
  7. 2.1 使用ARDUINO控制MC20打电话
  8. MySQL中使用update更新替换某个字符串
  9. 大数据平台--调度系统
  10. SpringMVC form中commandName报错问题
  11. excel软件php函数,文员常用的excel函数
  12. #网络流24# 餐巾计划问题
  13. pdf、markdown、docx文件预览
  14. nginx配置静态页面html,nginx 服务器配置静态网页
  15. 数学模型 Lotka-Volterra
  16. Carsim 2019 安装后打不开 未响应 acquiring licence information
  17. Hugo作者、Go核心团队成员Steve Francia谈诞生13年的Go语言:生态系统、演化与未来[译]...
  18. python 遍历列表中的每个元素 for循环 while循环 迭代器
  19. xp计算机无法远程桌面连接,XP sp3系统下远程桌面不能连接到指定计算机的解决方案...
  20. comsol学习总结-------热

热门文章

  1. 赞奇科技与欧特克达成合作
  2. Java往文件里写入字符串_Java将字符串写入文本文件代码示例
  3. Tensorflow版本升级出现的sess.run运行错误
  4. 机器学习随笔(拾人牙慧)
  5. SDN解决方案创业公司大河云联完成5000万元A轮融资
  6. Keycloak 入门使用第一篇
  7. HTML5页面布局基础
  8. [转]iOS hybrid App 的实现原理及性能监测
  9. PowerShell攻击指南
  10. 我学会了最难的编程语言,却被小小英语斩于马下