リビジョンの指定に関するあれこれ

Bazaarで、リビジョンを指定してコマンドを実行するというのはごく日常的な操作なわけですが、その指定方法にもいろいろなパターンがあります。今日はその辺をざっくりまとめたいと思います。

基本のはなし

コマンドによって、リビジョンを1つだけ指定できるものと、2つ指定(範囲指定)できるものがあります。(リビジョンを指定できないものもありますが、それは今回は置いときます)
リビジョンを2つ指定するときは、以下のように「..」でつなげて指定します。

# rev1001と1002を比較(rev1002で変更された内容を表示)
$ bzr diff -r 1001..1002
リビジョンを指定する際に、さまざまなセレクタを使用することができます。たとえば、「今日最初にコミットしたリビジョン」を指定したければ、"date:"というセレクタを使って以下のように指定します。
# 今日最初のコミット以後に作業ツリー上で変更された内容をリストアップ
$ bzr status -r date:today
このあたりについてのヘルプは、以下のコマンドで見ることができます。
$ bzr help revisionspec

セレクタいろいろ

bzr標準のセレクタとそのユースケースをいろいろとみてみます。

なし

何もセレクタを指定しなければ、リビジョン番号での指定になります。マイナスの数値を指定すると、最新のリビジョンから遡っての指定になります。(-1が最新リビジョン、-2がそのひとつ前、・・・)

#直近の10リビジョンのログを表示する
bzr log -r -10..-1

revid:

リビジョンIDでの指定です。

# 作業コピーを一時的に指定したリビジョンに戻す
bzr update -r revid:harrypotter@hogwarts.edu-20111205225339-15f22axe6bih1vuh

submit:

親ブランチの最新リビジョンを指します。これは主に、以下のような用途でstatusコマンドやdiffコマンドなどと一緒に使われます。

switch colo:feature-foo
#上図のリビジョンEとリビジョンZを比較する。
# → feature-fooをtrunkにマージしたときに反映される予定の変更内容を前もって確認する

bzr diff -r submit:..-1

branch:

指定したブランチの最新リビジョンを指します。

switch colo:feature-foo
# trunkの最新リビジョンとfeature-fooの最新リビジョンを比較する
bzr diff -r branch:colo:trunk..-1

ancestor:

指定したブランチと、現在のブランチとの分岐点となったリビジョンを指します。

# feature-fooブランチの、trunkとの分岐点(C)から最新(Z)までのログを表示する
switch feature-foo
bzr log -r ancestor:colo:trunk..

date:

指定された日付以降(その日を含む)の最初のリビジョンを指します。

# 12/6(の最初のコミット)時点まで履歴を巻き戻す
bzr pull . -r date:2011-12-06 --overwrite
ヘルプによると、日付の代わりに"today"、"yesterday"、"tomorrow"という文字列を指定することもできるみたいです。
しかしtomorrowにいったいどんな使い道があるというのか・・・

tag:

タグでリビジョンを指定します。

# release-1.0.1をzipでクレ
bzr export release-1.0.1.zip -r tag:release-1.0.1 --format=zip

before:

指定されたリビジョンのひとつ前のリビジョンを指します。ほかのセレクタとの組み合わせで使います。

# 12/6の朝イチの時点まで履歴を巻き戻す
bzr pull . -r before:date:2011-12-06 --overwrite

annotate:

指定したファイルの、指定の行が変更されたリビジョンを指します。

# foo.pyの101行目を変更したリビジョンの詳細情報を見る
bzr log -r annotate:foo.py:101

revno:

リビジョン番号での指定です。まあ普通はわざわざ使いませんね。

last:

last:1で最終リビジョン、last:2でそのひとつ前、・・・という意味になります。
わざわざこれを使わなくても、リビジョン番号にマイナスを指定すればいいだけなので、出番はあまりありません。

セレクタのカスタマイズ

上記以外にも、プラグインを使うことで独自のセレクタを追加することができます。
たとえば、bzr-svnプラグインをインストールすると、SVN側のリビジョンで指定するための"svn:"というセレクタが追加されます。

それでは、試しに "christmas:"セレクタを実装する bzr-christmasプラグインを作ってみましょう。
と思ったんですが、激しく二番煎じ感がただよう上にそろそろタイムアップなので、今日はこの辺でお開きにしたいと思います。

まあ正直、リビジョンの指定に関してはGit、Mercurialの方がパワフルですねえ。

明日はshelveコマンドの話でもしようかな。