リビジョン指定のショートカット

posted by Steve Losh on October 5, 2009

Mercurial のコマンドの多くは、作業対象のリビジョンを指定できるようになっています。 例えば、 hg update REV は リビジョン REV への更新を意味し、 また、 hg diff -c REV はリビジョン REV での変更点を表示します。

Mercurial へ対象リビジョンを指示するには、 ローカルリビジョン番号で指定するのが最も一般的です。 例えば、 hg update 30 は作業ディレクトリをリビジョン 30 へ更新します。

指定したいリビジョン番号があらかじめ分かっていれば(あるいは hg log を見て探すのを厭わなければ)これでかまいませんが、 Mercurial にはこの手間を省くショートカットがいくつか用意されています。

ハッシュ値

あなたがよく使うリビジョン番号は自分のローカルリポジトリでのみ有効です。 普段はそれで問題ありませんが、 もし他の人と特定のリビジョンの話をするような場合は、 そのリビジョン 固有のハッシュ値 を識別子に使う必要があります。

リビジョンのハッシュ値を調べるには hg log を使います — リビジョン番号の右側に表示されているのがハッシュ値です。例:

$ hg log -r 30
チェンジセット:   30:f7744f53cf93
...

この場合、 f7744f53cf93 がハッシュ値です。他の誰かと話をする場合は、 この値を使ってください。

タグ

リビジョン番号を指定できる箇所はどこでもタグ名を使えます。 リビジョン 30 を指す 1.0 という名前のタグがあれば、 hg update 1.0hg update 30 と同じ意味になります。

名前つきブランチの名前

(hg branch branchname で作成した)名前つきブランチを使っている場合は、 リビジョン番号の代わりに branchname を指定できます。これは、 「 branchname ブランチへコミットした最新リビジョン」の省略表記です。

ブランチを頻繁に往き来している時などは、この表記はとても重宝します:

$ hg update feature-branch
... 新機能に取り組む ...
$ hg commit -m '新機能の一部を追加。'
$ hg update default
... デフォルトブランチで致命的な問題を修正 ...
$ hg commit -m 'サーバーを炎上させてしまうバグを修正。'
$ hg update feature-branch
... 新機能ブランチで残りの作業を進める ...

この表記はマージする時にも便利です。 (hg merge はマージ対象のリビジョンを指定できるのだよ):

$ hg update default
$ hg merge --rev feature-branch
$ hg commit -m '新機能をマージ。'

現在の親

リビジョン指定のもっと分かりにくい表記として、 . が挙げられるでしょう。 これは「現在の作業ディレクトリの親」という意味です:

$ hg commit -m 'とある変更が完成した。'
$ hg log --change .
... 今コミットしたばかりのリビジョンの変更点を表示  ...
$ hg diff --rev 12:.
... リビジョン 12 から今コミットしたリビジョンまでの差分を表示 ...
$ hg update -C .
... 同じリビジョンに留まったまま、作業ディレクトリのコミットしてない
    変更をぶっ飛ばす ...

tip の祖先

リビジョンにマイナスの数字を指定すると、「リポジトリの tip から数えて X 番前のリビジョン」を意味します。 -1 は tip を、 -2 は tip の親、 というようにです。

この方法はマージが絡むとややこしいことになりますが、 単に tip から数リビジョン前へ戻る必要がある場合などでは有用です。

その他

リビジョンの指定仕方はまだまだあります。詳しくは hg help revisions をチェックしてください。

あなたが Mercurial を使ってみている git ユーザーで、 revision^ 表記が無くて困っている場合は、 parentrevspec エクステンション をチェックしてください。 このエクステンションは revision^ 表記を Mercurial へ追加します。

いつも数字で指定する必要はありません — Mercurial にはとっておきの手がいくつもあります。