tiplogプラグインを使ってみる

Gitには、reflogというコマンドがあって、ブランチのHEADがどのように移動してきたかを確認することができます。rebaseに失敗したときとか、間違えてresetしすぎちゃったときとかに復元するのに、とても便利(だそう)です。

Bazaarにはそういうの無いの?と思ったら、bzr-tiplogプラグインというプラグインがありました。

(参考)bzr headsコマンド

間違えて消しちゃったり、上書きしちゃったリビジョンを探すための機能としては、bzr headsというコマンドがあります。このコマンドは、リポジトリ内を走査して、削除済みのものも含めた全てのHEADリビジョンをリストアップできるコマンドです。
上記のような失敗から復元するときには、まずこのheadsコマンドを使うのですが、これは「リポジトリを走査」なので、リポジトリサイズに応じた時間がかかります。

これに対してtiplogコマンドは、フックの仕組みを使ってHEADの移動を検出し、あらかじめ記録しているので、高速に参照することができます。

インストール

以下のコマンドで、コードが取得できます。

$ bzr branch lp:bzr-tiplog tiplog
あとは、できたtiplogフォルダをBazaarのプラグインフォルダに配置してください。

使いかた

ログを見る

ブランチ上で以下のコマンドを実行すると、HEADの移動履歴を見ることができます。

$ bzr tiplog
でも、入れたばっかりだと何も表示されません。
とりあえず、tiplogをインストールした状態で、色々操作してみます。
$ bzr commit -m "コミットA" --unchanged
$ bzr commit -m "コミットB" --unchanged
$ bzr commit -m "コミットC" --unchanged
$ bzr uncommit -r -3 --force
で、もう一度tiplogコマンドを実行してみると、こんな感じのログが出力されます。
$ bzr tiplog
12/19/11 tip:0 2 malfoyfoy@hogwarts.edu [uncommit] コミットA
12/19/11 tip:1 ??? malfoyfoy@hogwarts.edu [commit] コミットC
12/19/11 tip:2 ??? malfoyfoy@hogwarts.edu [commit] コミットB
12/19/11 tip:3 2 malfoyfoy@hogwarts.edu [commit] コミットA
tip:0が現在のHEAD、tip:1がひとつ前のHEAD、ということになります。コミットA→コミットB→コミットCと来て、最後にuncommitでコミットAに戻った、ということが分かります。

コマンドへのリビジョン指定につかう

このプラグインをインストールすると、tip: というrevisionセレクタが追加されます。これを使って、例えば以下のようにコマンドを実行することができます。

# 今実行したpullコマンドによって追加されたリビジョンを表示する。
$ bzr log -r tip:1..-1
※最後に実行したのがpullコマンドだとすると、tip:1はpull直前のHEADリビジョンを指しています。このリビジョンと、現在のリビジョン(-1)で範囲指定することで、pullコマンドで取り込まれたリビジョンをリストアップできます。

ユースケース

pullコマンドで取り込んだ変更内容をチェックしたい。

# pull前のHEADリビジョンがtip;1に設定されているので、そのリビジョンと現在のリビジョン(-1)を比較することで、pullコマンドで取り込まれた変更をチェックできます。
# bzr diff -r tip:1..-1

間違ってuncommitしてしまった。uncommit自体を取り消したい。

# このuncommitを無かったことにします。
$ bzr uncommit -r -3 --force
# uncommit前のHEADリビジョンがtip:1に設定されているので、そのリビジョンを指定してpull --overwriteを実行します。
$ bzr pull . -r tip:1

間違ってuncommitしてしまった。3つのコミットを消したが、最後のひとつだけ元に戻したい。

# このuncommitで消した最後の1リビジョンだけを復元します。
$ bzr uncommit -r -4 --force
# uncommitで消えたリビジョンをリストアップして、戻したいリビジョンのIDを確認します。
# 以下のコマンドで、現在のリビジョン(-1)からuncommit前のHEADまでのログを表示します。下から2番目が目的のリビジョンになります。
$ bzr log --short -r -1..tip:1 --show-ids
Draco Malfoy 2011-12-20
revision-id:malfoyfoy@hogwarts.edu-20111219203905-yfdadjv4ecb3hboq
フォイフォイフォイフォイ

Draco Malfoy 2011-12-19
revision-id:malfoyfoy@hogwarts.edu-20111219033010-8d32ba0aqm1kmm49
フォイフォイフォイ

Draco Malfoy 2011-12-19
revision-id:malfoyfoy@hogwarts.edu-20111219032541-pkey8xsk5hxlyfak
フォイフォイ

2 Draco Malfoy 2011-12-19
revision-id:malfoyfoy@hogwarts.edu-20111219032534-ami06ew8q1im8dta
フォイ

# IDが分かったら、以下のコマンドでそのリビジョンまでを復活できます。
$ bzr pull . -r revid:malfoyfoy@hogwarts.edu-20111219032541-pkey8xsk5hxlyfak

こんな感じで、なかなか便利に使えるんじゃないでしょうか。