Mercurialの初歩

Mercurialはコマンド hg を利用し、

hg サブコマンド ...

の書式であらゆる操作を行なう。 バージョン管理では以下の用語を用いる。

リポジトリ

すべてのファイルの登録履歴が入っているデータベース。

ワーキングコピー

データベースからある時点のファイル群を取り出した ディレクトリ。Mercurialではリポジトリとワーキングコピーが 一つのディレクトリに同居しているが、CVSやSubversionでは リポジトリとワーキングコピーが違うところにある。

コミット(チェックイン)

ファイルに対するその時点の更新をリポジトリに登録すること。 コミットされた瞬間の内容が、あとで取り出せるものになる。 「チェックイン」ともいう。

チェックアウト

リポジトリからある時点のファイル(群)を取り出すこと。

事前準備

Mercurialを最初に使う前に, リポジトリ操作をするときの作業者名を登録する必要がある。 これは ~/.hgrc ファイルに記入しておく。 ~/.hgrc ファイルをエディタで開き,

[ui]
username = ローマ字氏名 <MailAddress>

という書式で自分の名前とメイルアドレスを書く。たとえば KOEKI Taro さんが taro@example.jp なら以下のように記述する。

[ui]
username = KOEKI Taro <taro@example.jp>

正しく書けたら保存して以下の作業に進む。

ファイルの履歴管理の開始

Mercurialでバージョン管理する手順は

  1. リポジトリを初期化する(hg init) - 最初に1回
  2. 管理したいファイルを登録する(hg add) - ファイルに対して最初に1回
  3. 更新ごとにコミットする(hg ci) …以降コミットの繰り返し

となる。「hg init」、「hg add」、 「hg ci」だけ覚えておけば取り敢えず使える。もっというと 普段は「hg ci」だけよい。

あるファイル(群)をMercurial管理下に置くには バージョン管理したいファイルが含まれる再上位のディレクトリで

hg init

する。ここでは、実験用ディレクトリを作って ファイルを置き、そのファイルを登録してみる。

mkdir hgdir
cd hgdir
cal > calendar              (ダミーファイル作成)
hg init                     (リポジトリ初期化)
hg add                      (ファイル追加)
hg ci -m init               (コミット)

hg add と起動すると管理下にないファイルがすべて 登録される。たくさんファイルがあって、その一部だけ登録したい場合は

hg add file1 file2

のように足したいファイルだけを指定する。

以後、「ファイルを更新してはコミット」を繰り返してみる。 vi の使い方参照。

vi calendar
(calendarファイルを編集
 Gで末尾にジャンプして o で行を開いて文字を入れて ESC ZZ)
hg ci
(またviが上がるので i を押してからどう変更したかのメッセージを入れて ESC ZZ)

上記の操作を3〜4回繰り返してから、更新履歴を確認する。 履歴は hg log で見る。

hg log
changeset:   2:3a8c8b4f7e5f
tag:         tip
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:27:15 2009 +0900
summary:     add yaa

changeset:   1:3e655c963fd8
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:25:04 2009 +0900
summary:     add hero

changeset:   0:7623b5652e9a
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:24:47 2009 +0900
summary:     init

changesetの項に付いた 2:3a8c8b4f7e5f などは 更新の集合(チェンジセット)に付けられた識別子で、 特定のバージョンを指定するときなどに指定する。 コロンの前の整数はリポジトリ内の通し番号によるリビジョン番号、 後ろの12桁の16進数はリポジトリを超えて有効なチェンジセットに付けられた 識別用文字列のハッシュ値(の短縮形)である。

古いバージョンに戻る

指定したバージョンに戻るには hg up を用いる。 戻りたいバージョンへのチェンジセットに付いたリビジョン番号や日付を指定する。

hg up 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
cat calendar
(バージョン1のときの calendar が表示される)
hg up
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(hg upだけだと最新版(tip)に戻る)
cat calendar

日付を指定したい場合は、hg log に出てくる チェンジセットの正確な日付か、任意の日付より古い最寄りのチェンジセットを 意味する `<' を付加した日付を指定する。

hg up
(実験のため最新版に戻しておく)
hg log
changeset:   2:3a8c8b4f7e5f
tag:         tip
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:27:15 2009 +0900
summary:     add yaa

changeset:   1:3e655c963fd8
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:25:04 2009 +0900
summary:     add hero

changeset:   0:7623b5652e9a
user:        HIROSE Yuuji <taro@example.co.jp>
date:        Fri Oct 16 17:24:47 2009 +0900
summary:     init
(日付を確認)
hg up -d 'Fri Oct 16 17:25:04 2009'
Found revision 2 from Fri Aug 28 15:03:31 2009 +0900
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

ただし、日付を正確に指定するくらいならリビジョン番号の方が楽なので 通常日付け指定はある日を指定してその日に最新版だった チェンジセットに戻るときに使う。
例:

hg up -d '< 2009-8-28'
(2009年8月28日より古い直近のもの)
hg up -d '< 2009-8-29 14:00'
(2009年8月29日 14:00より古い直近のもの)

日付け区切りにはハイフン、時刻区切りにはコロンを用いる。

タグの利用

ある時点のバージョン集合に名前を付けておくことができる。 この名前をタグといい、hg tag で付ける。

hg tag hogehoge-version-1.0

付けたタグは hg up などでのリビジョン指定で 利用できる。分かりやすい名前を付けておくとよい。 付けたタグは hg tags で確認できる。

hg tags
tip			2:3a8c8b4f7e5f
hogehoge-version-1.0	1:3e655c963fd8

tip というタグは特別で、常に最新のチェンジセットを指す。

差分管理

テキストファイルに更新を重ねて行く場合、どの部分に修正が施されたかを 追跡管理することで、効率的な情報伝達が可能になる。

この章のまとめ

hg initリポジトリ初期化
hg add [file]ファイル追加
hg ciコミット
hg logログ参照
hg up [revision] revision(または最新版)に戻る
hg tagタグの付加
hg tagsタグの一覧表示
yuuji@koeki-u.ac.jp