p4 resolve

ファイルリビジョン間の衝突を解決する場合や、ストリーム仕様の衝突を解決する場合に、このコマンドを使用します。

構文規則

            p4 [g-opts] resolve [-a options] [-A options] [-d options] [-f  -n  -N  -o  -t  -v]  
                     [-c change] [file ...]
        

p4 resolve -So [ -af -am -as -at -ay -n -o ]

ファイルリビジョン間の衝突を解決する場合

p4 resolveは、2つのファイルまたはファイルリビジョンの内容を、ワークスペース内の1つの ファイルリビジョンにまとめるのに使用します。

p4 resolveをファイル引数なしで実行すると、既に衝突解決がスケジュールされている クライアントワークスペース内のすべてのファイルに対して作用します。

ファイルをサブミットする前にp4 resolveを使用しなければならない状況は、 以下の2つの場合です。

  • 単純な衝突が存在しているとき。すなわち、クライアントワークスペースに対して最後に 同期させたファイルのリビジョンが、サブミット時の最新リビジョンではないときです。

    以下に例を示します。

    1. アリスがp4 syncを行い、その後にファイルfile.cp4 editを実行します。ボブも同じことをします。

    2. アリスがfile.cp4 submitコマンドを実行し、 その後ボブがfile.cをサブミットします。

    3. ボブのfile.cがディポに受け入れられると、 アリスがfile.cに加えた変更が参照できなくなってしまうためです。 ボブがファイルをサブミットするためには、まず衝突を解決する必要があります。

  • p4 integrateを使用して、1つのファイル(またはブランチ)から他のファイルへの 変更の反映をスケジュールしているとき。

この2つの状況の主な違いは、単純なファイル衝突を解決するには1つのファイルの 複数リビジョンを必要としますが、変更の反映のために衝突を解決するには、 異なる2つのファイルを組み合わせる必要があるということです。 いずれの場合も下記のようになります。

  • ファイルタイプがtextである場合、p4 resolveを使用すると、ディポ内のファイルの代わりに クライアントワークスペース内のファイルを使用するか、 クライアントワークスペース内のファイルをディポ内のファイルで上書きするか、 またはディポのリビジョンとクライアントワークスペースのリビジョンの 両方からの変更を1つのファイルにマージすることができます。
  • ファイルタイプがbinaryである場合、通常は最初の2つの選択肢 (ワークスペース内のファイルを使用するか、ワークスペース内のファイルをディポ内の ファイルで上書きする)しか利用できません。一般的にマージは バイナリファイルに対して機能しないからです。

p4 resolveコマンドを実行すると、診断情報が表示されます。 ファイルは別のファイルに対して("vs")衝突解決されるか、他のファイルにコピー、 マージ、編集、ブランチ、追加、削除、移動または無視されます。p4 resolveで実行される実際の作業には、 それがクライアントワークスペース内のファイルに対して行った変更が反映されます。

ヒント

リビジョン範囲の使用方法については、「リビジョン範囲の使用」を参照してください。

衝突の検出に使用されるリビジョン

p4 resolveダイアログは4つのファイルリビジョンを参照しますが、単純に解決できる ファイル衝突を修正するのか、変更の反映のために使うのかによって、 リビジョンの意味が次のように変わります。

用語 単純に衝突を解決する場合 反映のために衝突を解決する場合

yours

クライアントワークスペース内のファイルのリビジョン

変更が伝達されようとしている先のファイル(反映の用語では、 これを反映先ファイルと言います)。 変更はクライアントワークスペース内のこのファイルのバージョンに対して加えられ、 このファイルは後でディポにサブミットされます。

theirs

ディポ内のファイルの最新リビジョン。

変更が伝達される元である、ディポ内のファイルリビジョン(反映の用語では、 これを反映元ファイルと言います)。 このファイルは、ディポやクライアントワークスペースでは変更されません。

base

編集目的で作業状態になる前にクライアントワークスペースに対して同期した ファイルリビジョン。

base閉じた ファイルの場合は、反映元ファイルと反映先ファイルにあるファイルリビジョンの中で共通の編集または変更が最も多いファイルリビジョンのことを指します。 チェックアウト後のストリームの場合は、チェックアウト済みバージョンの派生元であるパブリックバージョンのことを指します。リビジョンの場所は、反映元パスと反映先パスのどちらでもかまいません。

merge

