今更だけどbzr-coloの話をするよ(基本編)

GitやMercurialの場合は、ブランチ構成は.gitや.hgフォルダの中に隠蔽されていますが、Bazaarの場合は個々のブランチは物理的に別ディレクトリになっています。

それがBazaarの特色であり、メリットも多いのですが、やっぱりGitやMercurialみたいにひとつのディレクトリで完結する形で作業したいよ、という人のために、「bzr-coloプラグインというのがあります。

このbzr-coloの機能、近くBazaar本体に取り込まれることになってまして、それに伴ってコマンド体系や仕様が変わる可能性が高いので、今更感はあるんですが、使い方を説明します。
こっちも十分に便利ですし、本体に取り込まれた後もしばらくそっちは様子見フェイズになると思いますし。

ワークスペースを作る

サーバ上のブランチをコピーして、ローカルにワークスペースを作ります。

$ bzr colo-fetch url/to/remote/branch MY-COLOCATED-WORKSPACE
$ cd MY-COLOCATED-WORKSPACE
何も指定しなければ、デフォルトで "origin/trunk" というブランチが作成されています。
ワークスペース内にどんなブランチがあるのかは、colo-branchesコマンドで見ることができます。
$ bzr colo-branches
* origin/trunk

ブランチを作って作業する

foo機能を実装することになりました。foo機能実装用のブランチを作ります。
colo-branchコマンドを使います。

$ bzr colo-branch feature-foo
これでブランチが作成されました。ブランチ一覧を見ると、こうなっています。"*"はカレントのブランチの印ですね。
この状態でコードを修正してコミットすれば、feature-fooブランチにコミットされます。
$ bzr colo-branches
* feature-foo
origin/trunk

別のブランチに切り替える

foo機能を開発しているうちに、関係ない部分で緊急の不具合を見つけてしまいました。すぐに修正できる内容ですが、feature-fooブランチ上で修正をするのは行儀が悪いですし、foo機能が完成するまで不具合修正もリリースできなくなってしまいます。
そのため、別のブランチを作って、そっちで作業します。

# 現在の作業内容を退避
$ bzr shelve --all -m "feature-fooでの作業を一時保存"
# fix-bugブランチを作ってそっちに切り替え
$ bzr colo-branch fix-bug --from-branch=origin/trunk
$ bzr colo-branches
feature-foo
* fix-bug
origin/trunk
・・・HACK, HACK, HACK・・・
$ bzr commit -m "○○の件を修正した"

不具合修正が終わったら、trunkにマージしてアップします。
switch、merge、push、pullなどのコマンドは、引数として処理対象ブランチのパスを受け取りますが、ここで以下のように「colo:ブランチ名」と書くことで、coloワークスペース内のブランチを指定することができます。

# origin/trunkに切り替えて、サーバから最新のコードを取得
$ bzr switch colo:origin/trunk
$ bzr pull url/to/remote/branch
# fix-bugからマージしてコミット
$ bzr merge colo:fix-bug
$ bzr commit -m "○○の件の修正をマージ"
# サーバにアップ
$ bzr push url/to/remote/branch
# マージがすんだらfix-bugブランチはもういらないので、削除
$ bzr colo-prune fix-bug

不具合修正が片付いたので、foo機能の実装にもどります。

$ bzr switch colo:feature-foo
# 退避した作業内容を復元
$ bzr unshelve
・・・HACK, HACK, HACK・・・

と、bzr-coloを使った基本のワークフローはこんな感じです。

明日は、bzr-colo応用編の予定。