0.前言
TortoiseHg是分佈式的源碼管理工具Mercurial的GUI客戶端。 mercurial 做爲3大主流的分佈式源碼管理工具,已經被普遍的使用。例如 googlecode.com和codeplex.com都支持mercurial做爲源碼管理工具。下面結合某個場景,敘述TortoiseHg的具體使用方法。
1.假想場景
【1】主管在版本庫服務器中創建一個倉庫,該服務器的IP地址爲192.168.1.102,版本庫服務器的端口爲8000(默認)。
在版本庫中只有一個main.c文件,main.c文件的內容以下
- #include <stdio.h>
- int main(void) {
- printf("Hg Test\n");
- }
【2】A男和B男分別clone版本庫
【3】A男試圖在main.c中min函數,B男試圖在版本庫中加入max函數。兩人同時開始修改。
【4】B男彷佛速度快一點,增長了max函數並提交。
【5】A男也完成了max函數,拉取版本庫以後發現B男已經提交了一個版本,A男發現兩個版本存在衝突。
【6】A男和B男相互溝通,決定同時保留min函數和max函數。
【7】A男使用合併工具完成合並並提交至服務器。
【8】B男拉取服務器內容,並進行更新。
最後A男和B男本地版本庫中的內容徹底相同,main.c中的內容變爲
- #include <stdio.h>
- int min(int a, int b) {
- return a < b ? a : b;
- }
- int max(int a, int b) {
- return a > b ? a : b;
- }
- int main(void) {
- printf("Hg Test\n");
- }
【Init】 初始化,建立一個空的倉庫。
【Clone】 複製倉庫,來源能夠是一個http或ssh連接表示的倉庫,也能夠是本地倉庫。
【Commit】 提交,即接受全部的改動將當前版本做爲最新版本(也叫tip)。只提交的本地倉庫,並且本地倉庫會詳細記錄全部的變更(稱爲變動集或改動集)。屢次提交併不會影響遠程倉庫。
【Revert】恢復,即撤銷全部的改動,恢復到未更改的狀態。
【Pull】拉取,將雅遠程倉庫有而當前倉庫沒有的變動集「下載」到本地倉庫。不過這只是添加了變動集,文件【Update】更新,當獲取了其餘變動集,更改以保持和遠程倉庫一致。
【Push】推送,將當前倉庫的變動集「上傳」到其餘倉庫去。
】合併。當一個文件同時被屢次修改,並存放在多個倉庫時,要得到一個統一的版本就須要合併。
2.服務器搭建
【若干準備】
建立一個名爲main.c的函數,文件內容以下
#include <stdio.h>
int main(void) {
printf("Hg Test\n");
}
【創建倉庫】
在該文件所在目錄,右擊選擇tortoiseHg -> create respository here(或在Hg workbench中操做)創建本地倉庫。請注意首次建立的倉庫爲一個空倉庫,可進行必要的提交工做。
圖2.1 創建本地倉庫
圖2.2 創建本地倉庫
【首次提交】
進行提交操做時,須要首先選中最新版本,接着選擇須要跟蹤文件,而後編寫必要的修改說明,最後點擊提交按鈕。請注意提交操做僅僅提交到本地倉庫,若要使遠程倉庫產生變化須要進行下一步推送操做。(因爲此處爲圖2.3 首次提交
圖2.4 提交以後結果
【修改服務器設置】
選擇server選項,修改全局參數和該倉庫參數。其中容許他人推送。爲了簡單說明問題,全局參數和該倉庫設置相同。在該項設置中默認的端口號位8000,也可使用其餘端口號,請必定要避免知名端口號。
圖2.5 修改全局設置
圖2.6 修改本地倉庫設置
【啓動服務器】
在tortoiseHg中選擇【倉庫】->【web server】
圖2.7 啓動webserver
3.B男操做過程
【過程概述】——clone遠程倉庫至本地->修改源代碼->本地提交Commit->拉取遠程代碼pull->合併merge或更新update->推送到遠程倉庫push
【clone過程】
新建一個空文件夾(必須爲空文件夾),在空文件中右擊,選擇TortoiseHg->Clone。源地址中輸入遠程倉庫URL,例如遠程倉庫服務器的IP地址爲192.168.1.102,Hg倉庫的端口號爲8000。那麼遠程倉庫的URL可寫爲:
http://192.168.1.102:8000/
圖3.1 clone操做
【修改代碼】
修改源代碼,增長一個max函數,修改以後的main文件以下所示。
- #include <stdio.h>
- int max(int a, int b) {
- return a > b ? a : b;
- }
- int main(void) {
- printf("Hg Test\n");
- }
【本地提交】
在界面的右下角可看到代碼的變化狀況,+號表明增長。web
圖3.2 本地提交
【拉取操做】
因爲A男沒有提交代碼到遠程倉庫,全部此時B男拉取時提示沒有任何更新內容。
【推送操做】
B男執行推送操做,那麼遠程倉庫發生了變化。(此時A男也有可能在編寫代碼,可是他並無完成代碼本地提交和推送操做,那麼A男拉取時以後,須要和他本地的代碼進行合併,而後再進行推送操做。雖然此處B男的拉取和推送操做很是簡單,可是沒有任何表明性,請關注下文A男的操做)
圖3.3 拉取並推送到遠程倉庫
【必要的檢查】
經過網頁查看推送是否成功,請輸入遠程倉庫URL 192.168.1.102:8000。
圖3.4 必要的檢查
4.A男操做過程
【本地克隆】
和B均操做相同
【修改代碼】
增長min函數。
- #include <stdio.h>
- int min(int a, int b) {
- return a < b ? a : b;
- }
- int main(void) {
- printf("Hg Test\n");
- }
【本地提交】
圖4.1本地提交
【拉取操做】
A男發現B男已經提交了一個版本,須要進行代碼合併。
圖4.2 拉取操做
【合併操做】
合併操做可藉助合併工具,可是在合併以前仍是和同事溝通一下。合併通常發生在兩我的同時修改了同一個文件。
圖4.3 合併操做
同一個文件中在兩個分支中出現修改,已經沒法自動合併須要進行下一步手動合併。
圖4.4 合併操做
選擇合併工具並開始合併,TortoiseHg會添加在系統中安裝的合併工具,例如Bcompare或者winmerge。在界面中選擇Tool Resolve使用工具解決合併,Take Local選擇本地文件,Take Other選擇遠程文件(至關於放棄了本地修改)。建議選擇使用工具合併同時和您的同時好好溝通一下,如何合併。
圖4.5 合併操做
使用合併工具時,左側爲遠程內容,右側爲本地內容。雖然合併工具提示僅存在很小的差別,例如min和max,<和>。可是若是有效溝通一下的話便會發送實際上應該增長一個函數,須要把max函數複製到本地已完成合並。
圖4.6 使用工具完成合並
合併完成,編寫必要的修改說明。
圖4.7 提交必要的合併說明
【推送操做】
圖4.8 推送操做
【檢查結果】
圖4.9 必要的檢查
5.B男再次操做
【拉取操做】
此時B男發現遠程服務器存在變動,須要進行合併或更新。
圖5.1 拉取操做
【更新操做】
此時B男只須要進行更新操做便可,及時進行合併操做Hg也會提示沒有任何能夠合併的內容。此時B男只須要經過更新update和服務器保持一致便可。【小技巧,可優先進行合併操做,若提示沒有任務合併內容便使用更新操做】
圖5.2 更新操做
最後A男和B男的本地倉庫中,main.c的內容徹底相同。
6.ubuntu中使用
圖6.1 ubuntu中TortoiseHg界面