0.前言


    TortoiseHg是分布式的源代码管理工具Mercurial的GUIclient。 mercurial 作为3大主流的分布式源代码管理工具。已经被广泛的使用。比如 googlecode.com和codeplex.com都支持mercurial作为源代码管理工具。

以下结合某个场景。叙述TortoiseHg的详细用法。




1.假想场景


【1】主管在版本号库server中建立一个仓库。该server的IP地址为192.168.1.102,版本号库server的port为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男使用合并工具完毕合并并提交至server。


【8】B男拉取server内容,并进行更新。


最后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】推送,将当前仓库的变更集“上传”到其它仓库去。


【Merge】合并。当一个文件同一时候被多次改动。并存放在多个仓库时,要获得一个统一的版本号就须要合并。




2.server搭建


【若干准备】


创建一个名为main.c的函数,文件内容例如以下


#include <stdio.h>


int main(void) {


    printf("Hg Test\n");


}


【建立仓库】


在该文件所在目录。右击选择tortoiseHg -> create respository here(或在Hg workbench中操作)建立本地仓库。请注意首次创建的仓库为一个空仓库。可进行必要的提交工作。


TortoiseHg 学习笔记_#include


图2.1 建立本地仓库




TortoiseHg 学习笔记_版本号_02


图2.2 建立本地仓库




【首次提交】


进行提交操作时,须要首先选中最新版本号。接着选择须要跟踪文件,然后编写必要的改动说明,最后点击提交button。请注意提交操作仅仅提交到本地仓库。若要使远程仓库产生变化须要进行下一步推送操作。(因为此处为server并没有推送目标。全部没有推送操作。可是相对于下文提到的A男和B男情况就不一样了。)


TortoiseHg 学习笔记_版本号_03


图2.3 首次提交




TortoiseHg 学习笔记_远程仓库_04


图2.4 提交之后结果




【改动server设置】


选择server选项,改动全局參数和该仓库參数。当中取消SSL加密推送,并同意他人推送

为了简单说明问题。全局參数和该仓库设置同样。

在该项设置中默认的port号位8000,也能够使用其它port号,请一定要避免知名port号。


TortoiseHg 学习笔记_远程仓库_05


图2.5 改动全局设置




TortoiseHg 学习笔记_推送_06


图2.6 改动本地仓库设置




【启动server】


在tortoiseHg中选择【仓库】->【web server】


TortoiseHg 学习笔记_远程仓库_07


图2.7 启动webserver




3.B男操作过程


【过程概述】——clone远程仓库至本地->改动源代码->本地提交Commit->拉取远程代码pull->合并merge或更新update->推送到远程仓库push




【clone过程】


    新建一个空目录(必须为空目录)。在空文件里右击,选择TortoiseHg->Clone。源地址中输入远程仓库URL,比如远程仓库server的IP地址为192.168.1.102,Hg仓库的port号为8000。那么远程仓库的URL可写为:


    http://192.168.1.102:8000/


TortoiseHg 学习笔记_#include_08


图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");
}




【本地提交】

    在界面的右下角可看到代码的变化情况,+号代表添加。

TortoiseHg 学习笔记_源代码管理_09


图3.2 本地提交




【拉取操作】


    因为A男没有提交代码到远程仓库,全部此时B男拉取时提示没有不论什么更新内容。


【推送操作】


    B男运行推送操作。那么远程仓库发生了变化。(此时A男也有可能在编写代码,可是他并没有完毕代码本地提交和推送操作,那么A男拉取时之后。须要和他本地的代码进行合并。然后再进行推送操作。尽管此处B男的拉取和推送操作非常easy,可是没有不论什么代表性,请关注下文A男的操作)


TortoiseHg 学习笔记_#include_10


图3.3 拉取并推送到远程仓库




【必要的检查】


    通过网页查看推送是否成功,请输入远程仓库URL 192.168.1.102:8000。


TortoiseHg 学习笔记_#include_11


图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");
}


【本地提交】


TortoiseHg 学习笔记_源代码管理_12


图4.1本地提交


【拉取操作】


    A男发现B男已经提交了一个版本号。须要进行代码合并。


TortoiseHg 学习笔记_远程仓库_13


图4.2 拉取操作




【合并操作】


    合并操作可借助合并工具,可是在合并之前还是和同事沟通一下。合并一般发生在两个人同一时候改动了同一个文件。


TortoiseHg 学习笔记_版本号_14


图4.3 合并操作




    同一个文件里在两个分支中出现改动。已经无法自己主动合并须要进行下一步手动合并。


TortoiseHg 学习笔记_#include_15


图4.4 合并操作




    选择合并工具并開始合并。TortoiseHg会加入在系统中安装的合并工具,比如Bcompare或者winmerge。

在界面中选择Tool Resolve使用工具解决合并,Take Local选择本地文件。Take Other选择远程文件(相当于放弃了本地改动)。建议选择使用工具合并同一时候和您的同一时候好好沟通一下,怎样合并。


TortoiseHg 学习笔记_版本号_16


图4.5 合并操作




    使用合并工具时,左側为远程内容,右側为本地内容。尽管合并工具提示仅存在非常小的差异,比如min和max,<和>。可是假设有效沟通一下的话便会发送实际上应该添加一个函数。须要把max函数拷贝到本地已完毕合并。


TortoiseHg 学习笔记_远程仓库_17


图4.6 使用工具完毕合并




    合并完毕。编写必要的改动说明。


TortoiseHg 学习笔记_源代码管理_18


图4.7 提交必要的合并说明




【推送操作】


TortoiseHg 学习笔记_#include_19


图4.8 推送操作




【检查结果】


TortoiseHg 学习笔记_推送_20


图4.9 必要的检查




5.B男再次操作


【拉取操作】


    此时B男发现远程server存在变更,须要进行合并或更新。


TortoiseHg 学习笔记_#include_21


图5.1 拉取操作




【更新操作】


    此时B男仅仅须要进行更新操作就可以,及时进行合并操作Hg也会提示没有不论什么能够合并的内容。此时B男仅仅须要通过更新update和server保持一致就可以。【小技巧,可优先进行合并操作,若提示没有任务合并内容便使用更新操作】


TortoiseHg 学习笔记_版本号_22


图5.2 更新操作


    最后A男和B男的本地仓库中,main.c的内容全然同样。




6.ubuntu中使用


【1】安装过程


    依次输入以下指令:


sudo add-apt-repository ppa:tortoisehg-ppa/releases


sudo add-apt-repository ppa:mercurial-ppa/releases


sudo apt-get update


sudo apt-get install mercurial python-nautilus tortoisehg


【2】使用界面


    使用界面和windows同样,仅缺少右键快捷菜单。


TortoiseHg 学习笔记_源代码管理_23


图6.1 ubuntu中TortoiseHg界面