一、介绍

Mercurial HG是基于python的开源分布式版本管理工具。与SVN不同的是,每个本地仓库都保存着完整的历史记录,即使远程仓库暂时离线,也可以进行本地版本管理,待远程仓库在线后再一起推送多次的修改记录。官网:https://www.mercurial-scm.org

二、常用命令介绍

1. 克隆到本地

代码语言:javascript复制hg clone http://server:8000/xxx # 会自动创建xxx目录也可以先建文夹,再克隆到当前目录

代码语言:javascript复制mkdir xxx

cd xxx

hg clone http:/server:8000/xxx . # 克隆到当前文件夹,不会创建xxx目录Tips

克隆后切换到指定分支(默认是default分支):代码语言:javascript复制hg clone http://server:8000/xxx xxx

cd xxx

hg branches #查看有哪些分支

hg update branch_name #切换到指定分支

hg branch #查看当前分支, 确认是否切换成功分支相关的命令请参考后面的介绍!

2. 建立本地仓库

代码语言:javascript复制hg init3. 添加、删除、重命名文件

代码语言:javascript复制hg add xxx.v

hg remove xxx.v

hg rename xxx.v yyy.v4. 本地提交

代码语言:javascript复制hg commit -m "add/remove xxx function"Tips:

只想提交部分文件时,可以在commit后指定文件名,如:hg ci -m "xxx" test.v与Git不同的是,再次提交时不需要重新add文件。HG里没有Stage(暂存区)。5. 与远程仓库同步

代码语言:javascript复制hg pull # 远程->本地

hg push # 本地->远程Tips:

当只想部分更新时(仅更新到指定版本),可以加参数-r REV,例如:hg pull -r 205。6. 查看状态

代码语言:javascript复制hg status # 查看状态

hg st # 可简写

hg st -q . # 查看状态时忽略untracked文件,其中-q是--quiet的简写7. 分支

代码语言:javascript复制hg branch new_branch_name # 新建分支,commit后分支才真正创建

hg branch # 查看当前分支

hg branches # 查看所有分支

hg push --new-branch # 分支传到远端

hg update branch_name2 # 切换到分支branch_name2

hg update default # 切换回主干8. 切换到指定的版本号

代码语言:javascript复制hg update -r # 版本号9. 查看与远端服务器的差别

代码语言:javascript复制hg incoming # 只是看差别,不真正pull

hg outgoing # 只是看差别,不真正pushTips:

hg incoming -v用来查看远端改了哪些文件,提前判断是否有文件冲突。10. 查看更新记录

代码语言:javascript复制hg tip # 查看最新一次的提交

hg log -r # 版本号

hg log -l 2 # 只看最新的两个版本

hg log -v # 查看更新了哪些文件 (verbose)

hg log -p # 查看具体文件内容的差异 (patch)Tips:

hg log -v默认的文件列表写在一行,如果文件较多,非常不方便查看。下面是一个解决方案。代码语言:javascript复制changeset: 69:35e07e070136

branch: a1n

tag: tip

user: Feng.Chen

date: Thu Feb 27 12:52:32 2020 +0800

files: .hgignore sim/rsim/report sim/script/run sim/script/run_regression.pl sim/script

/run_sim.pl sim/tc/seq/reg_wr_pri_seq.svh sim/tc/seq/reg_wr_pul_seq.svh sim/tc/seq/rgb_seq.sv

h sim/tc/w/tc_000_000.svh

description:

update 2020-02-27, change run_regression, run_sim, rgb_seq, testcase, etc可以用

hg log -v | sim/script/get_update_list.py

(get_update_list.py是自己写的脚本,在项目script里)来美化文件列表,效果如下:

代码语言:javascript复制changeset: 69:35e07e070136

branch: a1n

tag: tip

user: Feng.Chen

date: Thu Feb 27 12:52:32 2020 +0800

files:

.hgignore

sim/rsim/report

/script/run

/run_regression.pl

/run_sim.pl

sim/tc/seq/reg_wr_pri_seq.svh

/reg_wr_pul_seq.svh

/rgb_seq.svh

/w/tc_000_000.svh

description:

update 2020-02-27, change run_regression, run_sim, rgb_seq, testcase, etc

11. 合并

代码语言:javascript复制hg merge -r REV # 把本地的最新版本与刚pull的最新版本进行merge,REV是pull的最新版本Tips:

任何情况下,不要用force参数。merge和push前应仔细确认文件合并是否有问题。12. 放弃本地修改、撤销提交

代码语言:javascript复制hg revert xxx.v # 放弃本地修改,回到上次提交的状态

hg rollback # 回到上一个版本,最新修改过的文件仍然保留13. 误删除文件的恢复(已经加入版本库的文件)

也是用hg revert:

代码语言:javascript复制hg revert xxx.v14. 不再跟踪某文件

代码语言:javascript复制hg forget xxx.v # 从版本管理里面把某文件去掉,文件还保留在本地,不会删除。与hg remove的区别是,remove会删除本地的文件,而forget不会。

三、.hgignore的写法

有glob和regexp两种:

代码语言:javascript复制syntax: glob

*.mr

INCA_libs

syntax: regexp # 即python的正则语法

^.*\.mr$四、与svn、git命令对照表

总结如下图:

五、一些配置小技巧

hg的配置:分页看log、色彩、log带分支图

代码语言:javascript复制[extensions]

pager =

color =

graphlog =

[pager]

pager = more