機械制御/振動騒音
IR情報 会社情報

PERFORCEテクニカルノート009

image_toyo_ss_img_perforce_title_perforce.gif.gif
テクニカルノート009  
image_toyo_ss_img_all_line_yellow.gif.gif
image_toyo_common_spacer.gif.gif
ブランチしていないコードライン間で変更をマージする方法
image_toyo_common_spacer.gif.gif
あるシチュエーションを考えます。コードライン "B" と "C" があり、これらはともに、元々コードライン "A"からブランチされています。したがって、B と Cのパスにあるファイルは共通の祖先を共有しているにもかかわらず、互いに直接的なブランチの関係を持っていません。
            B  +---------------------------
               |
        A -----+-----+-----------------------
                     |
                  C  +---------------------
              


これら兄弟の関係にあるパスのファイル間で、どのように変更を反映(マージ)すればよいでしょうか? 最も簡単な答えは、p4 integrate を実行することです。例えば、次のように実行します。:
image_toyo_common_spacer.gif.gif
p4 integ B/... C/...

image_toyo_common_spacer.gif.gif
ところが、最初にこれを実行したとき、望む結果は得られないかもしれません。PERFORCEは、前回の反映コマンド(p4 integrate)によって作成された反映履歴を使って、どのファイル・リビジョンを反映するかを判定します。C は Bからブランチされたのではないため、これら2つのパス間に反映履歴は存在しません。それでは、これら2つのパス間で反映を実行したら何が起きるでしょう か? これの答えは、使用中のPERFORCEがリリース2002.2以降か、リリース99.2から2002.1までの間か、リリース99.2より前かによって異なります。

image_toyo_ss_img_all_line_dot_526.gif.gif
リリース2002.2以降の場合

反映元パスと反映先パスの間で反映操作を行おうとしたとき、それ以前の反映履歴がない限り、いずれのファイルも反映目的の作業状態にはなりません。デフォ ルトでPERFORCEは、3-ウェイ・マージのために使用する ベース・リビジョンが存在しないと、いずれのファイルも反映目的の作業状態にしません。ベース・リビジョンは反映履歴にしたがって選択されますので、反映 履歴がなければ、PERFORCEは "ベースなしマージ"を実行することとなります。リリース99.2の時点では、ベースなしマージは許可されていませんでした。このデフォルトをオーバライドするためには、-i もしくは -I オプションを、例えば次のように使用します。:
image_toyo_common_spacer.gif.gif
p4 integ -i B/... C/...

image_toyo_common_spacer.gif.gif
-iオ プション "ベースなしマージを可能" -もし反映先ファイルが存在すれば、それを反映目的の作業状態にします。さらに、もし反映先と反映元との間に反映履歴が存在しなければ、反映元ファイルの反 映開始リビジョンが、3-ウェイ・マージに対するベース・リビジョンとして使用されます。

-Iオ プション "間接マージを可能" -これを指定することによって、PERFORCEは間接的な反映履歴を検索し、反映元コードラインにおいて適切な共通祖先を探します。このオプションを指定した場合、反映履歴がの複雑さによってはパフォーマンスに影響が出る場合がありますので、注意が必要です。

いずれのオプションについても、もし適切な共通祖先の検出に失敗した場合には、リリース99.2から2002.1のときの動作に戻ります。

-i オプションと -i オプションの対比や、これらのもたらす効果については、テクニカルノート NOTE057をご参照ください。

image_toyo_ss_img_all_line_dot_526.gif.gif
リリース99.2から2002.1の場合

リリース99.2から2002.1の場合、-i オプションについては前述と同じように "ベースなしマージを可能" の意味となります(-I オプションは指定できません)。

ここでのシチュエーションでは、-iオプションを使用したとき、C のファイルは反映目的で作業状態となり、B-C のそれぞれのファイルのペアにおいて B#1(Bのリビジョン1)が3-ウェイ・マージの際のベース・リビジョンとして使われます。衝突解決をしてサブミットした後、反映履歴は B#1 がすでに Cに反映されたことを示すでしょう。これによって、引き続き行われる B から Cへの反映操作において、PERFORCEはベース・リビジョンを検出することができるようになります。(実際のところ、簡単にいえば、 B#1がキー・ファクタであるということです。詳細は、テクニカルノート NOTE057 をご参照ください。)

リリース99.2から2002.1のP4Winでは、反映ダイアログの[ベースなしマージを可能]オプションを使用します。

image_toyo_ss_img_all_line_dot_526.gif.gif
リリース99.2より前の場合

99.2より前のリリースで反映操作を実行するとき、反映先ファイル(もし存在すれば)は、反映履歴があるかないかにかかわらず、反映目的の作業状態とな ります。しかしながら、反映履歴が「反映元ファイルのリビジョン #1がすでに反映されている」ことを示していないと、スケジュールされた衝突解決は、3-ウェイ・マージではなく2-ウェイ・マージを実行します。2-ウェ イ・マージではベース・リビジョンが存在せず、2つのファイル("theirs"と"yours")の差分を参照することはできますが、どの変更がどちら側で行われたのかを知ることはできません。

B から C への反映の例では、C のファイルは反映目的で作業状態となり、B-Cのそれぞれのファイル・ペアに対して衝突解決がスケジュールされます。しかし、衝突解決の際、B#head(B の最新リビジョン)か C#headのいずれかを選択しなければなりません。サブミットした後、衝突履歴は B#head が C へ反映されたことを示します。しかし、依然としてB#1 が C へ反映されたという記録はありませんので、次に反映を実行したときには、再び同じ問題にぶつかることになります。
image_toyo_common_spacer.gif.gif
反映元ファイルのリビジョン #1 がまだ反映されていないときでさえ、反映操作で3-ウェイ・マージを実行するようにし、かつ
恒久的にベース・リビジョンを設定することで、反映履歴は #1 が反映されたことを示し、その後の反映操作が正常に動作する
image_toyo_common_spacer.gif.gif
ようにするための方法があります。

