Mercurial: "Managing releases and branchy development" を読む
Tagged:  •    •  

今回は "8 Managing releases and branchy development" を読みます。

8.1 Giving a persistent name to a revision

ブランチの話の筈が、まずは「タグ」に関する説明です。

Mercurial での「タグの付与」は、 チェンジセット1つ分を使用して履歴として記録されます (「タグの付与」時点で自動的に commit されるそうです)。

8.1.1 Handling tag conflicts during a merge

Mercurial では、タグの一覧が .hgtags ファイルに格納されますが、 タグの解析時には最新のリビジョンの情報を参照するのだそうです。 おそらく性能上の理由なのでしょうが、 .hgtags は永続化に使用して、 各リビジョンの履歴情報をキャッシュ代わりにしているのでしょう。

そのため、 何らかの理由(例えばマージの際の衝突等)で .hgtags を修正する必要に迫られた場合は、 あらかじめ hg tags コマンドで修正内容の妥当性を確認して欲しい、とのことです。

8.1.2 Tags and cloning

この節の内容は、図が無いとわかりづらいかもしれません。

前述のように、「タグの付与」はチェンジセットを1つ消費します。

「タグの付与」がある履歴

hg clone の際に "-r X" オプションでタグ名を指定した場合、 タグ X が指すチェンジセット 1 までが複製対象となりますから、 指定したタグ名に関する「タグの付与」チェンジセットが含まれません。

複製対処となるチェンジセット

結果として、 タグ名を指定した hg clone で得られるリポジトリには、 複製に用いたタグ名の情報は含まれないことになります。

私自身は面倒くさがりなので、 転送量に顕著な差がなければきっと全 pull してから update しますから、 そうそうはまりそうな落とし穴ではないと思いますが、 確かにはまった時にぎょっとしそうな気はします。

8.1.3 When permanent tags are too much

他のリポジトリからは見えない(= 伝播しない) ローカルなタグが付けられる、というのは便利ですね。

8.2 The flow of changes―big picture vs. little

「巨視的なブランチ」と「微視的なブランチ」という概念を導入することで、 同じように「ブランチ」と呼ばれるものにも実は違いが有るのだ、 ということを説明するのがここでの主題です。

CVS や Subversion における、 比較的寿命が長いブランチに相当するものを「巨視的なブランチ」、 Mercurial において他の開発者の成果を hg pull した際に、 一時的に手元のリポジトリのヘッドが複数になる状況に相当するものを 「微視的なブランチ」と定義しています。

8.3 Managing big-picture branches in repositories

CVS や Subversion でのブランチ (=「巨視的なブランチ」)はリポジトリ内に作成されますが、 Mercurial のような分散リポジトリ形式の SCM ツールの場合、 「いっそ巨視的なブランチごとに(開発者の成果を集約する) リポジトリを分けてしまった方が簡単」だそうです。

確かに、主開発とブランチの間で、 お互いの成果が混在したりする危険が無くなるわけですから、 なかなか魅力的な提案ではあります。

8.4 Don’t repeat yourself: merging across branches

「でも同じ修正を繰り返すのは嫌なので、 必要に応じてブランチでの変更を主開発側にマージしてね」だそうです。 確かに。

8.5 Naming branches within one repository

開発メンバーが more in the "power user" category ならば、同一リポジトリに複数のブランチが混在していても大丈夫、 とのことですが、 そもそも "power user" という括りはどの程度のレベルを指しているのでしょうか?

"hg branch ブランチ名" で指定したブランチ名が、 次回の commit 操作時にチェンジセットに記録され、 ブランチ名の付いたチェンジセットから派生するチェンジセットは、 同じブランチ名を継承するのだそうです。

hg commit にブランチ名指定のオプションがあった方が良い気がするのですが、 どうなんでしょうか?

8.6 Dealing with multiple named branches in a repository

履歴をツリー化した場合に、 枝から枝へ移動するような場合には、 hg update-C オプションを付けなければなりませんよ、 というお話。

8.7 Branch names and merging

Mercurial では、 hg merge コマンド実行時に、 実行時の作業領域ディレクトリの親リビジョンを第1親、 コマンドに(暗黙の tip 指定も含めて)指定されるリビジョンを第2親とみなし、 タグ名を引き継ぐのは第1親からのみなのだそうです。

cvs update -j rev と理屈は一緒ですね。

8.8 Branch naming is generally useful

ブランチは便利だね、というお話。


以上で "8 Managing releases and branchy development" 節は終了です。

分散型リポジトリの場合、 ちょっとやそっとの間違いをしても、 共有用のリポジトリへの反映さえ行わなければ、 集中型リポジトリよりも圧倒的にやり直しが簡単なのですが、 間違えた際の手法をより深く理解をすることで、 心理的な抵抗を更に下げることができるのではないでしょうか。 ということで、次回は "9 Finding and fixing your mistakes" を読んでみようと思います。


"Distributed revision control with Mercurial" 関連エントリの一覧は、BOSBook(Bryan O’Sullivan Book)タグで参照できます。