版本控制工具历史的10个里程碑

导读:作者Eric Raymond在flourish上发表的一篇《Astonishments, ten, in the history of version control》,文中总结了版本控制工具的重要10个里程碑,一起与开发者分享下。

如果你想要了解真正的历史,你需要回到在打孔卡上进行人工比对的年代。” —— Jim Rootham

在这个为鳕鱼编写传记都能够流行的年代,写一本记录程序员如何存储代码——他们最重要的劳动成果的书一点也不疯狂。

既然你和我都没有时间来阅读或编写这样的一本书,我们打算用这篇博客来进行探讨。

这是一个重要的问题。

(现在)版本控制产品非常普通而且很流行。然而,它经历了几十年的不断创新。在这个领域里最聪明的人的努力下,代码管理变得非常简单而且有效。

每一步都是那么让人感到惊奇。

1. 源代码就是一个文本文件!(20世纪60年代)

现在看来,存储源代码和编写简单文档应该是一样的。但如果你简单读一下ASCII的历史就会知道,即使达成这样的共识也来之不易。

2. 人们可以手动跟踪代码版本!(20世纪60年代)

在没有软件的年代,所有事情都要从源代码开始。

“我工作的第一家公司有一个源码管理部门。当你把代码写好以后,将软盘交给源码管理部门一位漂亮女士。他们会及时更新函数库,用你的磁盘基于公司官方的代码构建产品交付给客户。” ——  Miles Duke

3. 你可以为单个文件保留多个版本!(1972,1978)

采用奇特的交错编织文件格式,SCCS在版本控制领域称雄了10年之久。

记录单个文件的从一个版本到下一个之间的变化花费了几年的时间。“差异文件比较算法”是这个课题最近发表的一篇论文(1976)。

1982年,RCS反向使用diff文件(描述算法原文)打败了SCCS成为继任者,并让评论家大跌眼镜:

“一起出现的还有带有反向比较功能的RCS,我认为它非常棒。” —— 无名氏

4. 每个人都可以检出自己的拷贝!(1982)

在那个时候,人们工作时需要登录一台中央大型机并通过它一起工作。采用符号链接,RCS可以让每个人都工作在相同版本的代码上,而且每个人都有自己的工作拷贝。

“有一个叫做RCS的文件,实际上它十一个链接到RCS仓库的符号链接,你可以与其他小组成员一起使用。”  —— 耶鲁大学RCS使用介绍

5. 喔!你可以一次给多个文件进行版本控制!(1986)

令人吃惊的是,直到CVS出现之前,版本控制系统都只支持单个文件。当然,你可以使用通配符让RCS提交多个文件或者标记特定分支。但这些并不是版本控制系统的一部分。

CVS默认会递归修改所有文件。突然之间,软件从单个目录或文件变成了文本文件的递归树。

虽然由于不具备“原子性”导致实现的产品不尽如人意(后来Subversion在2000年解决了这个问题),但是瑕不掩瑜。

6. 两个人可以同时编辑同一个文件,并将他们的工作合并在一起!(1986)

20世纪90年代末,我在Creature Labs工作。我们从Visual SourceSafe(商业软件,微软公司发布)转到CVS(开源软件,由一些嘻皮士发布)。

坦率的讲,大家都怀疑CVS能否做到它宣称的那样:让多个人同时编辑同一个文件,并将他们的修改没有错误地合并到一起而不造成其他问题。

在我们开发Creatures 3的时候,SourceSafe的互斥锁成为了一个大问题。我们当时要添加垃圾搜集功能,这个功能会影响到几乎所有的代码。这个时候,我们的首席程序员不得不在周末检出每一个文件然后进行修改。

1986年的这篇论文记录下了这个奇迹。当Dick Grune和他的团队在荷兰开发一个编译器的时候,他们遇到了同样的问题,CVS从此应运而生。

7. 可以在远程服务器上共享代码仓库!(1994)

大多数时候,人们只在一台机器上使用版本控制。在1986年,人们可以通过RCS的一些版本以及CVS提供的远程文件共享机制以拥有远程代码仓库。

“假如RCS的某个版本可以通过远程服务器访问,那么开发人员就可以在代码仓库之外的机器上进行开发了。”  —— Dick Grune

然而,直到1994年TCP/IP协议的引入,这个想法才得以起步。

