Mercurial 学习笔记

作者:胡玉新

1   Mercurial 一览: 基础

1.1   安装

Linux

Debian/Ubuntu:

apt-get install mercurial

Fedora Core:

yum install mercurial

Gentoo:

emerge mercurial

...

Windows

下载并安装。

1.2   开始

检查安装是否成功:

hg version

查看帮助:

hg help init

1.3   代码仓库

代码仓库不过是普通一个目录树。

获取代码库的本地拷贝
hg clone http://hg.serpentine.com/tutorial/hello
查看日志
hg log
hg log -r 3                 # 指定修订号
hg log -r ff5d7b70a2a9      # changeset identifier
hg log -r 1 -r 4            # 指定多个修订号
hg log -r 1:3               # 指定修订号范围
hg log -r 3:1               # 修改 log 的输出顺序
获取更多信息

显示详细信息(-v, --verbose):

hg log -v -r 3

显示修改内容(-p, --patch):

hg log -v -p -r 2

1.4   修改和查看修改

用 hg clone 隔离我们的自己修改,值得说明的是:本地克隆不仅速度快,而且通常占用更小的磁盘空间:

$ cd ..
$ hg clone hello my-hello
$ cd my-hello

Note

一般情况下,最好保持远程代码库的一个原始拷贝,你可以从这里克隆多个副本进行修改,各个副本之间互相隔离。

查看修改:

$ hg status
$ hg diff

1.5   提交修改

设置用户名

修改配置文件:

[ui]
username = Your Name<Your Email Address>
linux

编辑 .hgrc, 按照前面的说明修改。

Windows

编辑 %USERPROFILE%Mercurial.ini。

如何找到 %USERPROFILE%:

  • 打开命令行, 缺省的目录通常就是 %USERPROFILE%, 或者用 ECHO %USERPROFILE% 查看
  • 也可以在打开文件的对话框中直接输入 %USERPROFILE%Mercurial.ini
Mercurial 尝试用户名的顺序
  1. hg commit -u "用户名"
  2. HGUSER 环境变量
  3. ~/.hgrc 中的 usernamme
  4. EMAIL 环境变量
  5. 本地用户名 + 主机名
提交信息

由于 hg log 只显示提交信息的第一行,因此最好第一行写得完整、独立。

查看刚才的提交
hg tip -vp

1.6   共享修改

从其他代码库获取修改

查看其他代码库做了那些修改:

hg incomming ../my-hello

获取代码库的修改:

hg pull ../my-hello
更新工作目录

hg pull 更新了代码库,如果要更新工作目录,还需要执行:

hg update

hg pull 的 -u 参数可以获取代码库的修改的同时更新工作目录:

hg pull -u ../my-hello

更新到指定修订版:

hg update 2

[?]查看 parents 修订版:

hg parents
把修改发布到其他代码库

查看本地代码库做了那些修改:

hg outgoing ../my-hello

发布代码库的修改:

hg push ../my-hello
通过网络共享修改
hg outgoing http://hg.serpentine.com/tutorial/hello
hg push http://hg.serpentine.com/tutorial/hello

2   Mercurial 一览: 合并修改

2.1   合并

合并步骤,注意查看后面的说明:

hg pull ../my-hello           # 现在代码库有多个 heads
hg heads                      # 查看代码库的 heads
#! hg update                   # 失败! 无法更新工作目录
#! hg update -C                # 强制更新! 会丢失本地修改
hg merge                      # 合并修改
hg parents                    # 可以看到多个 parents
hg commit -m 'Merged changes' # 提交合并结果

3   幕后

和许多版本控制系统不同, Mercurial 的基础概念简单到很容易理解软件是如何工作的。

3.1   Mercurial 的历史记录

跟踪单个文件的历史

Mercurial 把文件保存在文件日志中,文件日志保存在 .hg/store/data 目录。

对于大文件来说,文件日志保存在两个文件中 .d (数据)文件 和 .i (索引)文件, 对于小文件来说只需要一个 .i 文件。

安全高效的存储
高效存储

采用增量机制。

安全操作