yourstheirs、およびbaseから Helixサーバが生成したファイルリビジョン。 ファイルがテキストファイルである場合、解決プロセス中に このリビジョンを編集できます。

 

解決オプションとその詳細

対話式のp4 resolveダイアログでは次のオプションが表示されます。 ダイアログオプションはコマンドラインオプションと同じではないことに注意してください。

ダイアログオプション 簡潔な意味 内容 デフォルトでバイナリファイルに利用できるか

e

edit merged

Helixサーバが生成したマージ済ファイルを編集します。

いいえ

ey

edit yours

現在ワークスペース内にあるファイルのリビジョンを編集します。

はい

et

edit theirs

ワークスペースのリビジョンと衝突しているディポ内のリビジョン(通常は 最新リビジョン)を編集します。この編集は読み取り専用です。

はい

dy

diff yours

yoursbaseの差分を表示します。

いいえ

dt

diff theirs

theirsbaseの差分を表示します。

いいえ

dm

diff merge

mergebaseの差分を表示します。

いいえ

d

diff

mergeyoursの差分を表示します。

はい

m

merge

次のコマンドを起動します。

P4MERGEbasetheirsyoursmerge

このオプションを使用するには、最初の3つのファイルをマージし、 その結果を4番目に書き込むサードパーティ製のプログラムの名前に、 環境変数P4MERGEを設定する必要があります。P4MERGEが設定されていない場合、このコマンドは無効です。

いいえ

?

help

p4 resolveのヘルプを表示します。

はい

s

skip

すぐに解決を実行しません。

はい

ay

accept yours

theirsで加えられた可能性のある変更を無視して、 yoursを受け入れます。

はい

at

accept theirs

theirsを解決済みのリビジョンとしてクライアントワークスペースに受け入れます。 クライアントワークスペースにあったリビジョン(yours)は、上書きされます。

単純な衝突を解決している場合、このオプションは、クライアントワークスペースの ファイルに対してp4 revertを実行するのと同じです。 反映のために衝突を解決している場合、このオプションは反映元ファイルを 反映先ファイルにコピーします。

はい

am

accept merge

mergedファイルを変更のない解決済のリビジョンとしてクライアント ワークスペースに受け入れます。クライアントワークスペースにあった 元のリビジョン(yours)は、上書きされます。

注意

マージの解決を手動で許可することは(p4 resolveamを選択する)、マージの自動解決(p4 resolve -amを実行する)とは異なります。

マージの解決を手動で許可する場合、意識的な選択を行うことになります。

p4 resolve -amでは、yourstheirs、またはmerge が自動的に選択されます(どれが選択されるかは、3方向のマージの差異によって異なります)。追加と削除については、以下のような動作になります。

  • 反映先ファイルにのみ追加と削除が含まれている場合は、反映先ファイルの差異が保持されます(手動でyours を許可する場合と同じ動作になります)

  • 反映元ファイルにのみ追加と削除が含まれている場合、反映元ファイルの差異が保持されます(手動でtheirs を許可する場合と同じ動作になります)

  • 反映元ファイルと反映先ファイルの両方に追加と削除が含まれていて、衝突が存在しない場合、マージ後の結果が保持されます(手動でmerged を許可した場合と同じ動作になります)

  • 反映元ファイルと反映先ファイルの両方に追加と削除が含まれていて、衝突が存在する場合、マージ後の結果がスキップされます(手動でskip を許可した場合と同じ動作になります)

いいえ

ae

accept edit

ファイルを編集した場合(p4 resolveダイアログで「e」を選択して) 、クライアントワークスペースにその編集済のバージョンを採用します。 クライアントワークスペースにあった元のリビジョン(yours)は、上書きされます。

いいえ

a

accept

Helixサーバの 推奨される結果を保持します。

  • theirsbaseと同一である場合、yoursを受け入れます。
  • yoursbaseと同一である場合、theirsを受け入れます。
  • yourstheirsbaseと異なる場合、 yourstheirsに衝突がないときには、 mergeを受け入れます。
  • 上記以外の場合は、yourstheirsに衝突があるため、 このファイルをスキップします。

いいえ

ファイルの衝突解決は、acceptダイアログオプションのいずれかが 選択されたときに完了します。後でファイルを解決するか、変更を元に戻すには、 ファイルをskipします。

