1.关于hg命令选项:

每一个每一个命令选项都有一个长的名称,如hg log 命令会使用 –rev选项;

大多数选项拥有一个短的名称,如—rev有一个-r的短名;

长名称以两条横线(–)作为起始,短名起始是一条横线(-)。如—rev、-r;

无论是长名还是短名,其用途是一致的。如-r和—rev 其后都跟一个变更集合的ID或版本号;

如果使用的是短名,多个名称可以连在一起运行。如hg log –v –r –p 2可以写作hg log –vpr 2

2.hg log 命令:

使用该命令可以了解代码仓库变更的历史,其输出的结果中包含以下几个字段

(1)changeset 该字段被一个分号(:)分成两部分,分号的前面是一个数字,其后是一个十六进制的字符串。在查看版本历史的时候,常常会用到前面得数字。这里需要注意的是,该数字所代表的变更集合不是唯一的(比如a,b,c在一个代码仓库中的顺序是0,1,2,在另外一个代码仓库中可能是0,2,1)。真正指向唯一的变更集合的是后面的十六进制的字符串。

(2)user 代表集合的创建者;

(3)date 代表集合创建的时间;

(4)summary 创建者提供的关于该集合的描述文本;

(5)tag 有一些集合会包含一个tag字段,这个特别的字段总是指向代码仓库中最新的版本。

eg:

changeset: 16:0dc476d6fac3
tag: tip
user: Huanbiao Chen <hchen@example.com>
date: Thu Apr 19 13:53:35 2018 +0800
summary: revise demo strategy

如果想要查看特定的版本,在hg log 后跟上版本号即可,如:

查看特定的版本:hg log -r 2

同时查看2,3,4几个版本:hg log -r 2:4

查看版本的详细内容:hg log -vpr 1 
3.使用hg commit 提交代码需要注意的问题

第一次使用hg commit命令提交代码时,很可能会出现代码无法提交的问题。这是因为在代码提交时hg会尝试去找到一个有效的用户名。它会按下面的顺序去逐个尝试寻找有效的用户名:

(1)如果在使用hg conmit提交代码时,使用-u命令选项,并在其后跟上一个用户名(如:dexibe@gmail.com)。此时,该命令将具有最高的优先权;
(2)如果没有第一步的命令选项,它会查看你是否设置了HGUSER环境变量;
(3)如果在你的home目录下,你创建了.hgrc文件,并且该文件设置了username,它会启用该用户名;
(4)到这一步,它会查看你的email环境变量;
(5)如果以上都没有找到合适的用户信息,hg 将查看你的系统寻找用户名和主机名称,并试图根据这些组件构建有效的用户名,通常情况下用户名是不可用的,只会呈现一段警示语句;

4.拉取和推送代码

拉取代码,使用hg pull即可,有一个hg incoming命令我很少用到,仔细看了看,这个命令还是很管用。hg incoming命令不会真正的拉取代码到本地仓库,它只是告诉你使用hg pull会将哪些变更集合拉至本地仓库。这对于你拉取特定的版本集合很管用。
推送代码,使用hg push即可。在真正推送之前,可以使用hg outgoing查看有哪些改变将会被推送至代码仓库。

5.让 hg 跟踪你的文件

hg不会自动的管理你仓库中文件,hg status命令会告诉你那些它不知道的文件,它会在这些文件的前面打上一个“?”号。假如在你的仓库中有一个myfile.txt的文件,执行hg status(简写 hg st)你会看到在myfile.txt前面,我们会看到一个“?”号。如要让hg管理该文件,执行如下命令:hg add myfile.txt

此时运行hg st,你会看到文件myfile.txt前面的“?”号变成了“A”。执行hg commit命令之后,myfile.txt就不会再出现在hg status的输出结果之中。hg status命令的输出结果中仅包含删除的(removed)、被修改的(modified)、重命名的(renamed)文件。添加一个文件,hg什么也不会做,它只是在执行下一次提交(hg commit)之前对该文件“拍一张快照”。

注意事项:

如果使用hg add后跟的是一个目录,该命令会将该目录下的所有文件添加到仓库之中,包括子目录中的文件。假如有一个目录b,其下有一个文件some.txt和d目录,d目录之下有一个文件c.txt。

hg并不追踪文件夹信息,而是追踪文件的路径。在创建一个文件之前,首先创建文件所在的路径。删除一个文件后,它会删除文件所在路径的所有空的文件夹。一般情况下,很少用到空文件夹。如果在你的代码仓库中需要空文件夹,可以通过hg add来添加一个隐藏的文件。在linux系统中,任何以“.”开头的文件都被视作隐藏文件。除此之外,你可以在需要它之前通过自动化执行脚本方式创建空文件夹。

6.复制文件

hg提供了hg copy命令来复制一个文件。用该命令来复制文件,hg会记住新的的文件是源文件的副本。在你合并代码的时候,它会对其作特殊的处理。hg status -C 可以看到myfile-copy.txt是从myfile.txt复制而来。

hg copy命令与unix系统中的cp命令极其相似,只需要提供两个或三个以上的参数即可,最后的一个参数被视作目的地,其它都被视作复制源。这种操作包括以下几种情况:
目的地不存在,源文件为单个文件,将创建同名的新文件;如:
(1)hg copy a k//目录k不存在,重建k目录,并将a复制到k文件夹之下
目的地是一个目录,将源文件复制到该目录之下;如:
(2)hg copy a b d// 将a 和b 复制到d目录之下
复制源跟目的地都是目录,则将复制源复制到目标文件夹之下,并在目标文件夹之下根据复制源目录的名称重建目录,且保持复制源的目录树结构;如:
(3)hg copy z d //假设z的目录树结构为z/a/c,复制到目录d后,d的目录树结构为d/z/a/c
复制源是一个目录,目的地不存在,则创建新的目录,并将复制源下的目录树复制到新的目录之下;如:
(4)hg copy z e//假设z的目录结构为z/a/c,复制完成后e的目录结构为e/a/c
与hg remove命令一样,如果你手动复制一个文件,并让hg能跟踪此文件,可以使用hg copy –after [源文件] [目标文件],如:
(5)cp a b
(6)hg copy --after a b

7.hg diff

hg diff有一个选项–Git或者-g,该选项我们很少用到。假如你修改了一个文件的权限,运行hg status会看到文件被修改,而运行hg diff将看不到任何输出结果。如果在hg diff后跟上-g选项,你将会看到文件的实际状态。在unix系统下运行以下代码,看看输出结果。
(1)chmod +x a
(2)hg diff -g

总结:目前实习阶段学到的使用内容

hg commit 提交,并且可在字符界面添加描述内容

hg log -G | less :查看版本详情

hg diff -c 15 | less -R :查看变更历史

hg diff -c 15 --git -U 999999 > 15.diff :将变更内容重定向为diff文件