Mercurialのブランチとマージ
Mercurialをemacsやzsh、global, その他の設定ファイルの管理だけでなく、ソースコードの管理にも本格的に使うようになったこともあり、ブランチやマージの機能も頻繁に使うようになってきた。
このへんの機能を使ってて思うのはやはりCVSやSubversionに比べてブランチの作成や切り替え、マージ等の操作が簡単に行えるということ。これは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は眼中にないようなので、いいんだろうけど。
ただ、ブランチの切り替えやマージはどっちもCVSやSubversionに比べれば圧倒的に楽だ。正直なところ、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するので注意。(しなかったらびっくりだが)