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)
とりあえずこれだけ知っていればある程度使える?