TortoiseHg 學習筆記 (轉)


0.前言
    TortoiseHg是分布式的源碼管理工具Mercurial的GUI客戶端。 mercurial 作為3大主流的分布式源碼管理工具,已經被廣泛的使用。例如 googlecode.com和codeplex.com都支持mercurial作為源碼管理工具。下面結合某個場景,敘述TortoiseHg的具體使用方法。

1.假想場景
【1】主管在版本庫服務器中建立一個倉庫,該服務器的IP地址為192.168.1.102,版本庫服務器的端口為8000(默認)。
在版本庫中只有一個main.c文件,main.c文件的內容如下
  1. #include <stdio.h>  
  2. int main(void) {  
  3.     printf("Hg Test\n");  
  4. }  
【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中的內容變為
  1. #include <stdio.h>  
  2. int min(int a, int b) {  
  3.     return a < b ? a : b;  
  4. }  
  5. int max(int a, int b) {  
  6.     return a > b ? a : b;  
  7. }  
  8. int main(void) {  
  9.     printf("Hg Test\n");  
  10. }  



【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文件如下所示。
  1. #include <stdio.h>  
  2. int max(int a, int b) {  
  3.     return a > b ? a : b;  
  4. }  
  5. int main(void) {  
  6.     printf("Hg Test\n");  
  7. }  

【本地提交】

    在界面的右下角可看到代碼的變化情況,+號代表增加。

圖3.2 本地提交

【拉取操作】
    由於A男沒有提交代碼到遠程倉庫,所有此時B男拉取時提示沒有任何更新內容。
【推送操作】
    B男執行推送操作,那么遠程倉庫發生了變化。(此時A男也有可能在編寫代碼,但是他並沒有完成代碼本地提交和推送操作,那么A男拉取時之后,需要和他本地的代碼進行合並,然后再進行推送操作。雖然此處B男的拉取和推送操作非常簡單,但是沒有任何代表性,請關注下文A男的操作)
圖3.3 拉取並推送到遠程倉庫

【必要的檢查】
    通過網頁查看推送是否成功,請輸入遠程倉庫URL 192.168.1.102:8000。
圖3.4 必要的檢查

4.A男操作過程
【本地克隆】
    和B均操作相同
【修改代碼】
    增加min函數。
  1. #include <stdio.h>  
  2. int min(int a, int b) {  
  3.     return a < b ? a : b;  
  4. }  
  5. int main(void) {  
  6.     printf("Hg Test\n");  
  7. }  


【本地提交】
圖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界面
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM