一人でバージョン管理 2(オフライン編)

先ずは Mercurial をインストール。必要なら python もインストールする。
Mercurial binary package: http://mercurial.selenic.com/
ついでに TortoiseHgGUI クライアント)も。
初期設定ファイル ~/.hgrc を作り、コミットする際の名前と連絡先を書いておく。

[ui]
username = Firstname Lastname <firstname.lastname@example.net>

基本の所作

ディレクトhoge を作り、ローカルリポジトリにする(ディレクトリを指定しない場合はカレントディレクトリがローカルリポジトリとなる)。

$ hg init hoge

この時点で .hg という管理用のディレクトリが作られる。次に、管理したいファイルを作っておく。

$ cd hoge
$ emacs hoge1.txt

で、ファイルを管理下に入れる。

$ hg add hoge1.txt

続いて、最初のコミットをコメント付きで行う。

$ hg commit -m 'initial commit'

コミットを行う毎にチェンジセットが作成される。後はひたすらファイルの編集、コミットを繰り返してチェンジセットを作成していく。管理をやめたいときは、.hg を削除する。

よく使うコマンド

hg status(hg st)

リポジトリ内のファイルの管理状態をファイル名の先頭に付けて表示する。現在のファイルの状態が最新のチェンジセットと一致するときは表示されない。-A 付きで実行すると、全てのファイルの状態を表示する。特に慣れないうちは、このコマンドをことあるごとに実行したほうがいいです。

接頭辞 意味
M 編集されている(Modified)
A 新しく管理下に入っている(Added)
R 次のコミットで管理下から外れる(Removed)
C 変更無し(Clean)
! 管理下にあるが、リポジトリにない(missing)
? 管理下にない(unknown)
I .hgignore で指定されている(Ignored)
hg log

チェンジセットのログを表示する。チェンジセットは

changeset:   [RevisionNumber]:[ChangeSetID]

で表される。RevisionNumber はそのリポジトリのみで有効、ChangeSetID は全てのリポジトリで有効。特定のチェンジセットのログを表示するにはオプションを使う。

$ hg log -r 1                   # RevisionNumber 1 のログ
$ hg log -r 5:10                # RevisionNumber 5~10 のログ
$ hg log -r 4ae16737040d        # ChangeSetID 4ae16737040d のログ
$ hg log hoge1.txt -l 10        # hoge1.txt に関連する過去 10 件のログ
$ hg log hoge1.txt -d -1        # hoge1.txt に関連する過去 24 時間以内のログ
$ hg log --style changelog      # changelog 風
$ hg tip                        # タグ tip(つまり最新)のログ
hg diff

現在のファイルと最新のチェンジセットとの差分を確認する。r オプションを使って

$ hg diff -r 0 -r 10 hoge1.txt

とすると、hoge1.txt の RevisionNumber 0 と 10 の差分を表示する。

hg annotate

ファイル名を指定して実行すると、変更された行を RevisionNumber 付きで表示する。

hg cat

ファイルを出力する。RevisionNumber 0 のときの hoge1.txt を hoge2.txt として出力するには

$ hg cat -r 0 -o hoge2.txt hoge1.txt

とする(hg st hoge2.txt => ?)。また、

$ hg cat -r 0 -o hoge1.txt hoge1.txt

とすると、hoge1.txt を RevisionNumber 0 の状態に戻す。

hg addremove

ファイル名を指定しないで実行すると、hg st => ? のファイルを管理下に入れ、hg st => ! のファイルをリポジトリから削除する。

変更したりやめたり

hg copy(hg cp)

ファイルのコピーを作る。

$ hg copy hoge1.txt hoge2.txt  # hoge2.txt を出力
                               # (hg st hoge1.txt => R、hg st hoge2.txt => A)
$ hg copy hoge1.txt dir        # 既にある dir 内に hoge1.txt を出力
hg rename(hg mv)

ファイル名を変更する(hg copy + hg remove)。

$ hg rename hoge1.txt hoge2.txt  # hoge2.txt に変更
                                 # (hg st hoge1.txt => R、hg st hoge2.txt => A)
hg remove(hg rm)

ファイル名を指定して実行し、そのファイルをリポジトリから削除し、ファイル自体も端末から削除する。

hg forget

ファイル名を指定して実行し、そのファイルを管理下から外す(hg st => R)。

hg revert

ファイル名を指定して実行すると、そのファイルを最新のチェンジセットの状態に戻す(hg st => C)。-a 付きで呼ぶと、全てのファイルの状態を戻す。このコマンドを実行する直前のファイルは .orig 付きでバックアップされる。コミットする前なら変更は全て取り消せるので、例えば、hg remove してファイルを削除しても hg revert で復活させられる。また、hg rename なども取り消せる。

ヘルプ

$ hg -v help

ヘルプのヘルプ

$ hg -h help

Wiki 内のチュートリアル:
http://mercurial.selenic.com/wiki/JapaneseTutorial
コマンドの説明からオプションや設定ファイルの書式まで:
http://www.selenic.com/mercurial/hg.1.html
この中のローカルリポジトリの項がチェンジセットの概念を図付きで説明していて分かりやすい:
http://www.lares.dti.ne.jp/~foozy/fujiguruma/scm/mercurial.html
クライアントいろいろ:
http://mercurial.selenic.com/wiki/OtherTools