p4 resolveにより、ファイルリビジョンに対して加えられた4種類の変更の カウントが表示されるため、どのオプションを選択するかを決めるのに役立ちます。

Diff Chunks: 2 yours + 3 theirs + 5 both + 7 conflicting

これらの値の意味は次のとおりです。

カウント 説明

n yours

n件のyoursの非衝突セグメントが base閉じた ファイルの場合は、反映元ファイルと反映先ファイルにあるファイルリビジョンの中で共通の編集または変更が最も多いファイルリビジョンのことを指します。 チェックアウト後のストリームの場合は、チェックアウト済みバージョンの派生元であるパブリックバージョンのことを指します。と異なっています。

n theirs

n件のtheirsの非衝突セグメントが baseと異なっています。

n both

theirsyoursの双方にn件の非衝突セグメントがありますが、 baseとは異なっています。

n conflicting

ntheirsyoursの件のセグメントが互いに異なり、 baseとも異なります。

衝突しているチャンクがない場合、 生成後のマージファイルを受け入れてもほぼ安全です。 Helixサーバが、 yourstheirsからのすべての変更を baseに代入するからです。

衝突しているチャンクがある場合、mergeファイルを編集する必要があります。 この場合、Helixサーバにより、 衝突しているyours テキスト、theirs テキスト、base テキストが merge ファイルに挿入されます。 保持するチャンクのバージョンを選択することができます。

異なるテキストは、ファイルマーカにより明示されています。

>>>> ORIGINAL VERSION file
#n
<text>==== THEIR VERSION file
#m
<text>==== YOUR VERSION file
<text><<<<

保持するテキストを選択し、衝突しているチャンクとすべての差分マーカを削除してください。

内容に関係しない衝突解決

関連ファイル間の他の競合(ファイルタイプ、削除、ブランチ、移動、 ファイル名の変更に関する競合)を解決することもできます。 詳細については、『Helix Coreコマンドライン(P4)ガイド』の 「衝突を解決する」を参照してください。

処理を1種類の衝突解決に制限するには、 -Aオプションを次のように使用します。

オプション 解決される内容

-Aa

p4 attributeによって設定された属性を解決する

-Ab

反映元を編集し、反映先を削除する

-Ac

ファイル内容の変更とともに操作内容も解決する

-Ad

反映元を削除し、反映先を編集する

-Am

リネームと移動

-At

ファイルタイプの変更

-AQ

文字セットの変更

各解決タイプは別々に処理されます。 例えば、1つのファイルにファイルタイプの衝突と内容の衝突がある場合、 個別に処理方法の指定を要求されます。 すべての解決について同じ結果を望む場合にファイル単位での入力を 要求されないようにするには、-Aオプションの後に-atまたは -ayオプションを指定します。 以下の例は、異なる衝突解決に対する入力要求の動作を示します。

Merging //depot/rel/fileb#1
Diff chunks: 1 yours + 0 theirs + 0 both + 0 conflicting
Accept(a) Edit(e) Diff(d) Merge (m) Skip(s) Help(?) ay: m
//depot/main/filez - resolve skipped.
Resolving move to //depot/main/fileb
Filename resolve:
at: //depot/main/fileb
ay: //depot/main/filez

ストリーム仕様の衝突を解決する場合

ここでは、クライアントAとクライアントBという2つのクライアントで同じストリーム仕様を編集する場合について考えてみます。最初に、クライアントAでストリーム仕様を編集用として開きます。次に、クライアントBで同じストリーム仕様を編集用として開いてサブミットします(または、グローバルな編集を行い、編集内容をクライアントAと同じストリーム仕様に保存します)。この状態でクライアントAでストリーム仕様を開くと、衝突が発生することになります。

p4 submit [-Si|-So|-Sx]コマンドを実行すると衝突状態が検出され、作業状態のストリームのサブミットが禁止されます。

p4 resolve –So [ -af -am -as -at -ay -n -o ]コマンドを実行すると、衝突のプレビューを表示することができます。また、変更内容をマージして衝突を解決することもできます。resolveコマンドでは、theirsの変更またはyoursの変更を無視することができます。

ファイルを処理する場合のオプション

-aoptions
-am
-af
-as
-at
-ay

