版本管理三国志 (CVS, Subversion, git)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

最近有一则和git有关的新闻很火:

12306的抢票插件拖垮了GitHub (GitHub基于git)

git是一款版本控制软件(VCS,Version Control System)。VCS通常用于管理开发过程中的源代码文件。VCS是软件开发的好帮手。当软件本身在发布时获取大量关注时,VCS躲在幕后默默管理和记录软件的开发和发布进程。git颇有戏剧性的借春运抢票火了一把,也让许多人好奇什么是git,什么是VCS。我复习了一下VCS的历史,忽然有些读三国时的你方唱罢我登场的感觉,就想写一个VCS版本的三国志。

现在最常见的VCS软件(同时也是开源的VCS软件)有CVS, Subversion和git。CVS曾经雄霸一时,至今还管理着大量的开发项目。Subversion青出于蓝,对CVS进行改进,大有取而代之的势头。git另辟蹊径,依仗Linux的名号,并借GitHub的推广攻城略地。VCS领域激烈的争斗正反映了软件开发项目的红火势头。

 

斩白蛇而起

早期(1970年到1980年代)的软件开发大部分是愉快的个人创作。比如UNIX下的sed是L. E. McMahon写的,Python的第一个编译器是Guido写的,Linux最初的内核是Linus写的 (好吧,awk是个例外,它的名字是三位作者的首字母,但也只是三个人)。这些程序员可以用手工的方式进行备份,并以注释或者新建文本文件来记录变动。

正如现在普通用户常做的,当时的程序员常用cp备份:

$cp dev.c dev.bak

更有条理一些的程序员会加上一个时间标记,比如:

$cp dev.c dev.bak.19890908

程序员很可能会用vi创建一个LOG文件来做日志:

1989-09-08 02:00:00
Old input method is stupid
Add command-line input function

在一个版本发布的时候,程序员可能做一个tar归档,将所有的文件归为同一个.tar文件。

$tar -cf project_v1.0.tar project

上面的工具构成了一套人工VCS。上面的这套组合也非常符合UNIX的模块化理念:让每个应用专注于一个小的功能,使用者根据需要,将这些功能连接起来。你还可以写一个shell脚本,将上面的功能都写在里面。当需要的时候,调用该脚本就可以了。

(这样一个shell脚本并不复杂,而且挺有用的,可以作为学习shell编程的小练习)

 

再说一下早期的合作开发模式。如在Python简史中看到的,Guido通过电子邮件接收补丁(patch),并将补丁应用到原来的代码文件。实际上,一个补丁(patch)的主要功能是描述两个文件的改变(change, or file delta)。 假设我们有两个文件a.c和b.c内容分别为:
a.c (有bug的代码)

int sum(int a, int b)
{
  int c;
  c = a + 1;
  return c;
} 

b.c (修正后的代码)

int sum(int a, int b)
{
  int c;
  c = a + b;
  return c;
}

 

在UNIX系统下,运行

$diff a b > iss01.patch

iss01.patch就是一个补丁文件,它看起来如下

上一篇:转载~ 耐思尼克 : 多域名绑定一个空间的方法


下一篇:迁移数据库到SQL on Linux Docker