“直到Cygnus软件的Jim Blandy和Karl Fogel(这两位后来成为Subversion项目的主要开发者)为CVS发布了一些补丁,使得CVS客户端软件可以通过远程TCP/IP连接进行访问,CVS才真正变得无处不在。 ”—— Eric Raymond

8. 免费的开源版本控制主机服务!(1999)

这并不是源码管理技术的进步,但这的确是一个标志,Internet社区的发展与技术的进步同等重要:

“OSS以及成为历史,这已经成为一种趋势。John T. Hall 预见到,如果项目都是在线开发,那么之前开发的版本就在那里。开发平台服务是一种创新,但是没有人去做,我们就想‘为什么不呢?’”—— Brian Biles

就像末日狂欢那样(因为股票的原因),VA Linux把SourceForge带到了这个世界上。这对新项目是天大的好消息(例如我的TortoiseCVS)。

在当时,在Internet上获得一台服务器很困难而且非常昂贵,进行源码管理和bug追踪也是如此。这项新服务尽管缺乏商业模式,却让无数项目更早地面世。(译注:OSS:一个综合的业务运营和管理平台,同时也是真正融合了传统IP数据业务与移动增值业务的综合管理平台。)

9. 没有主代码库,你可以向所有人发布!(2005)

在21世纪头10年,有一股将版本控制实现完全分布式的潮流。

也就是说,在你本地的机器上存放的是一份完整的代码历史,可以轻易地与任何其他拷贝进行分支和合并。顺带说一下,也正是这个特性使得分支和合并变得更加容易。

我并没有记录某个第一次发明这种工具,而是按照它产品化以及流行的时间进行统计。鉴于此,将它定在2005年似乎有些不公平。Mercurial和Git发布于2005年4月。

这篇“分布式版本控制风险”(2005年底)介绍了这个革命性的创新。

10. 当你检出一个fork,你可以让大家都看到!(2008)

GitHub的成功有很多原因(尽管我之前提到过一些,要讲清楚这个问题还是需要单独写一篇文章讨论)。

关键在于,你可能甚至可以将一些自己做的不大的改动提交到别人的公共代码上。在GitHub之前,一般我们会保存在自己的电脑上。

如今,只需要简单做一个fork,或者甚至可以直接在浏览器上编辑,这样任何人都可以马上发现你代码中的bug。

尾声

快速回顾一下这几十年的进展。是的,计算机的发展做出了贡献。但更主要的是,这些都是人们为更好地协作而贡献出的聪明才智。这让我想到,下一个会是什么?在版本控制领域还会有什么令人惊叹的事情发生?

推而广之,同样的事情会在其它领域发生吗?作为核心信息基础设施,这种巨大的改进能够最终改善政府、医疗、新闻或者数据领域创新的障碍吗?

我有这种感觉,我们就要找到答案了。

文章出自:flourish

译文出自:伯乐在线


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php把语音转成帧,[转载]用TCP/IP实现自己简单的应用程序协议:成帧器部分

在前面《字节和字符,对信息进行编码》,《Socket>流,TCP连接,TCP可靠性概述》一系列的随笔中我们已经表述了相应的理论知识,现在可以动手实现一个自己的应用程序协议。将 数据转换成在线路上传输的字节序列只完成了一半的工作,在…

实体联系图简介

通常,使用实体联系图(entity relationship diagram)来建立数据模型。可以把实体联系图简称为ER图,相应地可把用ER图描绘的数据模型称为ER模型。 ER图中包含了实体(即数据对象)、关系和属性3种基本成分,通常用矩形框代表实体,用连…

Flask爱家租房--城区信息

0.效果展示 城市列表使用缓存的过程 1.后端代码 # coding:utf-8from . import api from flask import g, current_app, jsonify, request, session from ihome.utils.response_code import RET from ihome.models import Area, House, Facility, HouseImage, User, Order from …

数值计算算法-多项式插值算法的实现与分析

数值计算是指在数值分析领域中的算法。数值分析是专门研究和数字以及近似值相关的数据问题,数值计算在数值分析的研究中发挥了特别重要的作用。 多项式插值是计算函数近似值的一种方法。其中函数值仅在几个点上已知。 该算法的基础是建立级数小于等于n的一个插值多项…

HIVE ORC 报错ClassCastException

