Repository Architecture
水銀給了你相當大的建庫自由度。由于合并是如此好用,你可以根據你的開發進度來維護一些特殊用途的倉庫
我們的菜單已經變的相當漂亮了:
我們來更加仔細地看一看變更集的序號:
數字的第一部分,13,很短也很方便。它只有一個問題……它不可靠!
當團隊里的人各自工作并且將其成果合并,那些短號是不同步的:
因此,我沒辦法跟人們說:“好吧,咱們來將版本轉移到變更集13上?!币驗槊總€人的13有可能是不同的。這就是為什么那個瘋狂的十六進制數存在的原因。
這個十六進制數在所有的倉庫中都是一致的并且永遠不會改變。好了,現在我們可以給大家說,“現在讓我們移動到變更集1b03ab783b17!但如果我們能給這個變更集一個名字豈不是更好嗎?”
是的,你可以這么做。這叫tag。
我們現在來看看log:
注意到添加tag這個動作也形成了一個變更集,并且自動為我提交了。因此,我現在可以使用Version-1.0來表示1b03ab783b17。
接著開始開發Guac 2.0
提交:
“太咸了!”有顧客抱怨。
這時我們可以用hg up命令回到Version-1.0版本
現在可以解決他的問題:
并且:
水銀告訴我,我又創造了一個新的頭?,F在有兩個頭:2.0是我之前在上面工作的頭,1.1是我剛剛提交的頭。
現在我可以把這個1.1版本給客戶,然后回到version 2.0開始工作。
現在只有一個問題……解決的太咸的問題沒有放在2.0版本上。這該如何解決?
啊哦。我必須要合并標簽。這是水銀中的一個討厭的問題。這個問題就在于在水銀中,標簽只是一個叫.hgtags的文件,并且也在版本控制的范圍內。因此,你需要時不時地手動合并一下.hgtags這個文件。不管何時發生這個合并的動作,你要做的很簡單……即總是保證每一行對應到一個版本就行了。
剛剛所描述的是一種簡單的,回到歷史版本,修改,再合并到當前版本的一個方法。而事實上在軟件工程中,這樣的事幾乎隨時都在發生。因此,水銀提供了一個更加強健的方式來解決這一問題。
因此,我現在要撤銷1.0之后的所有工作,并且將倉庫返回到剛剛創建完1.0版本的時候。這樣,我就可以展示當工作在一個未來的版本時,如何修復客戶的問題。
想法是這樣的:我們將創立兩個倉庫,一個叫做stable,而另一個叫做dev。
叫做stable的倉庫裝著我們給客戶發布的最新的主版本。不論何時你需要修復一個緊急的bug,你就在stable里面做。
dev倉庫用于下一個版本的開發。
當1.0版本固定之后,就可以將stable克隆到dev中。
現在我就有兩個相等的倉庫了。
由于一直到變更集14,這些倉庫的歷史都是一樣的。因此水銀會使用一個叫“硬鏈接”的技巧來避免在硬盤中存放兩個拷貝。這使得hg clone操作非常快速而低耗,因而可以放心地在本地克隆許多倉庫。
現在我們開始在dev這個倉庫里面工作:
并且在stable倉庫中修改了鹽的問題:
將之標簽為1.1
現在呢,我們可以時不時地將stable中修改的問題拉到dev中:
這是我們現在做的:
如果你能理解上面的那張瘋狂的圖的話,那說明你水銀已經掌握地不錯了。要點就在于,stable倉庫中只有bug的修復,而dev倉庫中有新的代碼并且會將bug的修復合并進去。
使用多個倉庫的情景還有一些:
- 你可以建立一個團隊的倉庫,然后讓一些人在此基礎上開發一個新的功能。當它們結束工作,并且這個功能可以很好地運行之后,你可以將這個變更從團隊倉庫推送到主開發倉庫,這時所有的人都能看到這個新功能。
- 你可以為測試人員建立一個QA的倉庫,你可以把你需要測試的代碼放到QA的倉庫中去(而不是直接放到主倉庫中去)。當測試通過之后,你可以將QA倉庫里的東西推送到主開發倉庫中去。通過這個方式,主倉庫中的代碼總是測試過的。
- 由于每個開發人員都有它們自己的倉庫,因而你可以從你的朋友那兒clone一份過來做實驗。這樣就不會影響到整個團隊。
在大而復雜的組織中,你可以自由結合這些技巧,從而創建一堆互相關聯的倉庫。每個功能都要經歷測試和集成,它會被拉地越來越高直到最終你的新代碼可以被放到主倉庫中并且可以被客戶得到。
自測
以下是你讀完這篇教程之后應該能掌握的:
- 給版本打上版本號,并且能夠回到這個版本
- 用“stable”倉庫和“dev”倉庫來組織你的團隊
好了,本教程已經到達尾聲了。這個入門教程沒有覆蓋到水銀的方方面面,不過好在已經有非常多的資源可以引領你更深入地了解水銀。這里推薦一本覆蓋面較為全面的書給大家。
譯者行之寫在最后:
有簡友問水銀與Git的區別。其實,兩者都是分布式版本控制系統。應該說,大同小異而各有優勢。不過,如果你是像我這么不Geek的程序員,懶得在命令行里面打命令的話,可以試試水銀哦~總覺得Git是給人擺酷用的。要說簡單方便,還是水銀。
安裝水銀時可以直接安裝tortoisehg。光從圖形界面的使用舒適感來說,TortoiseHg確實要比TortoiseGit要好用一些。TortoiseHg的Workbench還是相當強大的。
另外,水銀開web服務也特別方便。特別適合局域網內的工作協同。
你可以讓任意一臺聯網的電腦在5秒鐘之內開啟服務,這樣其他人就可以訪問這臺電腦上的倉庫啦。
可能有人會問,既然TortoiseHg這么好用,直接教怎么用TortoiseHg就好啦,干嗎給這么一堆命令行教程?
然而我想說的是,重要的是思想好嗎?這篇教程的重點在于用水銀希望的工作方式去思考。知道了這,你覺得還需要專門學TortoiseHg怎么用嗎?
所以,這里就不展開介紹TortoiseHg了。只留下四個字,給大家點信心。就是TortoiseHg特別好用!
最后,我想給自己留一條后路。也就是想告訴大家,雖然我翻譯這教程有頂水銀損Git之嫌。但是,我最近也確實在嘗試使用Git~畢竟人家有時候還是想裝一下Geek的:)