作者: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就是一个补丁文件,它看起来如下