Mercurial 只在文件末尾增加数据。另外 Mercurial 把每次写操作作为事务的一部分,保证操作的原子性。

快速读取

采用索引文件。

3.3   工作目录

工作目录保存代码库的一个快照。

4   Mercurial 常用用法

4.1   添加文件

hg init add-example
cd add-example
echo a > a
hg status
hg add a
hg commit -m 'Added one file'
hg status

4.2   Mercurial 跟踪的是文件,不是目录

Mercurial 跟踪的是文件,不是目录, 因此无法添加一个空目录, 需要空目录时有下面两个方法。

方法一: 添加一个隐含文件:

mkdir empty
touch empty/.hidden
hg add empty

方法二: 不要跟踪空目录,要空目录干嘛?需要时自己创建一个得了。

4.3   停止跟踪文件

hg remove
hg remove --force           # 移除已修改/刚添加的文件
hg remove --after           # 文件已经删除时,可以用

4.4   方便的添加/移除文件命令

添加未添加的文件,移除已经删除的文件:

hg addremove

4.5   拷贝文件

太麻烦了,不用也罢。

4.6   重命名文件

重命名文件使用拷贝文件的方式实现的,相当于拷贝文件并并删除原文件。

重命名也是比较麻烦的, 因此也要少用。

5   协同工作

5.1   Mercurial Web 接口

简单服务器:

hg serve -p 8080

5.2   协作模型

有了合适的工具后, 采用何种工作流是一个文化问题而不是技术问题。 Mercurial 没有太多限制工作流, 因此需要你和你的工作组来确定适合你们自己需要的工作流。

需要考虑的因素

...

6   发布管理和分支管理

hg tag v1.0
hg tag -r 1 v1.1
hg tag -f -r 2 v1.1
hg log -r v1.0
hg tag --remove v1.1
hg tag -r 3 -l 1.1.1        # 本地 tag

分支示例:

myproject
  myproject-1.0
    myproject-1.0.1
      myproject-1.0.1-bugfix
  myproject-new-feature

合并示例:

hg pull ../myproject-new-feature
hg merge
hg commit -m 'Merge bugfix from 1.0.1 branch'
hg push

7   发现和改正错误

7.3   rollback 的限制

  • 一旦 push 后, rollback 就没用了
  • 只能 rollback 一次

7.4   hg revert

示例:

hg revert foo               # 放弃对 foo 的修改

hg add bar                  # 错误添加了文件 bar
hg revert bar               # 取消添加
hg remove file              # 错误删除了文件 file
hg revert file              # 好的,恢复了
rm file                     # 错了,删错了
hg revert file              # 好的,恢复了
hg copy file newfile        # 错了
hg revert newfile           # 改正就行了
hg rename file newfile      # 错了
hg revert newfile           # 知错就改

7.5   hg backout

复杂的应用

8   定制 Mercurial 的输出

hg log --style compact
hg log --style changelog
hg log --template 'I saw a changeset: {desc}\n'

常用关键字:

  • author
  • branches
  • date
  • desc
  • files
  • filet_adds 添加的文件列表
  • filet_dels 删除的文件列表
  • node
  • parents
  • rev
  • tags

9   应用实例

9.1   用 mercurial 管理你的系统

cd /
sudo hg init
sudo sh -c "echo -e 'syntax: glob\n*' > .hgignore"
sudo chown -R xxx\: .hg .hgignore

10   其他

10.1   FAQS

查看信息
如何知道当前使用的用户名

查看当前用户名:

hg showconfig ui.username
hg debugconfig ui.username          # debugconfig -- alias of showconfig
查看工作目录的信息
hg parent           # 查看工作目录的信息
hg id -n            # 查看工作目录的修订版号
导出特定版本
hg archive -r ...
清空工作目录
hg update null
backout

xs

10.2   配置文件

查看配置文件的帮助:

man hgrc

10.3   选项

  • -v, --verbose
  • -q, --quiet
  • -p, --patch
  • -r, --rev

10.4   中英文对照

英文 中文 说明
repository 代码仓库  
pull 获取  
push 发布  

MercurialNote (last edited 2009-12-25 07:16:06 by localhost)