[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

8. 共通の先祖からマージ

二人の人が同じファイルのコピーへの変更を行なったとき,衝突している部分の 警告を用いて,お互いの変更の両方を含んでいるマージされた出力を diff3で生成することが可能です.

三つ以上のファイルを同時に比較するために,diff4diff5のような名前のプログラムを想像するかもしれませんが,実際 にそれが必要になることは滅多にありません.二つの変更の組を同時にマージす ることで,三つ以上のファイルの変更の組をマージするために, diff3を使用することが可能です.

diff3で,二つの修正されたバージョンから共通の以前のバージョン に変更を取り込むことが可能です.これで,二つの新しいファイルに存在する変 更された組をマージします.二番目の引数として共通の以前のバージョンを指定 し,二つの新しいバージョンを最初と三番目の引数として以下のように指定して ください.

 
diff3 mine older yours

アルファベット順なので,引数の順番を覚えられるでしょう.

このことから,yoursからolderを取り除いてその結果をmine に追加したり,olderからyoursへの変更をmineにマージして いると考えられるでしょう.このマージは,それぞれの変更が近くにあり, mineolderでマッチする限りうまくいくでしょう.すべての三つ の入力ファイルが異なっているときや,olderだけが異なっているときは うまくいかないでしょう.これを衝突(conflict)と呼んでいます.三つの 入力ファイルがすべて異なるとき,この衝突をオーバーラップ(overlap) と呼んでいます.

diff3は,オーバーラップや衝突を処理する方法も提供しています. オーバーラップや衝突を削除したり,オーバーラップだけを選択したり,衝突を 特殊な`<<<<<<<'と`>>>>>>>'の行で印を付けたりすることが可能です.

diff3で,マージした出力を作成するために最初のファイルに適用す ることが可能なedスクリプトとして,マージした結果を出力すること も可能です.しかし,diff3でマージした出力を直接生成した方が良 いでしょう.これでedの問題も回避します.

8.1 組み込む変更を選択する  Selecting changes to incorporate.
8.2 衝突の印づけ  Marking conflicts.
8.3 マージされた出力を直接生成する  Generating merged output directly.
8.4 不完全な行をdiff3がマージする方法  How diff3 merges incomplete lines.
8.5 変更されたファイルの保存  Emulating System V behavior.


8.1 組み込む変更を選択する

mineにマージするために,`-e'や`--ed'を用いて, olderからyoursへのマージされていないすべての変更を選択するこ とが可能です.`-3'や`--easy-only'を用いて,オーバーラップ のないマージされていない変更だけを選択することが可能で,`-x'や `--overlap-only'を用いて,オーバーラップされている変更だけを選択 することも可能です.

`-e',`-3',そして`-x'オプションは,マージされ ていない変更(unmerged changes),例えば,mineyoursで変更が 異なるところだけを選択します.mineyoursが同じところでは, 変更部分は既にマージされていると仮定されるので,olderから yoursへの変更を無視します.この仮定が安全ではない場合,`-A' や`--show-all'オプションを使用することが可能です(see section 8.2 衝突の印づけ).

これら三つのオプションをそれぞれ用いたコマンドdiff3の出力例は 以下のようになります(ファイルの完全な内容は,see section 7.1 三番目の入力ファイルの見本). `-e'の出力が`-3'と`-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
.


8.2 衝突の印づけ

diff3で,衝突部分に特殊なマーカー行を用いてマージされた出力を 囲むことで,印を付けることが可能です.二つのファイルABから の衝突は,以下のように印が付きます.

 
<<<<<<< A
lines from A
=======
lines from B
>>>>>>> B

三つのファイルABそしてCからの衝突は,以下のように印 が付きます.

 
<<<<<<< A
lines from A
||||||| B
lines from B
=======
lines from C
>>>>>>> C

`-A'や`--show-all'オプションは,`-e'オプションのよ うな動作をしますが,衝突部分を大カッコで囲み,マージされていない変更だけ でなく,olderからyoursへのすべての変更を出力します.このため, サンプルの入力ファイル(see section 7.1 三番目の入力ファイルの見本)が与えられると, `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

`-E'や`--show-overlap'オプションは,`-A'や `--show-all'オプションより情報が少なくなり,それはマージされてい ない変更だけを出力し,二番目のファイルの内容を出力しないためです.そのた め,`-E'オプションは`-e'オプションのように動作しますが,三 方向のオーバーラップした変更で,最初と三番目のファイルが大カッコで囲みま す.同様に,`-X'は`-x'のように動作しますが,(オーバーラッ プが必要な)変更のすべてを大カッコで囲みます.例えば,上記のような三方向 のオーバーラップしている変更に対し,`-E'と`-X'オプションは 以下を出力します.

 
<<<<<<< lao
=======

  -- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao

無意味で情報のない名前を持つファイルを比較している場合,`<<<<<<<', `|||||||',そして`>>>>>>>'の大カッコで別名を表示するために, `-L label'や`--label=label'オプションを使用す ることが可能です.このオプションで,それぞれの入力ファイルごとに,三回ま で与えることが可能です.このため,`diff3 -A -L X -L Y -L Z A B C'は `diff3 -A A B C'のように動作しますが,出力は,ファイル名`A', `B',そして`C'ではなく,ファイル名`X',`Y',そして `Z'からのようになります.


8.3 マージされた出力を直接生成する

`-m'や`--merge'オプションを用いると,diff3はマー ジされたファイルを直接出力します.これは,それを生成するために edを使用するより効果的で,edが除外するテキストではな いファイルでも動作します.edスクリプトオプションを使用せずに `-m'を指定する場合,`-A' (`--show-all')が仮定されま す.

例えば,コマンド`diff3 -m lao tzu tao'は(入力ファイルのコピーは see section 7.1 三番目の入力ファイルの見本),以下の出力を生成します.

 
<<<<<<< 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


8.4 不完全な行をdiff3がマージする方法

`-m'を用いると,不完全な行(see section 3. 不完全な行)は見つかった ものとして,単純に出力にコピーされます.出力の終りで衝突があり,入力ファ イルの一つが不完全な行で終る場合,不完全な行が追加されるので, `|||||||',`=======',または`>>>>>>>'の大カッコは,行の最 初ではない場所に現れるでしょう.

`-m'オプションを用いないと,edスクリプトオプションが指 定されていて,不完全な行が見つかる場合,diff3は警告を生成し, 改行が存在しないかのように動作します.


8.5 変更されたファイルの保存

伝統的なUnix diff3は,変更を保存するコマンド`w'と`q' を後置しないedスクリプトを生成します.System V diff3 は,これらの追加コマンドを生成します.GNU diff3は通常,伝 統的なUnix diff3のように動作しますが,`-i'オプションを 用いると,System V diff3のように動作し,`w'と`q'コマ ンドを後置します.

`-i'オプションは,edスクリプトオプションの `-AeExX3'の一つを要求し,マージされた出力のオプション`-m' と互換性がありません.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html