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文件的内容如下
#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】推送,将当前仓库的变更集“上传”到其他仓库去。
【Merge合并。当一个文件同时被多次修改,并存放在多个仓库时,要获得一个统一的版本就需要合并。

2.服务器搭建
【若干准备】
创建一个名为main.c的函数,文件内容如下
#include <stdio.h>
int main(void) {
    printf("Hg Test\n");
}
【建立仓库】
在该文件所在目录,右击选择tortoiseHg -> create respository here(或在Hg workbench中操作)建立本地仓库。请注意首次创建的仓库为一个空仓库,可进行必要的提交工作。

图2.1 建立本地仓库


图2.2 建立本地仓库

【首次提交】
进行提交操作时,需要首先选中最新版本,接着选择需要跟踪文件,然后编写必要的修改说明,最后点击提交按钮。请注意提交操作仅仅提交到本地仓库,若要使远程仓库产生变化需要进行下一步推送操作。(由于此处为服务器并没有推送目标,所有没有推送操作,但是相对于下文提到的A男和B男情况就不一样了。)

图2.3 首次提交


图2.4 提交之后结果

【修改服务器设置】
选择server选项,修改全局参数和该仓库参数。其中取消SSL加密推送,并允许他人推送。为了简单说明问题,全局参数和该仓库设置相同。在该项设置中默认的端口号位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");
}

【本地提交】
    在界面的右下角可看到代码的变化情况,+号代表增加。

图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中使用
【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界面

7.参考资料




没有更多推荐了,返回首页