GitHub

MercurialTutorial

分散型バージョン管理システム、Mercurial(hg)のチュートリアルです。とりあえず使ってみたい人向け。

{{toc_here}}

(0) Mercurialとは?

Mercurialは分散型のバージョン管理システムです。クロスプラットフォーム、軽量、バイナリをうまく扱えるなどの特徴があります。

分散型VCSとしてはgitも有名ですが、Mercurialの方がコマンド体系がSubversionに近くて筆者は好きです。

(1) インストール

Windows
インストーラがあるのでそれを使いましょう。
Linux, Mac OS X
aptitudeやports等でインストールできます。

(2) リポジトリを作る

適当なディレクトリを作って、そこで hg init するだけ。簡単!

/Users/yhara/proj/myproject % hg init
/Users/yhara/proj/myproject % ls -a
.   ..  .hg

こんな感じで、.hg というディレクトリができます。

(3) コミットする

svn等と同じで、add して commit(またはci) すればOK。

/Users/yhara/proj/myproject % hg add sample.txt 
/Users/yhara/proj/myproject % hg st (statusの省略形)
A sample.txt
/Users/yhara/proj/myproject % hg ci -m "add sample file."

ciの-mオプションはコミットログを指定するためのものです。-mを付けなければ、適当なエディタが起動して コミットログの入力を求められます。

他にも hg rm とか、hg mv などのコマンドがあります。詳しくは以下を参照。

(4) 他のコンピュータとやりとりする

さて、一台のマシンで使ってるだけでも便利なMercurialですが、やっぱり複数のマシンで変更を共有したりもしたいですよね。

サーバ側にあるリポジトリをクライアント側に取ってくる

そんな時には、まず hg clone でリポジトリを複製します(svn coに当たる)。

$ hg clone ssh://yhara@example.jp//home/yhara/myproject/ myproject

ホスト名とパスの区切りがscpのような「:」ではなく、「/」を使うのに注意してください。絶対パスを使うときは「/」が2個並ぶことになります。

リポジトリの指定は以下のようなものが使えます。

local/filesystem/path (または file://local/filesystem/path)
ssh://[user@]host[:port]/[path]
http://[user@]host[:port]/[path]
https://[user@]host[:port]/[path]

これで、ローカルで開発できるようになりました。ファイルをコミットしてみます。

$ vi sample.txt
$ hg ci sample.txt

Subversionだとこの時点でサーバに変更が送られますが、分散型であるMercurialでは、まだコミットはローカルに溜めてあるだけなので、 明示的にサーバ側に送信してやらなければいけません (ちょっと面倒ですが、逆に言えば、ネットワーク環境が無くても コミットができるということでもあります。SVKなどと一緒ですね) 。

変更をサーバに反映するには、まずクライアント側で hg push し、サーバ側で hg update します。  yhara@client: $ hg push

 yhara@server: $ hg update

逆に他人の変更点をサーバから取ってくるには、hg pull して hg updateすればOK。

 $ hg pull
 $ hg update

クライアント側のリポジトリをサーバ側に複製する

上の例ではサーバのリポジトリをクライアントにコピーしましたが、この逆を行うこともできます。

まず、hg cloneで送り元と送り先を指定してリポジトリをコピーします。

yhara@client: $ hg clone . ssh://yhara@server//home/yhara/proj/test

そして、サーバ側でhg updateすれば無事ファイルがやってきます。

yhara@server: $ hg udpate

この後、クライアントでの変更をサーバに送るには、hg pushで送り先を明示してやればOK。

yhara@client: $ hg push ssh://yhara@server//home/yhara/proj/test

毎回送り先を指定するのが面倒なら、.hg/hgrcというファイルを作って以下のように書けばいいみたいです。

[paths]
default = ssh://yhara@server//home/yhara/proj/test

(5) ブランチを使ってみる

お手軽な方法

ブランチを作りたくなったら、hg cloneでファイル全部を別のディレクトリにコピーする(笑)。 マージするときはhg pushとかhg pull; hg updateを使えばOK。

もうちょっとちゃんとした(?)方法

hg branchesというコマンドで、現在のリポジトリにあるブランチを確認することができます。

/Users/yhara/proj/test % hg branches
default                        0:fee58a165f5b

最初は「default」というブランチしかありません。

ブランチを作るときはhg branchを使います。

% hg branch hoge

これで、現在のワーキングコピーもhogeブランチになりました。

% hg branch
hoge

あとは普通にhg addとかhg ciすれば、hogeブランチにコミットすることができます。

コミットする先をdefaultに戻したいたいときは hg update default とします。

ブランチが複数あるときも hg update で別のブランチに移動することができますが、 「hogeブランチからmogeブランチ」などブランチ間を一気に移動するときは、安全のため -C オプションが 必要になっています。hg status で未コミットの変更がないことを確認したら、 hg update -C moge としてmogeブランチに移動できます。

(ブランチについては以下の記事を参考にしました。)

Tips

.hgignoreで不要ファイルを指定する

バックアップファイルなどをhg statusで表示しないようにするには、.hgignoreというファイルに以下のような感じで書いておきます。グロブによるパターンマッチか正規表現が使えます。

          syntax: glob
          *.swp
          *~
          syntax: regexp
          ^\.pc/

プロジェクト毎に.hgignoreを置くのが面倒なら、~/.hgignoreに上のように書いておいて、~/.hgrcで以下のようにして~/.hgignoreを読み込ませるという方法もあります。

[ui]
username = ECHIZEN Kousuke <echizen@crimson.example.jp>
ignore = ~/.hgignore

参考サイト

  • malagma
    • gitにおけるgithubのようなサイトを目指しているそうです。
source: MercurialTutorial.hd
View on github | Report issue