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中操作)建立本地仓库。请注意首次创建的仓库为一个空仓库。可进行必要的提交工作。

图2.1 建立本地仓库

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图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】

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图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文件例如以下所看到的。
#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男的拉取和推送操作非常easy,可是没有不论什么代表性,请关注下文A男的操作)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

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

【本地提交】

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图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 提交必要的合并说明
【推送操作】

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图4.8 推送操作
【检查结果】

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图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界面
7.參考资料

TortoiseHg 学习笔记的更多相关文章

  1. TortoiseHg 学习笔记一

    因项目需要频繁的提交.合并代码,前段时间别人在我笔记本上装了个TortoiseHg,我不怎么会用 现在学习一下,目前没时间写太多东西,未完待续 记录一下查看的文章 http://jingyan.bai ...

  2. Linux学习笔记——如何使用共享库交叉编译

    0.前言     在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如:     [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...

  3. Linux学习笔记——怎样在交叉编译时使用共享库

    0.前言     在较为复杂的项目中会利用到交叉编译得到的共享库(*.so文件).在这样的情况下便会产生下面疑问,比如:     [1]交叉编译时的共享库是否须要放置于目标板中,假设须要放置在哪个文件 ...

  4. cJSON学习笔记 续集

    0.前言     本文试图说明怎样使用CJSON构造各种各样的JSON数据包.在前段时间已经写过一篇cJSON的文章,所以本文成为"续集".     [相关博文]     [前端学 ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  7. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  8. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  9. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

随机推荐

  1. sublime text 安装nodejs开发插件

    系统:windows10nodejs版本:v6.1.14 请先配置好环境变量,这里就不说啦. 下载并设置nodejs插件 下载地址为https://github.com/tanepiper/Subli ...

  2. Thinkphp table doesn't exist

    系统采用Tp3.2的改造....集群为Mysql双工模式:平时M()主要是操作写,MS操作读...今天在查询 $res =MS("user u")->join("{ ...

  3. 2. 常见的Queue

    package com.gf.conn013; import java.util.ArrayList; import java.util.Iterator; import java.util.List ...

  4. 前端入门4-CSS属性样式表

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 声明 本系列文章内容全部梳理自以下四个来源: <HTML5权威指南> <JavaScript权威指南> MD ...

  5. 山东理工大学SDUT - ACM OJ 题: Python代码 及分析

    Python基础语法学习完成,先刷基础题100道巩固 ,附 题目.代码.知识分析 题目:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index ...

  6. 「Android」单例的五种写法

    单例 发现博客园可以很好的设置自己的博客文章的展示,很开心,然后特此发一篇 其实这几种写法大家应该都会的,就权当拿来记录一下吧,以后复习巩固也比较方便. 这篇文章中的代码,来自一篇视频(我想找视频贴上 ...

  7. Android广播机制的基本使用

    一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭.有发送广播的地方,也有接收广播的地方.但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播: ...

  8. (后端)Mybatis实现批量删除操作(转)

    原文地址:https://blog.csdn.net/javaee_sunny/article/details/52511842 一. 这里主要考虑两种参数类型:数组或者集合. 而这点区别主要体现在E ...

  9. 智能ERP 交接班统计异常的解决方法

    请注意,有交接班统计数据不准确的需开启离线统计即可解决,交接班统计是按照结账时间来进行统计的 1.点击左侧导航栏中‘更多’-进入系统设置 2.进入营业设置后-开启离线统计-点击保存

  10. SQL中常用数学函数

    --1 RAND() 返回0到1的随机值,若不指定随机种子,返回值不同;若指定的种子相同则随机值相同SELECT RAND()SELECT RAND()SELECT RAND(100)SELECT R ...