Mercurialを利用した履歴管理
概要
Mercurial は、Git や、Bazaar 等のソフトと同じ、分散版履歴管理ソフトウエアです。ここで分散と言うのは、中央に一つのデータベースがあって、そこで版履歴データを共有管理する方式ではなく、それぞれが版履歴を持ち、ロックなしに自由に変更できることを意味しています。その操作のために「hg」という実行ファイルを使います。
大まかな使い方はこのようになります。
- 作業場とする場所で、hg init を実行し倉庫 (.hg/) を作成する。
- ファイルを作成更新。管理したいファイルを hg add を使って伝える。
- hg ci で変更を、新規の版として倉庫に追加する。
- hg co で任意の版を、倉庫から作業場に取り出せる
各版は、変更集合と呼ばれ、以下のような情報を持っています。ここに示すのはその一部です。
- 変更集合(change sets / チェンジセット)ID: 自動的に作成される 40 桁の細切り(hash / ハッシュ)値で、世界全ての倉庫(repository / リポジトリ)で一意の値
- 改訂番号(revision number / リビジョン番号): 手元倉庫限定で使える自動的に作成された識別子。よその倉庫では使えない。
- 標識(tag / タグ): 変更集合に付けられる名前。"tip(先端)"標識は倉庫内で最新の変更集合に対し自動的に付けられる。
主要命令
命令は複数の別名を持っている場合があり、また重複しない限り命令の記述を途中で省略できるようです。
倉庫作成
新規倉庫作成 |
hg init [DIRNAME] |
現在のディレクトリ、またはDIRNAMEに新しい倉庫を作成します。.hgというディレクトリが作成され、その中に各種制御情報が格納されます。 |
よその倉庫から取得して新規作成 |
hg clone [-r REV] [-b BRANCHNAME] SrcDirOrUrl [DstDir] |
SrcDirOrUrl で示されるディレクトリか URL にある倉庫の内容を取得し、現在のディレクト、またはDstDirに複製します。SrcDirOrUrl には、ローカルファイル、file://、http://、https://、ssh:// を指定できます。
|
ファイル操作
ファイル追加 |
hg add [FILES...] |
FILE未指定の場合は、作業場の全ファイルが対象 |
ファイル削除 |
hg {remove|rm} FILE [FILES...] |
作業場のファイルも同時に削除されます |
ファイルを管理対象から除外 |
hg forget FILE [FILES...] |
作業場のファイルは削除されません |
ファイル複製 |
hg {copy|cp} SrcFile [DstFile] |
作業場のファイルも同時に複製されます |
ファイル名の変更 |
hg {rename|mv} SrcFile DstFile |
作業場のファイル名も同時に変更されます |
倉庫内のファイル内容の表示 |
hg cat [-r REV] FILES... |
最新またはREVのFILE内容を表示します |
倉庫への操作
更新 |
hg {commit|ci} [opt..] |
変更を倉庫に反映します |
倉庫の内容を作業場へ反映する |
hg {update|up|checkout|co} [-r [REV]] [-C] |
REV で指定もしくは最新の改訂版で作業場を更新します。「-C」が指定されると、強制的に作業場が置き換えられます。 |
倉庫にある指定改訂版の内容と作業場の内容を統合する |
hg merge [-r [REV]] |
REV で指定もしくは最新の改訂版と作業場の内容を統合します。 |
標識(tag)を付ける |
hg tag TAGNAME |
TAGNAME という標識を付けます。この命令を実行すると、作業場の .hgtags というファイルに、標識とそれに対応する版の紐付け情報が格納された後、全体を更新します。結果として、一つ改訂番号が進みます。 |
取り消し
倉庫への未更新ファイルの復元 |
hg revert [-r [REV]] [FILES...] |
倉庫に更新してない場合に使います。作業場の内容を戻します。add/rm/cp 等も取り消します。ren の効果は新旧のファイル名を指定する必要があります。 |
倉庫への直前の更新の取り消し |
hg rollback |
直前の倉庫への更新を取り消します。一段階限りしか実行できず、取り消しの取り消しはできません。 |
倉庫への更新の取り消し |
hg backout [--merge] [-r] REV |
指定 REV を打ち消す、新しい更新履歴を作ります。「--merge」は通常指定した方がよいようです。 |
状態取得
履歴表示 |
hg {log|history} [-v] [FILES...] |
FILEを指定しない場合、全体の履歴を表示します。「-v」オプションを指定するとより詳細な情報を表示します。 |
ASCII文字を利用したグラフ付き履歴表示 |
hg glog [-v] [FILES...] |
FILEを指定しない場合、全体の履歴を表示します。「-v」オプションを指定するとより詳細な情報を表示します。 |
ファイル単位で作業領域と倉庫を比較 |
hg {status|st} [FILES...] |
FILEを指定しない場合は、全てのファイルを対象にします。M:変更されている。A:登録追加予定。R:登録削除予定。C:変更なし。!:登録されているが作業領域にファイルがない。?:管理対象外ファイル。I:無視ファイル。 |
作業領域と倉庫にあるファイルの内容を比較し差分を表示 |
hg diff [-g] [-r REV1 [-r REV2]] [FILES...] |
作業領域と最新または REV1 で示されるファイル、もしくはREV1とREV2のファイルを比較し差分を表示します。FILEを指定しない場合は、全てのファイルを対象にします。バイナリファイルや権限情報などの情報を正しく扱うためには、「-g」オプションを指定して git 形式の差分で出力する必要があります。 |
倉庫内のファイル一覧を表示 |
hg locate [FILES...] |
FILESを指定しない場合、全ファイルを表示 |
枝(branch)管理
枝一覧表示 |
hg branches |
|
現枝名の表示 |
hg branch |
|
枝のアタマ(head)の表示 |
hg heads [-r REV] |
|
枝名の設定 |
hg branch BRANCHNAME |
現在の作業場の枝名を BRANCHNAME に設定します。倉庫に更新するまで指定した枝は作成されません。 |
NEWBRANCH に現在の作業場を変更 |
hg {update|up|checkout|co} -r NEWBRANCH |
|
別の SOMEBRANCH からの変更を現在の作業場に統合 |
hg merge -r SOMEBRANCH |
|
枝の最も新しい変更集合をアタマ(head)、そのアタマのうち最も改訂番号が大きいものを先端(tip)と呼びます。
別倉庫への操作
別倉庫へ更新 |
hg push [Dst] |
Dstに現在の倉庫の内容を反映します |
別倉庫からの変更履歴の取り込み |
hg pull [-r REV] [Src] |
Srcで指定された倉庫からの変更履歴を、現在の倉庫に取り込みます。この命令だけでは作業場に反映されないので、別途 hg merge 命令などを実行する必要があります。 |
別倉庫の未取り込み変更履歴目録の表示 |
hg incoming [-r REV] [Src] |
Srcで指定された倉庫から、未だ取得されていない変更履歴目録を表示します。 |
重要ファイル
-
.hg/hgrc
この倉庫専用の設定を記述することができます。このファイルは履歴管理されず、clone命令で外部に輸出されることもありません。また、他の .hgrc があっても、ここでの設定が優先されます。
-
.hgignore
作業場の根に作成します。hg により無視されるファイルを記述します。
ファイル内容は行ごとに記述します。#はコメントの開始、\はエスケープ文字として使用されます。
ファイル名の直接指定のほか、一致するパターンを指定できます。このパターンは、syntax 命令行を任意の位置に挿入することにより、その記述方法を変更できます。これは複数記述でき、随時切り替えることができます。
-
.hgtags
hg tag 命令を実行すると作業場の根に作成されます。変更集合IDと標識名の組が格納されています。hg tag 命令で追加することができるほか、手動で変更することもできます。
Mercurial 拡張: MercurialQueue(MQ)
概要
MQ は、以下のような状況時に使用すると、大きな効果を発揮します。
- 元倉庫内容が頻繁に更新されるが時間のかかる追加機能を作成しているとき
- 元倉庫内容とは異なった独自機能を手元の環境のみで再現しているとき
MQ を使用可能にすると、切れ端(patch)のスタックが使用可能になります。
切れ端には名前をつけることができ、任意の段階で新しい切れ端を作ることが出来ます。それらはスタックで管理され、継ぎ当てた切れ端、まだ継ぎ当てられていない切れ端に別れ、その間は最上段となります。この最上段をqpush/qpopで動かし、スタックの順序順に、作業場に継ぎ当てたり、元に戻すことができます。
今、よその倉庫内容が手元の倉庫に複製されていて、その内容が作業場に展開、その後自分で各種修正した状態であるとします。
そして、よその倉庫で新しい版が公開され、手元環境を更新するものとします。
この場合、MQ を使うと次のように簡単に更新することができます。
- 手元環境の変更内容を切れ端にする(qrefresh/qnew)
- 手元環境に継ぎ当てられた切れ端を全て解除する(qpop -a)。スタックには、解除された全ての切れ端の情報が残っている。
- これで、作業場は倉庫から展開された内容そのもの=よその倉庫から持ってきた内容と同一になっている。
- よその倉庫から更新内容を持ってきて、手元の倉庫を更新する。(pull)
- その内容で作業場に更新する。(co)
- 再びスタックから切れ端を継ぎ当てる(qpush -a)
各切れ端は、継ぎ当てられると、それ自身が Mercurial の一つの変更集合に対応します。切れ端を qrefresh で更新しても、Mercurial の変更集合の改訂番号は変わらず、その 変更集合ID だけが変化します。qpush/qpop で、この変更集合を追加したり、除去したりできます。
MQ は、誰かが pull する可能性のある倉庫では使用すべきではありません。
MQ の有効化
MQ は標準搭載されていますが、有効化されていません。そのため、.hgrc に以下のような記述を追加して拡張を有効化する必要があります。
[extensions]
mq=
主要命令
作成
新規MQ作成 |
hg qinit |
現在の作業場を mq で処理できるようにするための管理領域(.hg/patches/{series|status})を作成します。 |
新規切れ端の作成 |
hg qnew [-f] PATCHNAME |
PATCHNAME という名前の切れ端をスタック最上段に作成します。その切れ端を管理するために PATCHNAME という名前のファイルが管理領域に作成されるため、名前付けには注意が必要です。series/statusという名前は付けられません。「-f」を指定すると、新しく PATCHNAME 作成し、そこに変更を格納します。
|
切れ端の名前を変更する |
hg qrename SRCNAME [DSTNAME] |
切れ端名 SRCNAME を DSTNAME に変更します。SRCNAME だけの場合は、現在の最上段の切れ端の名前を SRCNAME に変更します。
|
状態取得
スタック中の全切れ端を古いものから順に表示する |
hg qseries [-s] |
「-s」をつけると、付加された文章も表示されます。
|
作業場に継ぎ当てられている切れ端を古いものから順に表示する |
hg qapplied [-s] |
「-s」をつけると、付加された文章も表示されます。
|
現在の切れ端の名前を表示する |
hg qtop |
|
現在の最上段の切れ端と作業場の違いを表示する |
hg qdiff |
|
更新
作業場の変更を現在の切れ端に追加する |
hg qrefresh [-m COMMENT] |
|
複数の切れ端を現行の切れ端に統合する |
hg qfold [-m COMMENT] PATCHNAME |
指定された切れ端 PATCHNAME と現在までの切れ端を、現在の切れ端に統合します。PATCHNAME は継ぎ当てられていてはいけません。
|
スタック操作
現在のスタックの最上段の次の切れ端を作業場に継ぎ当てる |
hg qpush [-a] [--move PATCHNAME] |
「-a」を指定すると、スタック中の全ての切れ端が適用され、そこが最上段になります。「--move」を指定すると、スタックの順序を無視して、次の適用対象を PATCHNAME にしてそれを最上段にします。PATCHNAME のスタックでの物理的な位置も変更されます。
|
現在のスタックの最上段の切れ端の継ぎ当てを除去する |
hg qpop [-a] |
「-a」を指定すると、全ての継ぎ当てが除去され、最上段は何も切れ端が継ぎ当てられていない位置になります。
|
指定した切れ端を現在のスタックの最上段にする |
hg qgoto PATCHNAME |
PATCHNAME が現在のスタックの最上段になるように、作業場に対しqpush/qpopします。
|
変換
継ぎ当てられた切れ端を Mercurial 通常変更集合にする |
hg qfinish [-a] |
「-a」を指定すると、現在継ぎ当てられた切れ端が対象になります。すべての切れ端ではありません。
|
Merucial の変更集合を MQ の切れ端に変換する |
hg qimport [-r REV] |
変換された切れ端は、現在の最上段の次に置かれます
|