前回は,様々な方法で複製したリポジトリにおいて,それぞれ異なる作業成果を"hg commit"し,下図のような状態を構築するところまでを説明しました。
今回は,これら複数の成果を,最終的な成果へと統合する「マージ」について説明します。
成果の集約
成果をマージするためには,マージ作業を行うリポジトリへと成果を集約する必要があります。
成果の集約には"hg pull"を使用します。前回の説明では「リポジトリの複製」に使用した"hg pull"ですが,厳密には「一方の保持していない成果を他方に伝播」する,リポジトリ間連携機能なのです。
myrepo2の成果をmyrepoに取り込む手順を以下に示します。
コマンド1
% cd myrepo % hg pull ../myrepo2 pulling from ../myrepo2 searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) %
前回,"hg pull"を使って複製した時と異なり,"(+1 heads)"なる情報が表示がされていますが,これは一体何を表すのでしょう?
以下に示す,myrepo2の成果を取り込んだ直後のリポジトリの模式図を見れば,この表示の意味するところが何となくわかるのではないでしょうか。
そうです。myrepoでの変更履歴を表す木構造が,myrepo2の成果を取り込むことで枝分かれしているのです("2(1)"は,元リポジトリmyrepo2で"1"だったチェンジセットが,現リポジトリmyrepoでは"2"として扱われていることを意味します)。
Mercurialでは,あるチェンジセットAが別なチェンジセットBから派生している場合,それぞれをお互いにとっての子・親チェンジセットと呼び,子チェンジセットを持たないチェンジセット,つまり枝分かれの先端のチェンジセットをヘッド(head)と呼びます。
先の"(+1 heads)"表示は,myrepo2からの成果取り込みにより,myrepoのヘッドが増えたことを知らせているのです。
あるリポジトリにおけるヘッドを表示するには,先の実行結果にも表示されていますが,"hg heads"を使用します。
コマンド2
% hg heads changeset: 2:fe8c0fd86885 tag: tip parent: 0:a044b949325f user: fujiwara date: Tue May 06 19:38:25 2008 +0900 summary: add evening changeset: 1:b85af333a085 user: fujiwara date: Mon May 05 21:57:35 2008 +0900 summary: add morning %
マージ作業は,ここで表示されるヘッド同士をマージして,枝分かれを解消することに他なりません。
次節では,実際にマージ作業を行う前に,Mercurialの「マージ」と,CVSやSubversionにおける「マージ」の違いについて,説明したいと思います。

