リビジョンナンバー、ChangeSetID、タグとは何か?

Mercurialでは基本的に特定のリビジョンを指定するための方法が3つあります。リビジョンナンバー、チェンジセットIDタグとです。

リビジョンナンバーは単なる10進数で、ローカルのリポジトリに何番目にコミットしたかという番号です。この順番はマシンごとに異なるということに十分注意してください。Mercurialは分散型で非集中的な設計になっているからです。

そのためチェンジセットIDが必要になります。チェンジセットIDはチェンジセットおよびチェンジセットの履歴における位置を一意に特定するための160ビットの識別子です。この値はどのマシンでも同じになります。Mercurialユーザに対してはこの値を40文字の16進数の数字として扱います。この形式では扱いずらいため、あいまいでなければ部分文字列を使ってリビジョンを特定することができます。またChangeSetIDを表示する場合、Mercurialは大抵短縮形式と呼ばれるChangeSetIDの先頭12文字を表示します。

他のMercurialユーザとあるリビジョンについて論議する場合、リビジョンナンバーではなくchangeset IDを使うべきです。人のリポジトリとはリビジョンナンバーが異なる可能性があるからです。

最後に、タグとはあるchangeset IDに関連付けられた文字列です。任意に決めることができ、あるリビジョンに名前を付けることができます。

clone、pull、pushとは何?

他の多くのバージョン管理システムでは、全ての開発者が単一の中央リポジトリにチェンジセットをコミットします。Mercurialでは、それぞれの開発者が典型的には個人リポジトリで作業を行います。Mercurialの基本コンセプトは、リポジトリ間でチェンジセットを授受する事にあります。 これは、clonepushpullといった操作を通じて実現されます(CommunicatingChangesも見てください)。

既存のプロジェクトについて事を始める場合、開発者は通常、hg cloneコマンドを使ってリポジトリのローカルコピーを作ります。この操作は、全ファイルの全履歴を含んだ新しいリポジトリを作成します。

別の開発者が各自の個人リポジトリに変更を加えたら、あなたはhg pullコマンドでその変更を自分のリポジトリに引っ張ってくる事が出来ます。逆に、あなたが自分の個人リポジトリに変更を加えて、それを他のリポジトリ(例えば共有リポジトリ)に受け渡したいなら、hg pushコマンドを使ってそれを実行出来るでしょう。

branches、heads、tip とは何?

最も単純な状況では、履歴とは一連なりのチェンジセットで成り立っています。この場合、(先頭と末尾を除外して)どのチェンジセットも一つのと一つの子を持ちます。しかし様々な理由によって、履歴のグラフ構造は2つ、またはそれ以上の独立した開発ラインに枝分かれする事が有ります。枝分かれが起こった時、その履歴グラフにはブランチが有る、と表現されるのです。ブランチが発生した箇所では、チェンジセットは2つ、またはそれ以上の子を持ちます。

2つの開発ラインが一つに結合された時は、マージが発生した、と表現されます。マージが発生した箇所では、チェンジセットは2つの親を持ちます。或る開発ラインが未だ他のラインとマージされていない時、そのラインの最新チェンジセットをブランチのheadと呼びます。あらゆるリポジトリは常に一つ、またはそれ以上のheadを包含しています。headは子を持ちません。作業中のリポジトリについてheadを列挙するには、hg headsコマンドを使ってください。

tipとは、リポジトリに加えられた直近のチェンジセットの事です。今コミットを行ったばかりなら、そのコミット内容がtipという事になるでしょう。逆に、他のリポジトリからpullしたばかりであれば、そのリポジトリのtipが作業中のリポジトリの新しいtipになります。リポジトリのtipを表示するには、hg tipコマンドを使ってください。

tipは常にheadでもあります。リポジトリ内に複数のheadが存在する場合、そのうちの一つだけがtipになるのです。リポジトリ内部でチェンジセットは連番をふられているので、tipが最大の連番値を持ちます。"tip"という語は、tipチェンジセットを示す特殊なタグとして機能し、チェンジセットIDやタグが使用可能な全ての場所で使用出来ます。

次のダイアグラムで、紹介してきた概念を図解します。

この履歴では、リビジョン 1:34ef と 4:ac98 でブランチが発生していて、リビジョン 4:ac98 でマージが発生しています。リビジョン 5:0345, 6:19e3, 7:8e92 はheadで、その中で 7:8e92 がtipにあたります。

hg tipがtipを表示し、hg headsがheadを表示するにも拘わらず、hg branchesで表示されるブランチのチェンジセットが、先程の説明でブランチの発生したチェンジセットとして示したものと異なる事に注意してください。代わりにこのコマンドは、名前付きの各ブランチそれぞれの最新のチェンジセットを表示します。詳しくは、名前付ブランチを参照してください。

"branch"という用語には、他の意味も有ります。詳細はブランチを参照してください。


ブランチはMercruialの中心的な概念です。ブランチとは独立した開発ラインのことです。他のほとんどのバージョン管理システムでは、すべての開発者が 'trunk'や 'メインブランチ' と呼ばれるものにコミットするのが一般的です。Mercurialでは各開発者が私的なブランチ上で作業するのでMercurial自身は'メインブランチ'という概念を持っていません。

そのためMercurialはブランチ間のマージの繰り返しをを簡単にできるようにしています。hg pullhg update -mを走らせてから結果をコミットするだけでマージができます。

'heads' とはあるブランチの上での最も最近のコミットです。技術的に言えば子をまったく持たないチェンジセットのことです。マージとは2つのheadsを一つにまとめる操作であると言えます。hg headsとすると現在のリポジトリ内のheadsを見ることができます。

'tip'とは最も最近に変更されたheadのことであり、最も大きなリビジョンナンバーを持つチェンジセットのことです。何も指定せずにコミットをすると、それは'tip'に対してなされます。一方、他のリポジトリからpullをすると、そのリポジトリのtipが現在のtipになります。

'tip'はupdateのような多くのコマンドのデフォルトのリビジョンとなりますし、また特別なタグとしても機能します。


JapaneseFAQ/Terminology (last edited 2009-05-19 19:30:59 by localhost)