Mercurial を使ってみる

数年前に CVS から subversion に移行して特に不便を感じていなかったけど、知人からこれからは Mercurial だ、みたいなこと言われ、試してみることに。以下の文章は1,2時間くらいの勉強をまとめたことなので、間違ってたらご容赦を。

Mercurial はいわゆる分散バージョン管理システム。分散するとどうなるのだろう?とずっと疑問に思っていたのだが、要は(運用上のマスターリポジトリから)チェックアウト (Mercurial 用語では clone) するとリポジトリごと作業場所に複製される感じ。複製されたリポジトリは作業ディレクトリの .hg というディレクトリの中にすべて保存される。ローカルな作業は複製したリポジトリにコミットし、さらにマスターリポジトリに push する。

自分のようなバリバリな開発者でもない人にとっての利点としては「(マスターリポジトリがネットワーク上に置いてあるときに) ネットワークに接続していなくても自分の変更履歴を参照・管理できる」といった感じだろうか。

とりあえず、subversion っぽく使うための対応表。

subversion mercurial 備考
svn co hg clone リポジトリを複製
svn update hg pull; hg update hg pull だけでは、複製したリポジトリのみ update され、現在編集中のものが update されない。pull と同時に update をするには hg pull -u
svn commit hg commit; hg push ローカルのリポジトリへのコミットが hg commit, さらにマスターポジトリへの変更を伝えるのが hg push
コンフリクトの編集; svn resolved hg merge; コンフリクトの編集

pull/push がリポジトリ間のやりとり、update/commit が作業ディレクトリとリポジトリ間のやりとり。
複数人で作業するときはマスターリポジトリへの push の際にコンフリクトが起こることになるが、これも subversion と同様に早い者勝ち。誰かが先に push していれば "branch ができちゃうよ" と言われる。pull して hg merge した後に commit + push することになる。hg merge はまだ良く分かっていないがマージ用の外部プログラムが呼び出され、自由に設定することもできる。

$ hg push
pushing to https://host.name/hg/test
searching for changes
abort: push creates new remote branches!
(did you forget to merge? use push -f to force)

$ hg pull 
pulling from https://host.name/hg/test
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

とりあえずこれだけ知っていればある程度使える?