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つの場合です。
-
単純な衝突が存在しているとき。すなわち、クライアントワークスペースに対して最後に同期させたファイルのリビジョンが、サブミット時の最新リビジョンではないときです。
例えば、アリスが
p4 sync
を行い、その後にファイルfile.c
のp4 edit
を実行します。ボブも同じことをします。 アリスがp4 submit
でfile.c
をサブミットし、次にボブがfile.c
をサブミットしようとしても失敗します。 ボブの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 |
編集目的で作業状態になる前にクライアントワークスペースに対して同期したファイルリビジョン。 |
theirsの過去の反映済みリビジョン。 yoursとtheirsの最新の共通の祖先。 |
merge |
yours、theirs、およびbaseからHelixサーバが生成したファイルリビジョン。 ファイルがテキストファイルである場合、解決プロセス中にこのリビジョンを編集できます。 |
左の意味と同じです。 |
解決オプションとその詳細
対話式のp4 resolve
ダイアログでは次のオプションが表示されます。 ダイアログオプションはコマンドラインオプションと同じではないことに注意してください。
ダイアログオプション | 簡潔な意味 | 内容 | デフォルトでバイナリファイルに利用できるか |
---|---|---|---|
|
edit merged |
Helixサーバが生成したマージ済ファイルを編集します。 |
いいえ |
|
edit yours |
現在ワークスペース内にあるファイルのリビジョンを編集します。 |
はい |
|
edit theirs |
ワークスペースのリビジョンと衝突しているディポ内のリビジョン(通常、最新リビジョン)を編集します。 この編集は読み取り専用です。 |
はい |
|
diff yours |
yoursとbaseの差分を表示します。 |
いいえ |
|
diff theirs |
theirsとbaseの差分を表示します。 |
いいえ |
|
diff merge |
mergeとbaseの差分を表示します。 |
いいえ |
|
diff |
mergeとyoursの差分を表示します。 |
はい |
|
merge |
次のコマンドを起動します。 P4MERGE base theirs yours merge このオプションを使用するには、最初の3つのファイルをマージし、その結果を4番目に書き込むサードパーティ製のプログラムの名前に、環境変数 |
いいえ |
|
help |
|
はい |
|
skip |
すぐに解決を実行しません。 |
はい |
|
accept yours |
theirsで加えられた可能性のある変更を無視して、yoursを受け入れます。 |
はい |
|
accept theirs |
theirsを解決済みのリビジョンとしてクライアントワークスペースに受け入れます。 クライアントワークスペースにあったリビジョン(yours)は、上書きされます。 単純な衝突を解決している場合、このオプションは、クライアントワークスペースのファイルに対して |
はい |
|
accept merge |
mergedファイルを変更のない解決済のリビジョンとしてクライアントワークスペースに受け入れます。 クライアントワークスペースにあった元のリビジョン(yours)は、上書きされます。 |
いいえ |
|
accept edit |
ファイルを編集した場合( |
いいえ |
|
accept |
Helixサーバの推奨される結果を保持する。
|
いいえ |
ファイルの衝突解決は、accept
ダイアログオプションのいずれかが選択されたときに完了します。 後でファイルを解決するか、変更を元に戻すには、ファイルをskip
します。
p4
resolve
により、ファイルリビジョンに対して加えられた4種類の変更のカウントが表示されるため、どのオプションを選択するかを決めるのに役立ちます。
Diff Chunks: 2 yours + 3 theirs + 5 both + 7 conflicting
これらの値の意味は次のとおりです。
カウント | 意味 |
---|---|
|
|
|
|
|
|
|
|
衝突しているチャンクがない場合、Helixサーバが生成したマージファイルを受け入れてもほぼ安全です。Helixサーバが、yoursとtheirsからのすべての変更をbaseに代入するからです。
衝突しているチャンクがある場合、mergeファイルを編集する必要があります。 この場合、Helixサーバは衝突しているyours、theirs、およびbaseテキストをmergeファイルに含めます。どのバージョンのチャンクを保持するかは、任意に選択してください。
異なるテキストは、ファイルマーカにより明示されています。
>>>> ORIGINAL VERSION file #n <text>==== THEIR VERSION file #m <text>==== YOUR VERSION file <text><<<<
保持したいテキストを選択し、衝突しているチャンクとすべての差分マーカを削除してください。
内容に関係しない衝突解決
ファイル内容の相違以外に、関連するファイル間における別の種類の相違(ファイルタイプ、削除、ブランチ、移動、リネーム)を解決することもできます。 詳細については、『Helix Coreサーバユーザーガイド』を参照してください。 処理を1種類の衝突解決に制限するには、-A
オプションを次のように使用します。
オプション | 解決される内容 |
---|---|
|
|
|
反映元が編集され、反映先が削除される反映 |
|
ファイル内容の変更とともに操作内容も解決する |
|
反映元が削除され、反映先が編集される反映 |
|
リネームと移動 |
|
ファイルタイプの変更 |
|
文字セットの変更 |
各解決タイプは別々に処理されます。 例えば、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の変更を無視することができます。
ファイルを処理する場合のオプション
|
解決ダイアログをスキップします。次のようにして自動的にファイル衝突を解決します。
|
|
操作の(内容に関係しない)衝突解決。解決タイプを、ブランチ、削除、ファイルタイプ変更、または移動/リネームに制限します。
詳細については、「Helix Coreサーバユーザーガイド」と「内容に関係しない衝突解決」を参照してください。 |
|
ファイルをマージする際、空白文字または行末規則に関して指定された差分を無視します。 (これらのオプションを指定し、かつファイルの差分が空白文字のみだった場合、
|
|
既に衝突解決済みであるがまだサブミットされていないファイルの衝突再解決を可能にします。 ヒント
再解決されるターゲット (yours) ファイルの内容は、元のファイルの内容ではなく、前回の解決の結果です。 元のファイルを使用するオプションを残すには、解決済みのファイルを元に戻します。 詳細については、「ファイルの場合のコマンド例」を参照してください。 |
|
衝突解決が必要なファイルを、実際に衝突解決を実行せずに一覧表示します。 |
|
スケジュールされている、内容に関係しない衝突解決処理に関する補足情報とともに処理をプレビューします。 |
|
衝突解決時に使用されるベースファイルの名前とリビジョンを出力します。 |
|
バイナリ(非テキスト)ファイルに対しても、3ウェイマージを強制します。 これにより、あらゆるタイプのファイル間の差分を検査できます。 |
|
yoursとbase間、およびtheirsとbase間のすべての変更を示す衝突マーカを、ファイルに含めます。 通常、yoursとthiresが衝突している場合にのみ、衝突マーカが含まれます。 |
|
衝突解決処理の範囲を、特定のチェンジリスト番号で作業状態にされているファイルに限定します。 |
|
詳細については、「グローバルオプション」を参照してください。 |
ストリームを処理する場合のオプション
-Soオプションを指定すると、作業状態のストリーム仕様の衝突のみが解決されます。 例えば、以下のように指定します。
p4 resolve –So [ -af -am -as -at -ay -n -o ]
|
衝突が含まれているテキストフィールドを強制的に組み合わせます。 |
-am
|
変更をマージして衝突を解決し、衝突が含まれているフィールドをスキップします。 |
-as
|
安全な衝突解決を実行し、マージが必要なフィールドをスキップします。 |
-at
|
theirsの変更を強制的に受け入れ、yoursの変更を上書きします。 |
-ay | yoursの変更を強制的に受け入れ、theirsの変更を無視します。 |
-n | 衝突を解決する必要があるフィールドをプレビュー表示します。 |
-o | マージで使用されるベースとなる変更(haveの変更)を出力します。 |
使用上の留意点
ファイル引数にリビジョン指定子を使えるか? | ファイル引数にリビジョン範囲を使えるか? | 最低限必要なアクセスレベル |
---|---|---|
使用不可 |
使用不可 |
|
p4 resolve は、既に衝突解決をスケジュールされているファイルにのみ作用します。
ファイルの衝突解決をスケジュールする操作は3つあります。
オプション | 説明 |
---|---|
p4 integrate または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
関連コマンド
衝突解決済みであるがサブミットされていないファイルの一覧を表示する |
|
2つの異なるファイル間の変更の伝達をスケジュールする |
|
変更済ファイルセットをディポにサブミットする |
|
クライアントワークスペースにファイルをコピーするか、作業中ファイルの衝突解決をスケジュールする |