Ground Up Mercuial
即使你只是一個人在戰斗,你也應當使用水銀來得到版本控制的諸多好處。此教程會展示將一個文件夾交由水銀管理是多么地容易,你可以因此而方便地跟蹤軟件的舊版本。
水銀是一個版本控制系統。開發者用它來管理源代碼。用它的目的主要有兩個:
- 它跟蹤舊版本的每一個文件。
- 它可以合并不同版本的代碼。因而團隊成員可以各自獨立地工作,然后把他們所作出的改變合并到一起。
如果沒有水銀,你可能需要復制一大堆文件夾來保存你的舊版本:
這樣做會占據很多磁盤空間,并且過段時間你就搞不清楚哪個是哪個了。使用版本控制器可以很好地解決這個問題。
大多數人使用命令行來管理水銀,它在Windows, Unix和Mac平臺上都適用。水銀的命令為hg:
僅僅輸入hg,你會得到一個常用命令的列表。你也可以輸入hg help來獲得一份更為詳盡的列表。
為了使用版本控制,你需要一個repository(倉庫)。倉庫里保存了你所有文件的歷史版本。為了節約硬盤空間,它并沒有真的去保存每一個歷史版本——它只是保存了版本之間的差異。
在以前,建一個倉庫是一件大事。你需要一個中央服務器,并且在上面裝軟件。然而水銀是分布式的,你不需要建什么中央服務器。你完全可以就在個人計算機上使用它。而且建一個倉庫超級容易:你只需要進入代碼的頂層目錄……
……,然后輸入hg init:
等等,好像什么事也沒有發生?然而,如果仔細瞧一瞧,你會發現多了一個叫.hg的新目錄:
那就是倉庫!那是一個裝滿著水銀所需的所有文件的目錄。里面有一些設置,有文件的歷史版本,有標簽tags,還有備份,等等。記住這句忠告吧:不要修改里面的任何東西。你也不需要與這個文件夾直接打交道。
好了,我們現在有了一個新的倉庫。我們想要把一些源代碼添加進去。很簡單,輸入hg add。
還需要一個步驟…你需要提交變更。什么變更?變更就是:你添加了那么多的文件。
你為什么需要提交?用水銀的時候,提交就好比是說:“嘿,請你記住現在這樣的文檔布局和內容。”這就好像是拷貝了一下整個文件夾…每一次你改變了一些內容,你就可以commit一下。
水銀會彈出一個編輯器,從而你可以輸入一些提交信息。這些信息只是為了提醒你自己,這次提交作了哪些改變。
當你保存并退出,你的文件就被提交了。
你可以輸入hg log來看一看歷史變更。這就像你的倉庫的部落格。
現在不如再來編輯一個文件,看看會發生什么。
現在我們又作了另外一個變更,我們可以用hg commit來提交。
看,水銀能夠知道只有一個文件,a.txt被改變了:
提交過后,我們再來看看log:
就像任何現代的部落格一樣,水銀把最新的事件放在最上面。
再來一次變更:
提交:
提交信息:
現在的log:
OK。到現在為之,我做了一些變更。而且每當我作出一個重要的變更之后,我都會把它提交到倉庫中去。
我知道你在想些什么。你在想,“JOEL, 這簡直在浪費時間!”為什么一個提交講這么久!真是懶婆娘的裹腳布!
請耐心一點,年輕人!你馬上就會學到如何從提交中得到好處。
首先,比如說你在編輯的時候犯了點錯。
然后,天吶,你刪了一些非常重要的文件。
【此處有原作者的小故事。因與主題關系不大,略過……】
感謝水銀,當你對自己的改變不滿時,你可以輸入hg revert。水銀會把你的目錄里的所有東西恢復到最后一次提交時的樣子。
之所以使用參數--all是因為想要把所有的文件都回滾到它們的初始狀態上。
因此,當你使用水銀管理你的源代碼時,你可以:
- 做一些變更
- 看它們是否正確有效
- 如果是,則commit它們
- 如果不是,則revert它們
- GOTO 1
(我知道,我一會兒用Windows的CMD界面,一會兒又用GOTO語句,一定會招來你們的不滿與吐槽。)
隨著時間的流逝,你可能不記得每個版本都具體做過哪些變化。不過不要緊,水銀替你跟蹤了。你只需要輸入hg status,水銀就會給你顯示你改變過的文件。
假設我首先創建了一個文件,然后編輯了一個文件,最后刪除了一個文件。
hg status將你改變的任何一個文件都顯示出來。“M”表示“更改”——文件被修改過了。“!”表示丟失——文件本來應該在的,可現在卻沒了。“?”表示不知道——水銀對那個文件現在還一無所知。
我們一個一個來看。那個更改了的文件,a.txt。更改了什么?你可能已經忘了。有一個命令可以幫助你:hg diff。它會告訴你從上一次的提交到現在,文件作了哪些變化。
這種格式似乎有一點神秘,但最讓人感興趣的部分是:如果那塊看到一些行前面有一個減號,表示它們被刪除了;一些行前面有一個加號,則表明這些行被添加了。所以上面的例子中,“Normal people”被編輯成了“Civilians”。
現在來看那個遺失的文件,favicon.ico。像之前說的那樣,如果你并不想刪除它,則可以使用hg revert;如果你真的要刪除它的話,你需要告訴水銀:
“R”表示“Removed”。因此下次commit的時候,這個文件將被刪除。最后,我們需要加上新的文件,b.txt:
“A”表示“Added。”你有沒有發現我已經懶得把hg status打全了?水銀只需要足夠多的可以區分的字母。而以st打頭的也只有這一條命令而已。
把所有的?和!都解決了之后,就可以繼續commit了。
關于hg log還有一件事:變更集(changeset)那一行顯示了一個數字……實際上是兩個數字。一個簡單的,比如“0”來表示最初的版本。還有一串長的,十六進制的數字你可以暫時忽略。
記住,水銀保存了足夠的信息,可以來重構任何一個歷史版本。
首先,一個簡單的命令hg cat可以被用來打印某個文件的任何歷史版本。
例如,我們可以看看a.txt現在長什么樣子。
如果想看它過去的樣子,可以加一個-r("revision")參數:
如果文件很長,很復雜,并且其實至改變了一點點。那我們可以使用hg diff帶上-r參數來查看兩個版本之間的差異在什么地方。
最后,在你快達到你看一篇文章的身體極限之前,我還想告訴你一件小事:你可以使用hg update這個命令來到達你想要的任何一個版本。
如果不帶任何參數,則hg update會更新到最新的版本。
自測
OK! 此為教程1。下面是你應當已經掌握的知識:
- 創建一個倉庫
- 在倉庫中添加或刪除文件
- 當做了變更,看看有哪些沒有提交的變更,然后
- 如果你覺得這些變更還不錯,就commit,
- 如果你覺得這些變更不行,就revert。
- 查看文件的舊版本,并讓自己的工作目錄可以update成任何一個版本。