Mercurial是一种轻量级分布式版本控制系统,采用 Python 语言实现,易于学习和使用,扩展性强。其是基于 GNU General Public License(GPL) 授权的开源项目。

 

轻量级分布式版本控制系统特点相对于传统的版本控制,具有如下优点:

更轻松的管理。传统的版本控制系统使用集中式的repository,一些和 repository相关的管理就只能由管理员一个人进行。由于采用了分布式的模型,Mercurial中就没有这样的困扰,每个用户管理自己的 repository,管理员只需协调同步这些repository。更健壮的系统。分布式系统比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。对网络的依赖性更低。由于同步可以放在任意时刻进行,Mercurial 甚至可以离线进行管理,只需在有网络连接时同步。


Mercurial 里的元素Revision

在使用Mercurial的系统中每个改动隔离在各自的repository 里,既避免把不相关的代码混杂起来, 又便于一个接一个的测试每一部分工作,用户做的每个改动称为一个revision。一般会有一个所有用户都可以访问得到的 repository 保存了项目的“主要”版本,工作repository是用户自己做事情的地方,实现新的特性,修改漏洞,重构,实验等,当完成改变后,你可以 push 到共用的 repositor y中,即完成了一个revision。

Changeset

一个或多个文件的改变集合在一起形成一个逻辑单元,称为changeset。每一个 changeset由两部分内容描述,版本号和 changeset 标识,例如:

changeset:207:58e4906e69e3 

 

冒号前面的数字代表版本号,它用来标识本地changeset。这个版本号只有在用户的本地repository中才有意义。冒号后面的那个很长的十六进制串是 changeset标识,它是确定changeset的全局唯一标识符, 在所有包含这个 changese 的 repository中都相同。多个用户之间讨论changeset,一般使用这个 changeset 标识,而不是上面说的版本号,因为完全有可能每个用户的 repository中同样的 changeset 版本号不同。

Head

Head 表示 repository中每个分支最新的 revision,通常在合并几个分支时会用到这个概念。

Tip

Tip 是最新的一个 changeset的版本号的一个别名。在命令中任何使用版本号的地方都可以使用 tip 来代替最新的changeset的版本号。Tip在各个repository中是不同的,同时一个repository 中只有一个 tip。

Log

Log 命令按时间顺序从近到远的记录着在repository 中发生的每一次事件。可以通过指定-v诊断输出选项来获得更多更详细的历史信息,或者指定—debug选项来获得历史信息中的一切细节。

Mercurial的操作(hg)Mercurial通过hg命令加上关键字来尽进操作,可以远程同步、上传代码。


用法 

拷贝(同步)源码并提交修改: 

$ hg clone repository(这里repository是源码的地址) 

$ cd hello 

$ (edit files) 

$ hg add (new files) 

$ hg commit -m 'Mychanges' 

$ hg push 

创建新的hg项目,并提交: 

$ hg init(project-directory) 

$ cd (project-directory) 

$ (add some files) 

$ hg add 

$ hg commit -m 'Initialcommit'

Mercurial-SpectreMercurial- Spectre

最近更新: 6.43b

Windows下的基本操作以下使用大多基于命令行形式,版本是1.2.11

因为本地即是版本库的服务端也是版本库的客户端,所以首先得区分好版本库和工作目录两个概念,版本库存放了所有的版本,工作目录只是某个特定的版本,这个概念同svn是一致的,只是svn的版本库不在本地,而在集中的一台服务器上。

hginit创建新仓库,版本库的文件放在一个.hg的文件夹下面

hg add添加未版本化的文件

hg commit提交修改,使用-m填写comments,同svn是一样的

hgtip查看当前版本库的最新版本,注意:不是当前工作目录的最新版本。tip是版本库最新版本的意思

hgparents查看当前工作目录的最新版本,如果这个版本有多个parent,会显示出来,如果没有则不显示。parent是指某个版本的前一个版本,如果某个版本通过两个版本merge而来,则会出现多个parents。mercurial还不支持超过两个的parents,也就是说只能将版本两个两个的合并,合并3个版本需要操作2次,合并4个版本需要操作3次,依次类推,如果碰到8个版本需要合并,则需要合并7次...

