[ < ] [ > ]   [ << ] [] [ >> ]         [冒頭] [目次] [見出し] [ ? ]

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 組み込む変更を選択する

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 衝突の印づけ).

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

 
<<<<<<< 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 不完全な行)は見つかった ものとして,単純に出力にコピーされます.出力の終りで衝突があり,入力ファ イルの一つが不完全な行で終る場合,不完全な行が追加されるので, ‘|||||||’,‘=======’,または‘>>>>>>>’の大カッコは,行の最 初ではない場所に現れるでしょう.

-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’ と互換性がありません.


[ << ] [ >> ]           [冒頭] [目次] [見出し] [ ? ]

この文書は新堂 安孝によって2009年9月22日texi2html 1.82を用いて生成されました。