版本控制简介📣


什么是版本控制🤔

在这里插入图片描述
  版本控制是管理信息修改的艺术,他是一个开发者最重要的工具之一,由于开发者经常性的修改代码,如果不做出一定的版本控制仅靠注释掉或者备份的形式进行,那么在经过一段时间后,先不说是否能记住更改的地方,能不能还原到想要的版本都是非常困难的。想象一下,一个高达几十上百人的开发团队并行进行工作,需要经常性的同时处理同一个文件,如果没有一定的版本控制机制,将会是怎样的混乱情况。

  软件开发工作往往是多人协同作业,版本控制系统可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。


版本控制的好处🎨

1. 优雅的备份👍

  在进行软件开发时或者一些需要不断迭代的文档编写时出现下图这种情况,不仅占用磁盘空间,而且难以进行管理,很难知道每个版本进行哪些修改,另外若是在关键时刻电脑突然死机,这将是灾难性的,所以一个优雅的备份方式很重要。

在这里插入图片描述
  备份是一个版本控制系统(例如 Git)提供的非常好的附带功能。每一个团队成员都会在他的本地有一个完整的项目副本,包括整个项目的历史记录。如果你所依赖的服务器宕机了,或者是你的存储硬盘坏,所有你需要的恢复文件都可以在另外的团队成员的 Git 本地仓库中得到,版本控制系统还会对每个版本进行一定的说明(前提是提交者具有很好的提交习惯),可以根据提交说明知道当前版本较之前的版本有何更改,当然他还提供对比功能,可以对文件进行对比,更加清楚的知道修改的地方。

2. 多人并行开发👍

  由于编程的性质,在同一个项目中与其他编码人员一起工作有时可能是一场真正的噩梦。试想一下,如果没有版本控制系统,当你需要处理那些共享文件夹中的文件时,你必须告知办公室里的所有人,你正在对哪些文件进行编辑;与此同时,其他人必须要避免与操作相同的文件。这是一个完全错误且不现实的流程。当你花了很长时间完成你的编辑后,可能这些文件早已经被团队里的其他开发成员修改或者删除了。如果使用了版本控制系统,每一个团队成员都可以在任何时间对任何文件毫无顾虑的进行修改,版本控制系统可以把之后所有的改动合并成一个共同的版本,不论是一个文件还是整个项目。这个共同的中心平台就是我们的版本控制系统。
  使用版本控制工具,创建分支以确保一名工程师所做的更改不会受到当时另一名程序员工作的影响。 此外,版本控制系统允许在每次更改时提供注释。 当需要将工作合并在一起时,由于每位工程师所做的有据可查的更改,集成得到了简化。

在这里插入图片描述

3. 了解发生了什么👍

  每当你提交一次对项目新的改动时,你的版本管理系统会要求你添加一个对这次改动的简短描述。除此之外(如果是一个代码或者文本文件),你还可以看到一个改动前和改动后的内容的详细对照。这样也可以帮助你很好地了解多个版本之间的发展关系。


版本控制系统分类🎃

1.集中式版本控制系统📷

  集中式版本控制系统顾名思义,其版本库是集中存放在中央服务器的,需要协同工作的人通过本地客户端连接到中央服务器之后获取最新的软件版本,当进行一定的修改后便可以提交更新。

  集中式版本控制系统必须联网才能工作,这个特性在局域网中速度很快,但是在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟。

在这里插入图片描述

集中式版本控制系统

2. 分布式版本控制系统🧫

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

在这里插入图片描述

分布式版本控制系统

3. 集中式分布式版本控制系统的比较🌎

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

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

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

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

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

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

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

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

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

版本控制软件有哪些🎆

RCS✨

  RCS是一款早期的版本控制系统。它可以被认为是一组允许多个用户开发和维护程序代码或文档的UNIX命令。使用RCS后,用户可以修订文档制成自己的版本,提交更改,然后汇总起来。RCS最初是为程序所开发,但它对于经常修改的文本或配置文件也很有用。

优点

  • 结构简单,易于使用。
  • 修订版本不依赖于中央存储库。

缺点

  • 从某种意义上说,安全性很小,用户可以编辑版本历史记录。
  • 一次只能有一个用户处理文件。

CVS🍛

  CVS 即协作控制系统(Oncurrent Versions System)或并发版本系统,是一种版本控制系统,方便软件的开发和用户协同工作。CVS使用简单,是中央管理的版本工具,但是当服务器连接不上时工作将无法进行。

优点

  • 它工作方式特殊,可以使多个用户并行工作。这样对于正在编写软件的项目团体有利

缺点

  • CVS只允许存储文件。

在这里插入图片描述

CVS Logo

SVN🍿

  SVN(Apache Subversion)是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。

优点

  • 管理方便,逻辑明确,符合一般人思维习惯。
  • 易于管理,集中式服务器更能保证安全性。
  • 代码一致性非常高。
  • 适合开发人数不多的项目开发。

缺点

  • 服务器压力太大,数据库容量暴增。
  • 如果不能连接到服务器,提交,还原,对比等操作不能进行。
  • 不适合开源开发。

SVN

SVN Logo

Git🍓

  Git 是一款免费的、开源的、分布式的版本控制系统。分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

  Git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。

优点

  • 简单易用,同时保留现存文件的访问权限和网络访问权限。
  • 版本库本地化,支持离线提交,相对独立不影响协同开发。
  • 支持快速切换分支方便合并,比较合并性能好。
  • 分布式版本库,无单点故障,内容完整性好。
  • 采用分布式容错网络架构。
  • 针对快速提交和检出进行了优化。
  • 通过使用不可变日志实现非破坏性更新。

缺点

  • 对于大型的二进制文件支持稍弱。
  • 有一定的学习门槛。
  • 不符合常规思维。
  • 没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制。

在这里插入图片描述

Git Logo

版本控制常用术语🎡

基线(Baseline)

  基线是软件文档或源码(或其它产出物)的一个稳定版本,它是进一步开发的基础。

文件库(Repository)

  存储文件的新版本还有历史资料的地方,通常是在服务器上。有时候也叫Depot(像是在SVK、AccuRev还有Perforce中)。

工作复本(Working copy)

  从文件库中取出一个本地端(客户端)的复制,针对一个特定的时间或是版本。所有在文件库中的文件更动,都是从一个工作版本中修改而来的,这也是这名称的由来。观念上,这是一个沙盒。

提交(Commit)

  将本地端的修改送回文件库。(由版本控制软件处理“跟上次更动相比,哪个文件又被更动”的事)。

变更(Change)

  对一份文件作的特定更动。

变更记录(Change List)
取出(Check-Out)

  从文件库取出文件到本地端(客户端)。

更新(Update)

  将文件库的修改送到本地端(与提交相反)。

合并(Merge / Integration)

  合并各个改变。

版次(Revision)

  一个revision或version指的是一系列版本变迁的其中之一。

导入(Import)
导出(Export)
冲突(Conflict)

  当两方更动同一份文件会发生冲突。


🍥Git及SVN版本控制器的安装与使用可参考 Git与SVN版本控制软件的安装

☕SVN版本控制器的使用可参考 SVN版本控制系统的使用

🍓Git版本控制器的使用可参考 Git版本控制系统的使用

📣
🍳

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