製品情報
技術情報
  簡単に使ってみましょう(Windows)
  簡単に使ってみましょう(UNIX)
  よくある質問 (FAQ)
  テクニカルノート
  製品比較
  用語集
  ネットワーク上でのソフトウェア開発
  インターファイル・ブランチング
  ソフトウェア構成管理の
高度な実践方法・・・
  変更管理を通じた製品品質の向上
  PERFORCE−SOFTUNE
連携運用ガイド (Rev1.02)[PDF]
ライセンス情報
テクニカルサポート
ソフトウェア ダウンロード
マニュアル ダウンロード









 
テクニカルノート009 HOME製品PERFORCE 技術情報ノート


ブランチしていないコードライン間で変更をマージする方法


あるシチュエーションを考えます。コードライン "B" と "C" があり、これらはともに、元々コードライン "A" からブランチされています。したがって、B と C のパスにあるファイルは共通の祖先を共有しているにもかかわらず、互いに直接的なブランチの関係を持っていません。
            B  +---------------------------
               |
        A -----+-----+-----------------------
                     |
                  C  +---------------------
              


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


リリース2002.2以降の場合

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

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

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

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


リリース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では、反映ダイアログの[ベースなしマージを可能]オプションを使用します。


リリース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 へ反映されたという記録はありませんので、次に反映を実行したときには、再び同じ問題にぶつかることになります。
ようにするための方法があります。

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


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

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

最初のシチュエーションに戻って、コードライン B がコードライン A からブランチした後、2つのチェンジリスト555と556がコードライン B にサブミットされたとします。これらの変更を直接コードライン C に反映するには、次のように実行することができます。:
p4 integrate B/...@555,@556 C/...
p4 resolve
p4 submit
PERFORCEは、チェンジリスト555と556によって影響を受けた B 内のすべてのファイルを示し、それに対応する C のファイルを反映目的で作業状態にします。衝突解決を行う際、PERFORCEは3-ウェイ・マージを実行します。対応する C のファイルへマージされた B のそれぞれのファイルに対して、3-ウェイ・マージに使用されるベース・リビジョンは @554 となります。すなわち、反映される開始リビジョンの親リビジョン(1つ前のリビジョン)が、マージのベースとして使用されます。

また、もし B から C へすべての変更を反映したいと考え、B へサブミットされた最初のチェンジリストが555であることを知っているならば、次のように実行することもできます。:
p4 integrate B/...@555, C/...
p4 resolve
p4 submit
なお、カンマで終わるリビジョン指定子は、次の書き方を短縮したものです。:
p4 integrate B/...@555,#head C/...

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

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

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

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

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


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

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

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



戻る