便捷的指定版本

作者:Steve Losh
日期:2009-10-05

没有必要总是去使用数字 – Mercurial 还有好多手段藏而待用呢。

大部分的 Mercurial 命令需要你指定一个版本以执行。比如: hg update REV 会更新到版本 REV ,还有 hg diff -c REV 会向你展示版本 REV 的变更。

最普通的方法让 Mercurial 去执行某一个版本便是使用本地版本号。比如: hg update 30 会将工作目录更新到版本 30

如果你知道想要的版本号那是不错了 (或是不介意用 hg log 去找一下),但是 Mercurial 还有许多便捷的方法可以使其变得更容易。

哈希值

在本地代码库里大部分时间你可能只会使用版本号作为指定版本唯一的方式。通常这并没什么问题,不过如果你想告知某人一个特殊的版本时你应该使用 唯一的哈希值 作为那个版本的标识。

你可以通过 hg log 来获得版本的哈希值 – 它显示在版本号的后面。如下:

$ hg log -r 30
changeset:   30:f7744f53cf93
...

在此例中 f7744f53cf93 便是你会用到的哈希值,如果你要告诉某人的话。

标签

你可以在任意能使用版本号的地方使用一个标签名。假如你有一个标签名为 1.0 表示版本 30 ,那么你可以使用 hg update 1.0 获得和 hg update 30 同样的结果。

命名分支

假如你使用过命名分支(通过 hg branch branchname 创建)那么可以使用 branchname 来作为 “branchname 分支的最后一次版本提交” 的版本号的代替。

当你常常要跳转分支使用的时候这会非常的方便:

$ hg update feature-branch
... 从一个新特性开始工作 ...
$ hg commit -m 'Add part of the new feature.'
$ hg update default
... 修正一个默认分支上非常紧急的问题 ...
$ hg commit -m 'Fix the bug that set the servers on fire.'
$ hg update feature-branch
... 再回到之前离开的特性分支上 ...

这在你想要进行合并时也会很有用(记住,hg merge 可以通过一个版本号来劲行合并):

$ hg update default
$ hg merge --rev feature-branch
$ hg commit -m 'Merge in the new feature.'

当前父版本

一个更鲜为人知的指定版本的技巧是使用 . 代替 当前工作目录的父亲版本

$ hg commit -m 'Finish up some changes.'
$ hg log --change .
... 显示你刚刚提交的那个版本的变更 ...
$ hg diff --rev 12:.
... 显示版本12与你刚刚提交之间的不同 ...
$ hg update -C .
... 清除所有工作目录未提交的变更并维持版本的不变 ...

Tip 的祖先版本

如果你使用一个负数代替版本时它意味着 “从代码库的tip版本倒着数的第X个版本” 。 -1 表示tip版本本身, -2 表示tip版本的父版本,依次类推。

这用在你进行合并时可能会显得比较棘手,但假如你只是需要从tip版本向后回溯几个版本的话还是很有用的。

其他诀窍

其实还有很多方法来指定版本,试试 hg help revisions 了解更多。

如果你是个正在尝试 Mercurial 的 git 用户并且需要 revison^ 语法,可以去看看 parentrevspec extension 它向 Mercurial 加入了这个语法。