Mercurialではじめる分散構成管理

第2回 「マージ」は怖くない ~ 分散した成果の集約

この記事を読むのに必要な時間:およそ 4.5 分

前回は,様々な方法で複製したリポジトリにおいて,それぞれ異なる作業成果を"hg commit"し,下図のような状態を構築するところまでを説明しました。

図1 成果の分散

図1 成果の分散

今回は,これら複数の成果を,最終的な成果へと統合する「マージ」について説明します。

成果の集約

成果をマージするためには,マージ作業を行うリポジトリへと成果を集約する必要があります。

成果の集約には"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の成果を取り込んだ直後のリポジトリの模式図を見れば,この表示の意味するところが何となくわかるのではないでしょうか。

図2 リポジトリ内での枝分かれ

図2 リポジトリ内での枝分かれ

そうです。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における「マージ」の違いについて,説明したいと思います。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。

コメント

コメントの記入