十年前的這一周,linux 內(nèi)核社區(qū)面臨一個根本性的挑戰(zhàn):他們不再能夠使用他們的修復(fù)控制系統(tǒng):BitKeeper,同時其他的軟件配置管理遇到了對分布式系統(tǒng)的新需求。Linus Torvalds,Linux的創(chuàng)始人,將這個挑戰(zhàn)接手并消失了數(shù)周,創(chuàng)造了 Git 工具。今天 Git 被用于成千上萬個工程,并且在程序員社區(qū)中掀起了一個新的社會化編碼的浪潮。
為了慶祝這一里程碑,我們請 Linus 去分享 Git 的幕后故事,并且告訴我們這個工程隊軟件開發(fā)的影響。你會發(fā)現(xiàn)他在這個故事背后的的評論。我們跟隨者Q&A追尋Git的軌跡,同時我們?yōu)槠渌墓こ桃裁枥L了輪廓。去查找KVM,Qt,Drupal,Puppet和wine背后的故事吧
為什么開發(fā)Git?
Torvalds: 我其實根本不想做源碼管理,我認為源碼管理是計算機領(lǐng)域最無趣的事(可能數(shù)據(jù)庫更無趣 ;^)。我對SCM(源碼管理工具)感到憤怒。但是BitKeeper的出現(xiàn)讓我重新認識了源碼管理。BK (BitKeeper)大多數(shù)都是正確的,但有本地副本的存儲庫與分布式合并是一個大問題。分布式源碼管理的一個主要問題是源碼管理的分離——誰才可以提交改變。BK展示了如何通過每個人都有源碼庫來避開這個問題。但是BK也有自己的問題:幾種技術(shù)導(dǎo)制了這種問題(惱火的重命名),但最大的問題是它不開源,這讓很多人不愿意使用它。因此,當(dāng)我們以幾個核心的維護使用BK而告終——它們是免費使用的開源項目——但它們無處不在。BK幫助了內(nèi)核開發(fā)者,但是它還是有痛點。
當(dāng)Tridge (Andrew Tridgell)對(相當(dāng)簡單的) BK 協(xié)議進行逆向工程–這是有悖于BK的使用規(guī)則的–的時候,事情到了不得不解決的地步。 我花了幾個星期(幾個月?我覺得是那樣)在Tridge 和 Larry McVoy之間做調(diào)解,但是到最后,明顯不起任何作用。于是,從那個時刻起,我決定不再繼續(xù)使用BK,也不愿重回使用BK之前的糟透了的日子。同時,令人遺憾的是,一些其它的SCM,嘗試著做分布式的事情,但是遠程訪問也沒有處理好。我有性能的需求,不僅僅是滿足遠程可用,同時我還擔(dān)心代碼完整性和整個工作流,于是我決定自己寫一個。
你是如何著手做這件事的?你是整個周末都在寫代碼,還是只在固定的幾個小時呢?
Torvalds: 嗨,實際上,你可以從git的源代碼倉庫中,查看它是如何成型的,除了大概是最開始的一天。我大約花了一天時間來讓git“自我管控”(self-hosting),這樣,我就可以通過git來提交代碼(commit)到git。所以大概第一天是隱藏的,但是所有其它的東西都在那里了。編碼工作大多數(shù)在白天,但是也有少數(shù)在午夜,也有一些在凌晨2點。最有趣的部分是,它成型非常快;git樹中的第一個commit并沒有很多代碼,但是它已經(jīng)做了最基本的事情–可以提交(commit)自己。其中的技巧實際上不在于代碼,而在于想出它如何組織數(shù)據(jù)的辦法。
所以,我想說,git在大約10天左右的時間之后的樣子(在這個點,我使用git做了*kernel*的第一次提交),它并不像某些瘋狂的垃圾編碼(而是有實際的使用價值)。早期的代碼量實際上非常小,它的目標(biāo)是正確實現(xiàn)基本點。 在整個項目開始之前,我一直在仔細考慮。我意識到其他人遇到的問題,也想到了要避免去做的事情。
它的存在周期達到了你的預(yù)期嗎? 你認為它目前應(yīng)該如何工作呢? 是否有一些限制呢?
Torvalds: 我對git非常滿意。對于kernel的開發(fā),它做的非常非常好,滿足了我所有的預(yù)期。讓我覺得有趣的是,它是如何接管了許多其它項目的。結(jié)果是令人吃驚的。在更換源代碼管理系統(tǒng)的時候,有很大的慣性;看看CVS,甚至是RCS,它們占據(jù)了多長時間,但是,某個時刻起,git就完全接管了。
你覺得它為何如此廣泛的被采用呢?
Torvalds: 我認為,其他許多人像我一樣,都被同樣的問題弄得灰心喪氣,這些問題讓我厭惡SCM。許多項目由于試著解決一兩個邊邊角角的小問題而讓人們抓狂,并不是像git這樣真正的著手解決重要的問題。即便人們并不知曉“分布式”的部分有多么重要(許多人曾反對它),只要他們弄明白,git允許簡單可靠的備份,同時允許人們生成他們自己私有的倉庫,而不用擔(dān)心一些中心倉庫的擁有寫訪問權(quán)限的策略,他們是絕不會再回到以前的版本管理的。
Git會永遠存在下去嗎?或者說,您是否預(yù)見到在下一個10年中將會有其他的版本控制系統(tǒng)出現(xiàn)?你會是這個系統(tǒng)的作者之一嗎?
Torvalds:不,我不會是這些作者中的一員。我們在10年內(nèi)或許可以看到一些新的東西,但我保證這些東西也會是“類Git”的。這并不是說Git能正確地處理所有的事情,但它以一種前所未有的方式把最為基本的問題都解決了,在這之前沒有一款軟件配置管理工具(SCM)可以與之媲美。
我可以毫不謙虛地說
為什么Git能在Linux上工作得如此好?
Torvalds:好吧,很明顯的它就是為了我們的工作流程而設(shè)計,因此他本身就是Linux的一部分。我已經(jīng)多次提到完全的“分布式”部分,但它值得一再提及。它被設(shè)計得在面對如Linux的大型項目時有足夠的效率,并且它被設(shè)計得去完成在它之前人們認為很“難”的任務(wù)——因為那些事情我每天都在做。
只舉一個例子:代碼合并的概念在多數(shù)源碼管理工具中通常被認為是非常痛苦和困難的事。你會計劃你的代碼合并,因為那是重大的決定。那樣的情況對我而言不能接受,自從我一天在合并的窗口前做數(shù)十次的代碼合并之后,最頭疼的的問題不是代碼合并工作本身,最重要的應(yīng)該是檢查其結(jié)果。Git中,代碼合并只會花費數(shù)秒,編寫代碼合并注釋文字卻會花費我很長的時間。
因此,Git基本上按照我的需求設(shè)計和編碼,也這樣實現(xiàn)。
有人說Git只是為絕頂聰明之人設(shè)計的,甚至Andrew Morton都說過Git “經(jīng)過特意設(shè)計,以便讓你感到自己不夠聰明?!蹦鷮Υ擞泻位貞?yīng)?
Torvalds:我想在以前確實如此,但現(xiàn)在不同了。因為少數(shù)一些原因,人們覺得git難用,但我認為現(xiàn)在只剩一個原因了。很簡單,那就是:你可以用很多種方法完成一件事。
通過git你可以完成很多事請,git要求人們遵守許多規(guī)則,這些規(guī)則并非出于技術(shù)上的限制,而是為了讓人們可以更好的合作。我們說git是一個強大的工具集,開始使用時你會感覺很困難,這通常是因為你可以用不同方法完成一件事,而且這些方法都能工作。一般說來,學(xué)習(xí)git最好的方法可能是,你先用它做最基本的事情,直到你熟悉這些基本操作,再去了解git的其它用法。
git的復(fù)雜有一些歷史原因,其中之一是:它過去就很復(fù)雜!git的早期用戶是那些為Kernel編程的人,他們不得不學(xué)習(xí)一系列非常難用的腳本。人們的絕大多數(shù)的精力花費在讓git能用,而不是讓它變得易用。所以早期git給大家的印象(確實就)是,你必須很精確的了解在做什么。當(dāng)然,在最初的半年或一年里,確實如此。
人們感覺git復(fù)雜的另一個原因是:git不同以往的SCM。許多人使用CVS十年甚至二十年,但git不是CVS,一點也不。它們的設(shè)計理念不同、命令不同。git也從來沒有想過模仿CVS,甚至相反。如果你曾經(jīng)長時間使用CVS風(fēng)格的系統(tǒng),就會感覺git很復(fù)雜,并且那些和CVS不同的設(shè)計,顯得沒有必要。人們會因奇怪的修訂編號而分心。為什么git的修訂編號不能像CVS的1.3.1那樣累加,而是要選擇一個奇怪的40字節(jié)的十六進制數(shù)?
但git并不是要表現(xiàn)“沒有必要的差異”。git確實和CVS存在差異。這些差異使人們感覺其中一個比另一個復(fù)雜,那是因為他們有不同的知識背景。CVS背景的東西正在遠去??赡墁F(xiàn)在很多人從來沒有用過CVS,他們會不理解CVS的使用方式,因為他們先學(xué)習(xí)了git。
你認為沒有g(shù)it,Linux Kernel能達到目前的開發(fā)速度嗎?
Torvalds:呃,沒有g(shù)it,我認為可以。但那意味著需要某些人寫出git等效的工具:一個像git一樣高效的分布式的SCM。我們確實需要像git這樣的東西。
您目前對GitHub有何看法?
Torvalds:毫無疑問,Github是一個非常棒的代碼托管服務(wù),但我對它仍有一些看法:做為一個開發(fā)平臺(提交代碼,請求更新,跟蹤issue等),GitHub有太多限制。它遠不如Kernel的開發(fā)平臺那樣出色。
部分原因是由于Kernel的開發(fā)方式——git正是為Kernel開發(fā)而生,但另一部分原因是GitHub的界面鼓勵不好的行為。比如,GitHub上的“完成提交”有一些不好的提交信息。GitHub曾經(jīng)修復(fù)了一些問題,也許現(xiàn)在已經(jīng)做得很好了,但它永遠不能像Linux Kernel那樣,和git完美結(jié)合。
請說一說在 Git 或 GitHub 上您最感興趣的用法?
Torvalds:很高興看到采用git可以很輕松的創(chuàng)建一個項目。以前的代碼托管很難用,有了git和GitHub,創(chuàng)建一些小項目變得非常簡單。項目具體是做什么并不重要,重要的是你可以做到了。
您最近還有其它項目嗎?其它可以統(tǒng)治未來若干年軟件開發(fā)的偉大項目?
Torvalds:目前沒有,如果有的話我會告訴你。