• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 什么是版本控制?

    版本控制(Version Control)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统(Version Control System)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。用的比较多的如 svn,git 等。

    版本控制是管理信息修改的艺术,他是一个开发者最重要的工具之一,由于开发者经常性的修改代码,如果不做出一定的版本控制仅靠注释掉或者备份的形式进行,那么在经过一段时间后,先不说是否能记住更改的地方,能不能还原到想要的版本都是非常困难的。想象一下,一个高达几十上百人的开发团队并行进行工作,需要经常性的同时处理同一个文件,如果没有一定的版本控制机制,将会是怎样的混乱情况。软件开发工作往往是多人协同作业,版本控制系统可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。

    版本控制历史

    本地版本控制系统

    第一代版本控制系统被称为本地版本控制系统。通过加锁将并发执行转换成顺序执行。一次只能有一个人处理文件。具体流程如下:首先,应该把文件放在一个服务器上,方便使用者上传或下载文件;其次,任何人想对文件修改时,需要先把这个文件加锁,通过checkout指令,使得其他人无法修改;最后,当修改完成之后,需要释放锁,通过checkin指令,形成一个新的版本,存放到服务器端。

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


    集中式版本控制系统

    第二代版本控制系统被称为集中式版本控制系统(Centralized Version Control Systems,CVCS),其对同步修改更加宽容,但有一个明显的限制,用户必须在允许提交之前将当前修订合并到他们的工作中。集中式版本控制系统顾名思义,其版本库是集中存放在中央服务器的,需要协同工作的人通过本地客户端连接到中央服务器之后获取最新的软件版本,当进行一定的修改后便可以提交更新。

    在集中式版本控制系统中,对于项目的管理是依赖于服务器中的中心仓库。如果服务器上中心仓库宕机,所有人都无法工作。集中式版本控制系统必须联网才能工作,这个特性在局域网中速度很快,但是在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟。

    第二代版本控制系统主要有:SVNCVSSourceSafeSubversionTeam Foundation ServerSVK


    分布式式版本控制系统

    第三代版本控制系统被称为分布式式版本控制系统(Distributed Version Control Systems,DVCS),又称去中心化版本控制(decentralized version control),在分布式版本控制系统(DVCS)中,每一个开发者都同时拥有一个用于当前文件操作的工作区与一个用于存储该项目所有版本、分支以及标签的本地版本库。每个开发者的修改都会被载入成一次次的新版本提交,首先提交到本地版本库中。然后,其他开发者就会立即看到新的版本。通过 pull 和 push 命令,我们可以将这些修改从一个版本库传送到另一个版本库中。在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用。

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

    第三代版本控制系统主要有GitBazaarMercurialBitKeeperMonotone


    集中式与分布式版本控制系统的比较

    分布式版本控制系统用点对点网络的作法来处理版本控制,而集中式版本控制系统则是用主从式架构的作法。分布式版本控制系统同步各软件存储库的方式是用点对点网络的方式发送 Patch。在代码库中没有单一的中央版本,每一个用户都有工作副本以及完整的变更历史。

    分布式版本控制

    分布式版本控制系统的优点:

    • 用户在没有网络的情形下,也可以访问其电脑中的软件存储库。
    • 不需要和中央服务器通信即可达成提交、切换分支、合并等操作,因此速度很快。只有要和其他人分享变更内容时才需要通信。
    • 允许个人作业,用户可以将不希望公开的早期修改(甚至是草稿)上传。
    • 工作副本的作用类似远程备份,因此不会依赖单一的实体机器,带来单点失效的风险。
    • 允许不同的开发模型,例如用分支或 Commander/Lieutenant 模型。
    • 在自由及开放源代码软件项目中,若有管理上的冲突或是设计上的不一定,很容易可以从一项目中分叉出新的项目。

    分布式版本控制系统的缺点:

    • 一开始复制软件存储库会比较慢,因为默认设值会复制所有的分支以及版本历史。
    • 缺乏了集中式版本控制系统中有的锁定机能,针对一些无法用版本控制系统合并的二进制文件(例如图形档),或是太复杂的二进制或 XML 文件。
    • 每一个用户都需要备份所有的资料、分支及版本历史,因此需要额外的存储空间。
    • 各软件存储库内容不一定同步。


    集中式版本控制

    集中式版本控制系统的优点:

    • 操作简单,使用没有难度,可轻松上手。
    • 文件夹级权限控制,权限控制粒度小。
    • 对客户端配置要求不高,无需存储全套代码。

    集中式版本控制系统的缺点:

    • 网络环境要求高,相关人员必须联网才能工作。
    • 中央服务器的单点故障影响全局,如果服务器宕机,所有人都无法工作。
    • 中央服务器在没有备份的情况下,磁盘一旦被损坏,将丢失所有数据。

    下篇:什么是 Git?