HIVE ORC格式的表查询报错 Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.BinaryComparable 建表语句如下: CREATE EXTERNAL TABLE test_orc( te…

程序型语言VS.编译型语言

导读:每日[快讯精选]是由CSDN研发频道推出的特色栏目,每一天我们将从国外技术媒体(例如Hacker News、Reddit...等等)中挑选出有价值的新闻简讯,让您在第一时间掌握业界主流的技术文摘,每天清晨为您献上第一份技术早餐。 [1]程序型…

ancestral 箭头符号,译林版《牛津高中英语》模块五 高二上学期

《牛津英语》由译林出版社和牛津大学出版社联合编写出版。通过在南京和苏州开始的试用,取得了非常良好的效果,己在省内全面推广。有人认为新教材在教育观念和编排体系上的改革力度是八十年代以来最大的一次。它带给我们一线教师的冲击无疑是巨大的。二、…

[NOI2012]骑行川藏

题解: 我发现拉格朗日乘数法真是个好东西。。 我是不会说我数学竞赛求最值都是用这个东西的 由于我不太会打那个符号就用li代表通常偏导数中的lanmuda 。。。 这题里化简一下就可以得到 2 li * ki * ​(vi​−vi′​)* vi^2​1 然后一旦li确定 我们会发现这个三次函…

MAC地址和IP地址的关系

简单地说:ip地址是服务商给你的,mac地址是你的网卡物理地址。 一、IP地址 对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址。IP地址由用点分隔开的4个8八位组构成,如192.168.0.1就是一个IP地址…

Linux中断 - tasklet

一、前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做bottom half,。具体…

数字电视制播设备间的文件交换格式

在现今的数字电视演播室中,设备之间基本上采用信号流连接方式,如SDI、STDI、模拟YUV、VBS等信号流。在非线性编辑系统和播出系统与服务器之间的连接,还有基于MPEG-2传输流等的信号连接方式。基于信号流连接方式的主要特点是,传送时…

oracle 位移运算符,Oracle“(+)”运算符

在Oracle中,()表示JOIN中的“可选”表。 所以在你的查询中,select a.id, b.id, a.col_2, b.col_2, ... from a,b where a.idb.id()这是一个左外加B表与一个表。 就像现代的左连接查询一样。 (它将返回a表的所有数据,而不会丢失在另一边的数据…

JAVA-数据类型-复习

JAVA-数据类型-复习 Java中,一共有8种数据类型,4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char,1种布尔类型。 整型 类型存储需求(字节)一个字节包含8个位取值范围byte1-12…

什么是实体-联系图(ER图)

实体-联系图(ER图)数据模型中包含3种相互关联的信息:数据对象、数据对象的属性及数据对象彼此间相互连接的关系。 1.数据对象 数据对象是对软件必须理解的复合信息的抽象。所谓符合信息是指具有一系列不同性质或属性的事物,仅有单…

记录的习惯

记录的习惯 书籍是人类进步的阶梯,承载了人类文明进步的历程。大多数人都写过日记,但不知道有多少人重视过日记。常常我们会用相机记录一些生活中的场景,然后收藏起来,等到若干年后再拿出来看,总能感觉到很温馨很美好。…

php 去掉实体,用PHP删除除5个预定义HTML实体之外的所有实体的最佳方法-用于XHTML5输出...

我目前正在尝试提供XHTML5.目前,我在正在处理的页面上提供XHTML 1.1 Strict.那就是我为有能力的浏览器所做的.对于那些不接受XML编码数据的人,我会严格遵循HTML4.1.在尝试使用HTML5进行试验时,以HTML5格式交付时,所有功能或多或少都可以按预期工作.但是,作为XHTML5交付时,我遇到…

Flask爱家租房--发布新房源(保存房屋基本信息)

0.页面展示效果 1.后端代码 api.route("/houses/info", methods["POST"]) login_required def save_house_info():"""保存房屋的基本信息前端发送过来的json数据{"title":"","price":"","ar…

今后最有前途的媒体格式 MXF

MXF格式已经被推出几年了,从当初一个陌生的不为人们重视的格式逐渐获得了业内人士的认知和认可,现如今正被广泛应用于广播电视与后期制作领域,且有不断扩大之势,松下公司推出的基于PII卡的无磁带式标清摄像机,它所采用…

【c#】RabbitMQ学习文档(一)Hello World

一、简介 RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到邮筒之时,你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里,不…