在Linux下,Hg与金属汞无关,它是一个类似于Git的版本控制器,全名为Mercurial source code management system。
与中心式版本管理软件如SVN不同,分布式版本控制没有中心节点,任何人都有所有历史版本,不连网也能本地使用,任何两个开发人员间都能merge代码,适合开发人员众多,分支众多的开发模式。
hg的.hgignore文件支持正则和通配符两种模式的配置,举个例子:
# use glob syntax.
syntax: glob
*.swp
*.o
*.a
*.pyc
*.pyo
test_*
# switch to regexp syntax.
syntax: regexp
^output
^proto/[^/]*\.pb\.h$
^proto/[^/]*\.pb\.cc$
开启一个web server,默认只读,不支持用户权限管理:
hg serve -p 8000
与svn info不同,查看当前目录的版本信息使用如下命令:
hg summary
hg sum #简写
文件重命名,相当于 copy + remove:
hg rename a.jpg beauty.jpg
hg move a.jpg beauty.jpg
hg mv a.jpg beauty.jpg
跳转到指定版本,类似于svn switch功能:
hg update tip #最新提交的版本
hg up branchname #某个分支的最新版本
hg -r 100 #指定的版本号
hg 972b566dcb78 #指定的changeset号
开分支命令:
hg up -r 100 #转到某个版本下
hg branch -f anotherbranch #添加分支
hg ci -m "add branch" -u hustyx #提交所打的分支
查看所有的分支:
hg branches
合并分支,指定将某版本或者某分支的一段修改merge到当前版本上:
hg merge -P -r more #查看将要从more这个分支merge过来的内容
hg merge -r more #实际进行merge
hg ci -m "merge" -u yixiang #merge之后需要ci
指定两个版本进行Diff比较:
hg diff -r shortone -r mybranch
打Tag:
hg tag -r shortone -m '打tag' -u yixiang 'tag_1.0.0.0'
显示所有tag:
hg tags
进行远程同步,即推或者拉,push 和 pull。注意,push和pull时代码必须是同源的,也就是追溯到根,必须有一样的changeset号。下面的例子是将本地的tip版本路径通过ssh方式提交到远程服务器(注意:push之后远程端需要up一把):
hg push -r tip ssh://user@aliyun//tmp/hgtest/
将远程的修改拉(pull)到本地来,下面的例子使用hgweb来进行连接:
hg pull -r tip http://www.hustyx.com:8087/
通过上面的例子,本地版本结构为:
远程版本结构为:
hg显示log有比较丰富的参数选项:
hg log zzz.cpp #显示某个文件的历史
hg log -k te #搜索带某个关键词的历史记录
hg log -G #显示一个文本表达的历史关系图,跟hg serve展示的一样,不过是用终端字符表示的
hg log -l 2 #顶多显示两条历史
hg log -f #显示当前版本路径上的提交日志信息(默认是显示所有的版本路径)
补丁的好处是可以将补丁文件通过邮件发送给其他开发者。打补丁:
hg export -o "patch.%R" -r 16 -r 17 #生成补丁
hg import patch.* #使用补丁
打包输出某个版本:
hg archive -t tgz -r tip /tmp/tip.tar.gz
如果有两个人同时对同一个版本的同一个文件做了不同的修改,由此就有冲突,那么合并过程是先pull,后merge,然后resolve,再commit,最后再push结果给对方:
hg pull ssh://aliyun//tmp/hgtest/ #将对方的修改拉到本地
hg merge #合并代码,有冲突会自动进行diff
hg resolve --all #如果上一步中没有解决冲突,此命令可再次解决
hg ci -m "merge" -u username #提交
hg push ssh://aliyun//tmp/hgtest/ #将最终结果推给对方
注意:由于hg是使用python实现的,有趣的一点是,如果你有一个文件叫abc.py,那么hg add abc.py会失败。
sourceforge 是使用的hg,clone也成为sourceforge上最常用的下载代码命令(可以不加版本以下载所有代码库,也可以通过-r指定一个或多个版本的代码):
hg clone http://www.hustyx.com:8000/ -r 1 -r 2 hgtest
graft命令类似于merge,不过它只是将某个版本的修改提交到当前分支,并不是真正合并分支。执行命令后不再需要ci提交:
hg graft -r 5