解決ダイアログをスキップします。次のようにして自動的に ファイル衝突を解決します。

  • -am: 自動モード。推奨のファイルリビジョンを自動的に受け入れます。 theirsbaseと等しい場合、 yoursを受け入れます。 yoursbaseと等しい場合、 theirsを受け入れます。 yourstheirsbaseと異なり、 yourstheirsの間に衝突がない場合、mergeを受け入れます。 上記以外の場合、yourstheirsの間に衝突があるため、 このファイルをスキップします。
  • -ay: yoursを受け入れてtheirsを無視します。
  • -at: theirsを受け入れます。 クライアントワークスペース内のファイルが上書きされるため、 このオプションは注意して使用してください。
  • -as: 安全な受け入れ。yourstheirsのいずれかがbaseと異なっている場合、該当するリビジョンを受け入れます。変更内容が一致している場合は、theirsを受け入れます。両方がbaseと異なる場合、このファイルをスキップします。このオプションの動作は、 dm.resolve.ignoredeleted 構成可能変数を使用してカスタマイズすることができます。
  • -af: 強制受け入れ。常にmergeファイルを受け入れます。 mergeファイルに衝突マーカがある場合、マーカはファイルに残されるため、 ファイルを編集してマーカを削除する必要があります。
注意

ブランチAでファイルを削除してブランチBでは削除しなかった場合、ブランチBを ブランチAにマージすると衝突が発生します。この状態でp4 resolve -asコマンドを実行しても、衝突を解決することはできません。ただし、 dm.resolve.ignoredeleted 構成可能変数の値を「1」に設定してp4 resolve -asコマンドを実行すると、ブランチA内のファイル削除が優先されるため、衝突が解決します。

-Aoptions
-Aa
-Ab
-Ac
-Ad
-At
-Am

操作の衝突解決: 解決タイプを、ブランチ、削除、ファイルタイプ変更、または移動/リネームに制限します。

  • -Aa: p4 attributeによって設定された属性を解決する
  • -Ab: ファイルのブランチ操作、つまり反映元が編集され反映先が 削除される反映を解決します。
  • -Ac: ファイル内容の変更を衝突解決します。
  • -Ad: 反映元が削除され反映先が削除される反映を解決します。
  • -At: ファイルタイプの変更
  • -Am: 移動とリネーム

詳細については、 Helix Coreコマンドライン(P4)ガイドと 「内容に関係しない衝突解決 」を 参照してください。

-doption

ファイルをマージする際、空白文字または行末規則に関して指定された 差分を無視します。(これらのオプションを指定し、かつファイルの差分が 空白文字のみであった場合、p4 resolveはワークスペースのファイル内にある テキストを使用します)

  • -db: 空白文字のみの変更を無視します(タブを8個の空白文字に置換した場合など)
  • -dw: 空白文字を完全に無視します(タブやその他の空白文字を削除した場合など)
  • -dl: 行末規則の相違を無視します。

-f

既に衝突解決済みであるがまだサブミットされていないファイルの 衝突再解決を可能にします。

ヒント

再解決されるターゲット(yours)ファイルの内容は、元のファイルの内容ではなく、前回の解決の結果です。元のファイルを使用するオプションを残すには、解決済みのファイルを元に戻します。詳細については、「ファイルの場合のコマンド例」を参照してください。

-n

衝突解決が必要なファイルを、実際に衝突解決を実行せずに一覧表示します。

-N

スケジュールされている、内容に関係しない衝突解決処理に関する 補足情報とともに処理をプレビューします。

-o

衝突解決時に使用されるベースファイルの名前とリビジョンを出力します。

-t

バイナリ(非テキスト)ファイルに対しても、3ウェイマージを強制します。 これにより、あらゆるタイプのファイル間の差分を検査できます。 P4MERGEが非テキストファイルをマージできるユーティリティに設定されている場合、 ユーザに非テキストファイルをマージさせます。

-v

yoursとbase間、およびtheirsとbase間のすべての変更を示す衝突マーカを、 ファイルに含めます。通常、yoursとthiresが衝突している場合にのみ、 衝突マーカが含まれます。

-c change

衝突解決処理の範囲を、特定のチェンジリスト番号で作業状態にされている ファイルに限定します。

g-opts

グローバルオプション」を参照してください。

ストリームを処理する場合のオプション

-Soオプションを指定すると、作業状態のストリーム仕様の衝突のみが解決されます。以下に例を示します。

p4 resolve –So [ -af -am -as -at -ay -n -N -o ]

-af