本テクニカルノートの残りの部分では、どのように実行するかについて説明します。どのリビジョンが反映を必要とするかをPERFORCEがどのように決定するかについて、そのバックグランドの情報は テクニカルノート NOTE057をご参照ください。

image_toyo_ss_img_all_line_dot_526.gif.gif
反映操作で3-ウェイ・マージを実行する

リリース99.2以降において、3-ウェイ・マージを強制的に実行するためには、単純に integrate -iを使うことができます。それより前のリリースでは、3-ウェイ・マージを強制するには反映コマンドにリビジョン履歴を指定する方法しかありませんでした。PERFORCEは、反映元ファイルの開始リビジョンと終了リビジョンを計算するために、リビジョン範囲を使用します。開始リビジョンが特定できれば、3-ウェイ・マージを実行するためのベース・リビジョンとしてどのリビジョンを使うかを決定できます。

最初のシチュエーションに戻って、コードライン B がコードライン A からブランチした後、2つのチェンジリスト555と556がコードライン Bにサブミットされたとします。これらの変更を直接コードライン C に反映するには、次のように実行することができます。:
image_toyo_common_spacer.gif.gif
p4 integrate B/...@555,@556 C/...
p4 resolve
p4 submit

image_toyo_common_spacer.gif.gif
PERFORCEは、チェンジリスト555と556によって影響を受けた B 内のすべてのファイルを示し、それに対応する Cのファイルを反映目的で作業状態にします。衝突解決を行う際、PERFORCEは3-ウェイ・マージを実行します。対応する Cのファイルへマージされた B のそれぞれのファイルに対して、3-ウェイ・マージに使用されるベース・リビジョンは @554となります。すなわち、反映される開始リビジョンの親リビジョン(1つ前のリビジョン)が、マージのベースとして使用されます。

また、もし B から C へすべての変更を反映したいと考え、B へサブミットされた最初のチェンジリストが555であることを知っているならば、次のように実行することもできます。:
image_toyo_common_spacer.gif.gif
p4 integrate B/...@555, C/...
p4 resolve
p4 submit

image_toyo_common_spacer.gif.gif
なお、カンマで終わるリビジョン指定子は、次の書き方を短縮したものです。:
image_toyo_common_spacer.gif.gif
p4 integrate B/...@555,#head C/...

image_toyo_common_spacer.gif.gif
image_toyo_ss_img_all_line_dot_526.gif.gif
恒久的にベース・リビジョンを設定する

B のファイルのリビジョン #1 がすでに C へ反映されたということを反映履歴が示していない限り、B から Cへの反映を行うときには、必ずリビジョン範囲を指定しなければなりません。99.2より前のリリースにおいて、引き続き実行する反映のために恒久的にベー ス・リビジョンを設定するには、まず最初にリビジョン #1 だけを反映し、それをサブミットしなければなりません。

ここに示すのは、これを実現するための1つの方法です。コードライン A にあるファイルが、チェンジリスト 500によってコードライン Bへブランチされたとします。言い換えれば、B/...@500 が B におけるすべてのファイルのリビジョン #1 であるということです。今後 Bから C へ実行する反映に使用する開始リビジョンを設定するには、B/...@500 から C に対して "反映を無視する" を実行します。:
image_toyo_common_spacer.gif.gif
p4 integrate B/...@500 C/...
p4 resolve -ay
p4 submit

image_toyo_common_spacer.gif.gif
この反映コマンドは、それぞれの反映元ファイルの終了リビジョンを @500(チェンジリスト500におけるリビジョン)に制限します。resolve -ay("yoursを承諾")は、すべての差分を 無視することによって、この反映を実現します。反映先ファイルの内容は、一切変更されません。にもかかわらず、C内のそれぞれのファイルがサブミットされることによって、PERFORCEは関連する B#1のファイルが反映されたという情報を記録します。次回の反映操作では、B#2 のファイルが開始リビジョンとして使用され、B#1のファイルは3-ウェイ・マージのベースとして使用されます。

もし、C から Bへ戻す形の反映も行うことを考えているのであれば、将来的な C から Bへの反映を同様に行うために、恒久的なベース・リビジョンを設定することができます。例えば、C はチェンジリスト600において A から ブランチされたとすると、次のようになります。
image_toyo_common_spacer.gif.gif
p4 integrate C/...@600 B/...
p4 resolve -ay
p4 submit

image_toyo_common_spacer.gif.gif
image_toyo_ss_img_all_line_dot_526.gif.gif
開始リビジョンとしての "#1" とチェンジリスト番号との違い

恒久的なベース・リビジョンを設定するにあたり、反映コマンドにチェンジリスト番号を指定する代わりに、なぜ "#1" と指定しないのかを疑問に思うかもしれません。つまり、なぜ次のように実行しないのかということです。
image_toyo_common_spacer.gif.gif
p4 integrate C/...#1 B/...
p4 resolve -ay
p4 submit

image_toyo_common_spacer.gif.gif
確かに、コードラインがどのように進化したかによってはこれで正しく動作し、望む結果が得られるかもしれません。しかし、C/...@600と指定することは、チェンジリスト600の中で A から C へブランチされたファイルだけを含むという点で異なります。C/...#1と指定した場合には、直接追加されたファイルや他のコードラインからブランチされたファイルなど、Cのパスへサブミットされたすべてのファイルを含んでしまいます。
 
image_toyo_ss_img_all_btn_yellow_bgwhite2.gif.gif戻る

PAGE TOP