hgclone克隆一个版本库到本地,当项目开始的时候,建议在一台电脑上init项目后,然后大家从他那clone出来,而不是各自init。

hg pull从另一个版本库更新版本到本地

hgpush将本地版本库更新到其他版本库中,其他版本库需要开通ssh服务,Windows下需要cygwin来启动ssh,linux下用openssh实现。Windows客户端连接ssh服务器时,需要在mercurial.ini的ui段配置,如下

[ui]

ssh = "C:\ProgramFiles\TortoiseHg\TortoisePlink.exe"

putty.exe 无法配合hg使用。

TortoisePlink.exe对于ssh://xx/ 之后的路径需要再加一个"/" 以示根路径,如下:

ssh://192.168.107.129//home/arthur/hg/hello

hgincoming将本地版本库同其他版本库进行比较,看看有哪些changeset在其他版本库中可以pull过来

hgoutgoing将本地版本库同其他版本库进行比较,看看有哪些changeset可以push到其他版本库中

hgupdate更新工作目录,默认参数是tip,参数也可以是版本号、tag名字、branch名字。svn中的切换branch/tag通过这个命令来实现

hgtag制定一个永久的版本号,tag存放在.hgtags文件中,这个文件也需要版本化

hgbranch显示当前branch,或者新建一个branch,默认的branch名字是default。

hg diff对比版本间的差异

hg merge合并版本到当前工作目录,hgpull之后会提示hg update,hg update之后如果提示hgmerge,这时候的merge是在最新版本的基础上进行的merge,merge之后所作的修改需要通过commit来生成新的版本号。

合并branch : hg mergebranchname ,先确认hg branch是什么再执行这个命令。

当一个branch的历史使命完成的时候,这时候需要决定是基于这个branch新开一个branch,还是在某个之前的版本开立branch.default是一个没有创立任何branch时的默认branch名字。

如果希望继续工作在defaultbranch下,则需要先hg update default,然后再考虑需要合并哪些版本到default里面,之后就可以在default下一直工作了。

对于开了多个branch需要合并到default时,需要一个个branch来合并,诸如这样:

hg merge foo

hg merge bar

hg ci -m "merge fooand bar to default

"

在windows下,如果安装了beyondcompare,会自动被调用出来。

显示三个窗口:本地文件、基文件((在分支分开前的最后一个版本))、其他文件(外来的文件)。这种合并模式同svn是一样的。

merge做完之后,需要hgci提交修改,这时可以看到tip 信息中的parent有两个,表明是从两个版本中merge过来的。

beyondcompare对于冲突有三个基本选项:Take left, take center, takeright,分别对应以上三个文件的内容。还有其他几个选项也很容易明白。有冲突时还可能需要手工输入内容。

另外,如果我们没有安装图形合并程序,我们就会开启文本编辑器来访问需要合并的文件。用手工来做这些事情是非常容易出错并且繁琐的。 最好是退出编辑器并用hgrollback指令来清除["Pull"]带来的改变,然后安装合并程序,再做一次。

hgheadshead指的是没有儿子chaneset的changeset,也就是版本树的叶子节点,多个叶子节点可以进行合并为一个叶子, branchheads指那些给了tag但还没有儿子changeset的changeset。 用hg heads显示当前库所有的heads ,如果存在多个heads则说明有多条并行开发的路径,这时需要考虑是否需要合并。

hg serve -n"hellohg" -p 80运行网络服务。之后可以通过hg pull http://localhost/hellohg来下载这个版本库。这是一个临时性的便捷的提供pull版本库服务的方法

hgexport导出changeset,默认导出tip,需要用重定向来导出到文件中,之后这个文件可以通过邮件附件发出,这样可以实现无网络连接状态下的版本同步

hg import导入changeset


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