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文件的内容例如以下
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中的内容变为
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中操作)建立本地仓库。请注意首次创建的仓库为一个空仓库。可进行必要的提交工作。
图2.1 建立本地仓库
图2.2 建立本地仓库
【首次提交】
进行提交操作时,须要首先选中最新版本号。接着选择须要跟踪文件,然后编写必要的改动说明,最后点击提交button。请注意提交操作仅仅提交到本地仓库。若要使远程仓库产生变化须要进行下一步推送操作。(因为此处为server并没有推送目标。全部没有推送操作。可是相对于下文提到的A男和B男情况就不一样了。)
图2.3 首次提交
图2.4 提交之后结果
【改动server设置】
选择server选项,改动全局參数和该仓库參数。当中取消SSL加密推送,并同意他人推送。
为了简单说明问题。全局參数和该仓库设置同样。
在该项设置中默认的port号位8000,也能够使用其它port号,请一定要避免知名port号。
图2.5 改动全局设置
图2.6 改动本地仓库设置
【启动server】
在tortoiseHg中选择【仓库】->【web server】
图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/
图3.1 clone操作
【改动代码】
改动源代码,添加一个max函数,改动之后的main文件例如以下所看到的。
int max(int a, int b) {
return a > b ? a : b;
}
int main(void) {
printf("Hg Test\n");
}
【本地提交】
在界面的右下角可看到代码的变化情况,+号代表添加。
图3.2 本地提交
【拉取操作】
因为A男没有提交代码到远程仓库,全部此时B男拉取时提示没有不论什么更新内容。
【推送操作】
B男运行推送操作。那么远程仓库发生了变化。(此时A男也有可能在编写代码,可是他并没有完毕代码本地提交和推送操作,那么A男拉取时之后。须要和他本地的代码进行合并。然后再进行推送操作。尽管此处B男的拉取和推送操作非常easy,可是没有不论什么代表性,请关注下文A男的操作)
图3.3 拉取并推送到远程仓库
【必要的检查】
通过网页查看推送是否成功,请输入远程仓库URL 192.168.1.102:8000。
图3.4 必要的检查
4.A男操作过程
【本地克隆】
和B均操作同样
【改动代码】
添加min函数。
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男发现远程server存在变更,须要进行合并或更新。
图5.1 拉取操作
【更新操作】
此时B男仅仅须要进行更新操作就可以,及时进行合并操作Hg也会提示没有不论什么能够合并的内容。此时B男仅仅须要通过更新update和server保持一致就可以。【小技巧,可优先进行合并操作,若提示没有任务合并内容便使用更新操作】
图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同样,仅缺少右键快捷菜单。
图6.1 ubuntu中TortoiseHg界面