bzr分散型の共用のメインラインのワークフローのまとめ

http://doc.bazaar.canonical.com/bzr.2.1/ja/user-guide/distributed_intro.html

全体概要

共用のメインラインのローカルコピーであるミラーブランチを挟むことを無視するならば、共用のメインラインのワークフロー開発とは……。
「bzr mergeによって共用メインラインから変更を取得し、bzr mergeによって共用メインラインへ変更を送る」
というものである。

複数人が共用メインラインに対してマージを行ったとしても、共用メインラインとある一人の作業者が持つブランチのみを着目すれば1:1のマージを行っているだけにすぎない。

準備するブランチ

中心ブランチ

svnで言うレポジトリ。いわゆるメインライン。
全ユーザから見えるサーバ上に置かれ、各ユーザの修正はここに集約され配布される。

ミラーブランチ

ローカルマシンに置かれた、(ほとんどの瞬間において)中心ブランチのそのままのコピーであるブランチ。
中央ブランチを親に持つブランチである。
これが存在することで、ネットワークの向こう側にある中央部ランチにアクセスすることを最小限にすることができる。

機能ブランチ(開発ブランチ)

実際に新たな機能を組み込み、バグFIXなどの修正をかけるブランチ。
ミラーブランチを親に持つブランチである。

開発のワークフロー

svn updateに該当する作業

1.ミラーブランチを最新にする
 | ミラーブランチ$ bzr pull
 によって、中央ブランチの最新の状態をミラーブランチに反映させる。

2.最新の状態を機能ブランチに反映させる
 | 機能ブランチ$ bzr merge
 | 機能ブランチ$ 《衝突が発生した場合はそれを解消する》
 | 機能ブランチ$ bzr ci -m "サーバ最新の取り込み"
 によって、ミラーブランチ(=中央ブランチの最新の状態)の内容から、
 機能ブランチに取り込まれていない修正を機能ブランチに反映させる。

※上記の2つの作業は、gitやmercrialではpullの1コマンドで行えるようになっている。
 しかしこの2つを1手順にしようとするとどうしても、衝突が発生した場合に
 直感に反する複雑な処理が必要になる。そのためbzrではこれらのコマンドは1つに纏まっていない。

svn commitに該当する作業

1.ミラーブランチを最新にする
 | ミラーブランチ$ bzr pull
 によって、中央ブランチの最新の状態をミラーブランチに反映させる。

2.ミラーブランチに機能ブランチの修正を取り込む
 | ミラーブランチ$ bzr merge 《機能ブランチ》
 | ミラーブランチ$ 《衝突が発生した場合はそれを解消する》
 | ミラーブランチ$ bzr ci -m "《機能ブランチで行った修正内容》"
 によって、機能ブランチの修正内容をミラーブランチに取り込む。

3.中央ブランチに変更を送る
 | ミラーブランチ$ bzr push
 によって、(先ほどミラーブランチに取り込んだ)機能ブランチで行われた修正を、
 中央ブランチに反映させる。