Git 誕生記
Git 誕生記
你可能有過這樣的經歷:在 debug 的時候這里加一句,那里減一句,順便改改參數,不一會你的程序就從一個 bug 增加到了無數個 bug 。最重要的是,你完全想不起來自己到底改了幾個地方,原來的程序到底長什么樣子了。經歷過幾次這樣的痛苦,你學乖了,下次 debug 之前先把原文件備份一下——改成 program.c.bak 什么的,然后放開了膽子改。有時候修改的次數多了,就會出現 program_V1.c.bak, program_V2.c.bak …… 又有時候需要同時修改多個文件。而需要倒回到之前的版本的時候,又完全想不起來這些 V1, V2 到底改了哪些地方。坑爹吶!難道要老子手工查不成?難道老子還要給每個 version 寫個描述文件?
程序員們應該都中槍了。
或者你有過這樣的經歷:寫論文的時候這里改動一個詞,那里改動一句話。改來改去發現還不如最初的版本……囧之余,你怎么辦?Ctrl+Z 能救你幾次?甚至,萬一是第二天打開 Word 的時候后悔了,又怎么辦?
學生黨們應該都中槍了。
有沒有辦法解決問題?當然有。但是別著急,喝杯茶,我們慢慢聊。
1972年的時候,貝爾實驗室的程序員們快被這個問題煩死了。可能純粹出于提升工作舒適度,他們寫出了史上第一個版本控制系統(Version Control System A.K.A. VCS),取了個直白的名字叫 Source Code Control System,簡稱 SCCS。這個軟件用 C 語言改寫后,被收錄在 AT&T 的系統中。由于太懶了,這群程序員們只寫了 Unix 版本。
SCCS 的原理很簡單,儲存要監控的源文件,當文件被修改時,它自動地為每次修改創建一個快照(Snapshot)。你工作的時候,想切換到哪個版本,它就先取出源文件,再依次應用修改直到你要的那個版本為止。
SCCS 好用是好用,但有幾個問題。首先,當你對文件作出多次、大量修改后,它的速度明顯變慢了——對啊,它要從原文件開始依次應用修改嘛。然后,它內置在 AT&T 生產的系統中,不能跨平臺啊,廣大 Windows 用戶很不開心啊。
這其中 Water.F.Tichy 估計是最不開心的一個。
Water 是一個教計算機的大學教授,學校里的電腦上有 AT&T 的系統,可是到家就沒轍了,老爺子很不爽啊,這叫人家在家怎么刻苦呢?1982年,他一氣之下,寫出了改變歷史的第二個被廣泛應用的 VCS,取名 Revision Control System,也就是大家熟知的 RCS(誰熟知了?誰?)。
從名字上就能看出,老爺子雄心很大,不想讓它僅僅成為程序員們的玩具。RCS 開源,跨平臺,一經推出即在全球……的程序員,和大學中流行。它相比于 SCCS 更快。為什么?因為老爺子機智地換了一個想法,儲存最近的文件作為源文件,對歷史修改反向,并且創建快照(Snapshot)。對呀,正常人工作肯定是從最新的文件開始讀取,出現問題后再回滾到歷史文件,誰沒事就從第一版開始改起啊, SCCS 那種做法也太二了吧?
于是 RCS 開始統治江湖。漸漸地,程序員們又不高興了,說你這個 RCS 也不科學呀,你每次都只能監控單個文件,老爺子你寫個論文什么的倒是還行,可是我們是要寫整個項目的呀,我項目中每個文件是有關聯的呀,你這個單一文件監控不好使呀。被 RCS 折磨了四年之后,程序員們終于忍不了了,不知是哪路豪杰在開源社區吼了一聲,一呼百應,不一會兒(哪有那么快!),新的 VCS 誕生了——Concurrent Versions System(A.K.A. CVS)。
CVS 不能不說是革命性的成果,它不但支持了對整個項目進行監控,并且首次提出了倉庫(Repository)的概念,更加不能忍的是,它明確地分成了服務端和客戶端,把代碼倉庫放在服務器上,由客戶端向服務端提交修改。這還是 1986 年啊同學們,我真想回滾到那個時候激動地告訴他們:小伙子們(為什么是小伙子們……)你們發明的這種概念叫「云」你們造嗎?「云」在二十多年以后有多火你們造嗎?
CVS 很好地支持了多用戶多文件并行操作,按說這樣一來所有人應該都滿意了吧?當然不是,不然今天講的就是 CVS 而不是 Git 了。它的問題是監控的對象是文件,而不是目錄。乍聽起來,覺得好像沒什么呀。其實不然,仔細想想,如果在項目目錄下再創建目錄,這個子目錄里面的文件并不會被監控;同理,添加一個新文件,這個新文件也不會被監控。
程序員們又不開心了。
終于到了21世紀,一個跨時代的 VCS 出現了—— Subversion(A.K.A. SVN)。它由 CollabNet 公司開發,并且在后來被納入了 Apache 軟件項目孵化器(Apache Incubator),成為其中 top-level 的產品。它不但支持監控整個目錄,而且首次支持了監控非文本文件。這兩個特性使它在 2001 年在全球范圍內取代了 CVS,并且一直流行到今天。沒錯,現在許多軟件公司用的版本控制系統還是 SVN。
咦,說好的 Git 呢?
這就不得不提到同時代的另一款 CVS —— BitKeeper。與 SVN 不同,它是一款商業軟件,但提供了免費的社區版本(Community Version)。它最大的優點在于,分布式管理。在 SVN 中,服務端相當于代碼中心,所有的代碼都提交到這里。它兩點不方便的地方在于,客戶端要不斷地和服務端進行交互以保證自己的代碼是最新的,如果自己從一個比較舊的版本開始修改,就會出現問題。而且與服務端的交互要求網絡連接,不適合離線工作。分布式管理的概念是每個倉庫都是主倉庫,當兩個倉庫版本不一致時,可以方便地查看沖突之處并加以修改。
使得 BitKeeper 如此出名的原因還在于,大名鼎鼎的 Linux Kernel 就存放在其免費的社區版本上。
2005年4月,BitMover(擁有 BitKeeper 的那家公司)突然宣布,停止 BitKeeper 的社區版本,你們這群不想交錢就用我們軟件人都玩蛋去!好嘛,改變了人類歷史的 Linux 就這樣無家可歸了。
Linux 之父 Linus 看著自己的兒子被別人趕出了家門,憤怒值立刻飆升。他環繞四周看了看,覺得 SVN 什么的簡直是屎,決不能允許親兒子流落至此。兩斤啤酒下肚,他沖到電腦前三天三夜不眠不休。
Bang!Git 誕生了。
什么?你說 BitKeeper ?玩蛋去吧。