Mercurialのブランチとマージ

Mercurialemacszsh、global, その他の設定ファイルの管理だけでなく、ソースコードの管理にも本格的に使うようになったこともあり、ブランチやマージの機能も頻繁に使うようになってきた。

このへんの機能を使ってて思うのはやはりCVSSubversionに比べてブランチの作成や切り替え、マージ等の操作が簡単に行えるということ。これはGitについても同じことが言えるが、Gitのコマンドラインインタフェースは個人的にはかなり微妙。

ブランチの一覧を表示

narazuya@bokkko% hg branches
diff3                         30:1946a2e61b7e
default                       23:fd1771eddd50 (inactive)
0.04                          22:3549817de2ba (inactive)
0.03                          12:9a49ae230cf6 (inactive)
narazuya@bokkko%

defaultは最初からある。これをtrunkとして使うのもよし。適当に別のブランチにしてしまうのもよし。

ブランチを作成

そういえば、fdiskだと2TBまでしかパーティションを切れないということを最近知りました。そういう場合はpartedを使います(以下の「parted」はそれとはあんまり関係ない)。

narazuya@bokkko% hg branch parted
narazuya@bokkko% hg ci
narazuya@bokkko% hg branches
parted                        31:5449a8f28a37
diff3                         30:1946a2e61b7e
default                       23:fd1771eddd50 (inactive)
0.04                          22:3549817de2ba (inactive)
0.03                          12:9a49ae230cf6 (inactive)
narazuya@bokkko%     

ちなみにGitは何故commitをciとできないんだと思っていたが、最近、実はaliasを貼ることができるということに気付いた。

~/.gitconfig
[alias]
        st = status
        ci = commit
        co = checkout

ブランチの切り替え

ブランチを切り替えるにはupdateコマンドを使う。Gitだとcheckout。バージョン管理システムって同じコマンドでも意味や用途が全然違う場合があったりするので、覚えるのが結構めんどくさい。特に集中型と分散型ではかなり違うし。しかし、Mercurialのupdateもややこしいけど、checkoutってどうよ。CVSとかSubversion使ってる人には「はあ?」なんじゃないか。まあ、そもそもGitを最初に開発していた人はCVSやSubversionは眼中にないようなので、いいんだろうけど。
ただ、ブランチの切り替えやマージはどっちもCVSSubversionに比べれば圧倒的に楽だ。正直なところ、Subversionで異なるブランチ間のマージはできればあまりやりたくない。

narazuya@bokkko% hg up default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
narazuya@bokkko% 

困るのはどのファイルがupdateされたのかよくわらないということか。どうせなら、こんな風に表示してほしい。

narazuya@bokkko% hg up default
M dtl.hpp
M ChangeLog
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
narazuya@bokkko% 

マージ

ブランチ間のマージは単にマージしたいブランチ名を指定するだけでいい。

narazuya@bokkko% hg branch
default
narazuya@bokkko% hg merge diff3
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
narazuya@bokkko% 

mergeした後でcommitせずにブランチを切り替えようとするとabortするので注意。(しなかったらびっくりだが)