衝突が含まれているテキストフィールドを強制的に組み合わせます。

-am 変更をマージして衝突を解決し、衝突が含まれているフィールドをスキップします。
-as 安全な衝突解決を実行し、マージが必要なフィールドをスキップします。
-at theirsの変更を強制的に受け入れ、yoursの変更を上書きします。
-ay yoursの変更を強制的に受け入れ、theirsの変更を無視します。
-n 衝突を解決する必要があるフィールドをプレビュー表示します。
-o マージで使用されるベースとなる変更(haveの変更)を出力します。

使用上の注意点

ファイル引数でリビジョン指定子を使用できるか? ファイル引数でリビジョン範囲を使用できるか? 最低限必要なアクセスレベル

いいえ

いいえ

open

p4 resolve このコマンドは、既に衝突解決がスケジュールされているファイルにのみ作用します。

ファイルの衝突解決をスケジュールする操作は3つあります。

オプション 説明
p4 integrateまたはp4 mergeによりファイルの反映を行います。
  • ファイルの衝突解決をスケジュールする際、p4 integrateでは最も近い 共通の祖先がbaseとして選択されます。
  • p4 mergeコマンドでは、反映元ファイルおよび反映先ファイルで 共通の編集が最も多いリビジョンが選択されます。
現在の最新リビジョン以外のリビジョンと同期した作業中ファイルをサブミットします。 サブミットは失敗し、ファイルの衝突解決がスケジュールされます。
作業中ファイルに対してp4 syncを実行する代わりに、 p4 submitを実行します。 クライアントワークスペースには何もコピーされません。 代わりに、ファイルの衝突解決がスケジュールされます。 p4 sync経由でファイルの衝突解決をスケジュールすることの利点は、 サブミットが失敗しないことです。

注意

textファイルとunicodeファイルの反映処理中に 変換エラーが発生した場合、最も可能性の高い原因として、 textファイルに非ASCII文字が存在していることが考えられます。 その場合は、反映を行う前にファイルから非ASCII文字を削除するか、 P4CHARSETの値を「utf8」に設定してから、 もう一度マージを実行してください。

ファイルの場合のコマンド例

-fフラグを使用したファイルの再解決は、解決済みのファイルを元に戻して再度解決を実行することとは必ずしも同じではありません。最初の解決でtheirsを受け入れる(-at)オプションを使用したと仮定します。

>$ p4 resolve -at
$ /Users/bruno/dir8/dir2/fileA.txt - vs //depot/dir6/dir2/fileA.txt#2
//bruno/dir8/dir2/fileA.txt - copy from //depot/dir6/dir2/fileA.txt

再解決以外は、代わりにyoursを受け入れる(-ay)オプション使用します。

>
$ p4 resolve -f -ay
/Users/bruno/dir8/dir2/fileA.txt - vs //depot/dir6/dir2/fileA.txt#2
//bruno/dir8/dir2/fileA.txt - copy from //depot/dir6/dir2/fileA.txt

この場合、ディポのバージョンは無視されているディポのバージョンの代わりにクライアントワークスペースにコピーされます。

ストリームの衝突を解決する場合のコマンド例

衝突が存在する場合、以下のような出力が表示され、作業状態のストリームに対する編集内容をサブミットすることはできません。

p4 -c ws0 submit -d "Conflict detected?" -So
Submitting change 5.
Stream //root/main is out of date; run 'p4 stream resolve'.

ストリームの衝突解決のプレビューは、以下のように表示されます。

p4 -c ws0 resolve -So -n
//root/main Paths - resolving //root/main@4

変更をマージしてストリームの衝突を解決する場合、–amオプションを指定すると衝突解決が失敗しますが、–afオプションを指定すると成功します。

p4 -c ws0 resolve -So -am

//root/main Paths - skipped //root/main@4
p4 -c ws0 resolve -So -af

//root/main Paths - combined with //root/main@4

Paths:」フィールドは、以下のようになります。

Paths:

share a # open

share c # open

share b # open

関連コマンド

衝突解決済みであるがサブミットされていないファイルの一覧を表示する

p4 resolved

2つの異なるファイル間の変更の伝達をスケジュールする

p4 integrate

変更済ファイルセットをディポにサブミットする

p4 submit

クライアントワークスペースにファイルをコピーするか、 作業中ファイルの衝突解決をスケジュールする

p4 sync