Shortcuts for Specifying Revisions

posted by Steve Losh on October 5, 2009

A lot of Mercurial commands allow you to specify a revision to act on. For example: hg update REV will update to revision REV, and hg diff -c REV will show you the changes made by revision REV.

The most common way to tell Mercurial which revision to act on is to use local revision numbers. For example: hg update 30 will update the working directory to revision 30.

That’s fine if you know the revision number you want to use (or don’t mind looking it up with hg log), but Mercurial has some shortcuts that can make things easier.

Hashes

The revision numbers that you use most of the time are only accurate in your local repository. Usually this isn’t a problem, but if you want to talk to someone else about a particular revision you should use the unique hash of that revision as an identifier.

You can use hg log to look up the revision’s hash — it’s printed right next to the revision number. For example:

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

In this case f7744f53cf93 is the hash you should use if you’re talking to someone else.

Tags

You can use a tag name anywhere you can use a revision number. If you have a tag named 1.0 that points to revision 30 you can use hg update 1.0 and it will have the same effect as hg update 30.

Named Branch Names

If you use named branches (created with hg branch branchname) then using branchname instead of a revision number is shorthand for: “the last revision committed in the branchname branch”.

This can come in very handy when you need to switch branches often:

$ hg update feature-branch
... work on a new feature ...
$ hg commit -m 'Add part of the new feature.'
$ hg update default
... fix a critical problem on the default branch ...
$ hg commit -m 'Fix the bug that set the servers on fire.'
$ hg update feature-branch
... go back to where you left off on the feature branch ...

It’s also useful when you want to merge (remember, hg merge can take a revision to merge with):

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

The Current Parent

One of the more obscure tricks for specifying revisions is using . to say “the current parent of the working directory”:

$ hg commit -m 'Finish up some changes.'
$ hg log --change .
... show the changes made by the revision you just committed ...
$ hg diff --rev 12:.
... show the diff between revision 12 and the one you just committed ...
$ hg update -C .
... blow away any uncommitted changes in the working directory while
    staying at the same revision ...

The Tip’s Ancestors

If you use a negative number as a revision it means “X revisions back from the tip revision of the repository”. -1 means the tip itself, -2 means the tip’s parent, and so on.

This can get tricky once you hit some merges, but it’s useful if you just need to go back a couple of revisions from the tip.

Other Tricks

There are more ways to specify revisions. Check out hg help revisions to learn more.

If you’re a git user trying Mercurial and you miss the revision^ syntax, take a look at the parentrevspec extension which adds that syntax to Mercurial.

You don’t always have to use a number — Mercurial has a lot of tricks up its sleeve.