二人の人が同じファイルのコピーへの変更を行なったとき,衝突している部分の 警告を用いて,お互いの変更の両方を含んでいるマージされた出力を @command{diff3}で生成することが可能です.
三つ以上のファイルを同時に比較するために,@command{diff4}と @command{diff5}のような名前のプログラムを想像するかもしれませんが,実際 にそれが必要になることは滅多にありません.二つの変更の組を同時にマージす ることで,三つ以上のファイルの変更の組をマージするために, @command{diff3}を使用することが可能です.
@command{diff3}で,二つの修正されたバージョンから共通の以前のバージョン に変更を取り込むことが可能です.これで,二つの新しいファイルに存在する変 更された組をマージします.二番目の引数として共通の以前のバージョンを指定 し,二つの新しいバージョンを最初と三番目の引数として以下のように指定して ください.
diff3 mine older yours
アルファベット順なので,引数の順番を覚えられるでしょう.
このことから,yoursからolderを取り除いてその結果をmine に追加したり,olderからyoursへの変更をmineにマージして いると考えられるでしょう.このマージは,それぞれの変更が近くにあり, mineとolderでマッチする限りうまくいくでしょう.すべての三つ の入力ファイルが異なっているときや,olderだけが異なっているときは うまくいかないでしょう.これを衝突(conflict)と呼んでいます.三つの 入力ファイルがすべて異なるとき,この衝突をオーバーラップ(overlap) と呼んでいます.
@command{diff3}は,オーバーラップや衝突を処理する方法も提供しています. オーバーラップや衝突を削除したり,オーバーラップだけを選択したり,衝突を 特殊な`<<<<<<<'と`>>>>>>>'の行で印を付けたりすることが可能です.
@command{diff3}で,マージした出力を作成するために最初のファイルに適用す ることが可能な@command{ed}スクリプトとして,マージした結果を出力すること も可能です.しかし,@command{diff3}でマージした出力を直接生成した方が良 いでしょう.これで@command{ed}の問題も回避します.
mineにマージするために,@option{-e}や@option{--ed}を用いて, olderからyoursへのマージされていないすべての変更を選択するこ とが可能です.@option{-3}や@option{--easy-only}を用いて,オーバーラップ のないマージされていない変更だけを選択することが可能で,@option{-x}や @option{--overlap-only}を用いて,オーバーラップされている変更だけを選択 することも可能です.
@option{-e},@option{-3},そして@option{-x}オプションは,@dfn{マージされ ていない変更(unmerged changes)},例えば,mineとyoursで変更が 異なるところだけを選択します.mineとyoursが同じところでは, 変更部分は既にマージされていると仮定されるので,olderから yoursへの変更を無視します.この仮定が安全ではない場合,@option{-A} や@option{--show-all}オプションを使用することが可能です(see section 衝突の印づけ).
これら三つのオプションをそれぞれ用いたコマンド@command{diff3}の出力例は 以下のようになります(ファイルの完全な内容は,see section 三番目の入力ファイルの見本). @option{-e}の出力が@option{-3}と@option{-x}で出力される変更の組をバラし て合体させたものになっていることに注意してください.
`diff3 -e lao tzu tao'の出力です.
11a -- The Way of Lao-Tzu, tr. Wing-tsit Chan . 8c so we may see their result. .
`diff3 -3 lao tzu tao'の出力です.
8c so we may see their result. .
`diff3 -x lao tzu tao'の出力です.
11a -- The Way of Lao-Tzu, tr. Wing-tsit Chan .
@command{diff3}で,衝突部分に特殊なマーカー行を用いてマージされた出力を 囲むことで,印を付けることが可能です.二つのファイルAとBから の衝突は,以下のように印が付きます.
<<<<<<< A lines from A ======= lines from B >>>>>>> B
三つのファイルA,BそしてCからの衝突は,以下のように印 が付きます.
<<<<<<< A lines from A ||||||| B lines from B ======= lines from C >>>>>>> C
@option{-A}や@option{--show-all}オプションは,@option{-e}オプションのよ うな動作をしますが,衝突部分を大カッコで囲み,マージされていない変更だけ でなく,olderからyoursへのすべての変更を出力します.このため, サンプルの入力ファイル(see section 三番目の入力ファイルの見本)が与えられると, `diff3 -A lao tzu tao'は,`tzu'の差異部分の衝突の周りに大カッ コを書きます.
<<<<<<< tzu ======= The Way that can be told of is not the eternal Way; The name that can be named is not the eternal name. >>>>>>> tao
また,三方向の衝突は以下のように出力されます.
<<<<<<< lao ||||||| tzu They both may be called deep and profound. Deeper and more profound, The door of all subtleties! ======= -- The Way of Lao-Tzu, tr. Wing-tsit Chan >>>>>>> tao
@option{-E}や@option{--show-overlap}オプションは,@option{-A}や @option{--show-all}オプションより情報が少なくなり,それはマージされてい ない変更だけを出力し,二番目のファイルの内容を出力しないためです.そのた め,@option{-E}オプションは@option{-e}オプションのように動作しますが,三 方向のオーバーラップした変更で,最初と三番目のファイルが大カッコで囲みま す.同様に,@option{-X}は@option{-x}のように動作しますが,(オーバーラッ プが必要な)変更のすべてを大カッコで囲みます.例えば,上記のような三方向 のオーバーラップしている変更に対し,@option{-E}と@option{-X}オプションは 以下を出力します.
<<<<<<< lao ======= -- The Way of Lao-Tzu, tr. Wing-tsit Chan >>>>>>> tao
無意味で情報のない名前を持つファイルを比較している場合,`<<<<<<<', `|||||||',そして`>>>>>>>'の大カッコで別名を表示するために, @option{-L label}や@option{--label=label}オプションを使用す ることが可能です.このオプションで,それぞれの入力ファイルごとに,三回ま で与えることが可能です.このため,`diff3 -A -L X -L Y -L Z A B C'は `diff3 -A A B C'のように動作しますが,出力は,ファイル名`A', `B',そして`C'ではなく,ファイル名`X',`Y',そして `Z'からのようになります.
@option{-m}や@option{--merge}オプションを用いると,@command{diff3}はマー ジされたファイルを直接出力します.これは,それを生成するために @command{ed}を使用するより効果的で,@command{ed}が除外するテキストではな いファイルでも動作します.@command{ed}スクリプトオプションを使用せずに @option{-m}を指定する場合,@option{-A} (@option{--show-all})が仮定されま す.
例えば,コマンド`diff3 -m lao tzu tao'は(入力ファイルのコピーは see section 三番目の入力ファイルの見本),以下の出力を生成します.
<<<<<<< tzu ======= The Way that can be told of is not the eternal Way; The name that can be named is not the eternal name. >>>>>>> tao The Nameless is the origin of Heaven and Earth; The Named is the mother of all things. Therefore let there always be non-being, so we may see their subtlety, And let there always be being, so we may see their result. The two are the same, But after they are produced, they have different names. <<<<<<< lao ||||||| tzu They both may be called deep and profound. Deeper and more profound, The door of all subtleties! ======= -- The Way of Lao-Tzu, tr. Wing-tsit Chan >>>>>>> tao
@option{-m}を用いると,不完全な行(see section 不完全な行)は見つかった ものとして,単純に出力にコピーされます.出力の終りで衝突があり,入力ファ イルの一つが不完全な行で終る場合,不完全な行が追加されるので, `|||||||',`=======',または`>>>>>>>'の大カッコは,行の最 初ではない場所に現れるでしょう.
@option{-m}オプションを用いないと,@command{ed}スクリプトオプションが指 定されていて,不完全な行が見つかる場合,@command{diff3}は警告を生成し, 改行が存在しないかのように動作します.
伝統的なUnix @command{diff3}は,変更を保存するコマンド`w'と`q' を後置しない@command{ed}スクリプトを生成します.System V @command{diff3} は,これらの追加コマンドを生成します.GNU @command{diff3}は通常,伝 統的なUnix @command{diff3}のように動作しますが,@option{-i}オプションを 用いると,System V @command{diff3}のように動作し,`w'と`q'コマ ンドを後置します.
@option{-i}オプションは,@command{ed}スクリプトオプションの @option{-AeExX3}の一つを要求し,マージされた出力のオプション@option{-m} と互換性がありません.
Go to the first, previous, next, last section, table of contents.