Linux で diff3 を使用して 3 つのファイルを比較し、競合を解決する方法

in tech

Linux diff3 コマンドは、3 つのテキスト ファイル間の差異を検出します。これは、バージョンを識別し、その違いを理解し、変更をマージするのに役立ちます。 diff3 は、ソース コード、スクリプト、または任意のプレーン テキスト ファイルに最適です。

差分とは何ですか?

ファイルの違いを見つける

diff は、一連のファイルに対して差分ツールを実行した結果です。結果の出力には、各ファイル内の相違点のリストが含まれます。相違点は、行番号と、相違点が存在するファイルによって識別されます。おそらくご想像のとおり、diff3 は 3 つのファイルから差分を作成します。

Git などのソフトウェア バージョン管理 (SVC) パッケージは、その本質の一部として diff を実行し、それを非常にうまく実行します。ファイルの差分計算に Git または別の SVC を使用している場合は、そのまま使用し続ける必要があります。

diff を利用できるのは開発者だけではありません。異なるファイルに異なるドラフトが保存されているテキストベースの資料がある場合は、差分が役立つ可能性があります。

diff3 コマンドを使用すると、3 つのファイルの差分を取得するという難しい問題が解決されます。

diff3 との違い

差を3倍にする

diff3 は 3 つのファイル名をパラメータとして受け取ります。慣例により、それらは次のように呼ばれます。 私の、 年上の、 そして あなたのもの、ただし、任意の名前を付けることができます。鉱山、古い、およびあなたのモデルは、古い祖先ファイルと 2 つの変更された派生ファイルを前提としています。

以下に簡単な例を示します。

これは私のファイル.txtです。

first line
second line
edited third line

これはold-file.txtです。

first line
second line
third line

これはあなたのファイル.txtです。

first line
second line
changed third line

コマンドラインでファイルを順番にリストすることで、3 方向の差分を実行できます。

diff3 my-file.txt old-file.txt your-file.txt
3 つのファイルで diff3 を使用し、各ファイルに 1 つの変更を加えます。

diff3 は、各ファイルに異なる 3 行目が含まれていることを報告します。

diff3 の出力形式

ハンクとは何ですか?

違いが表示されるのは、 ハンク。ハンクは「====」とオプションの番号で始まり、相違点がどのファイルのものであるかを示します。数字はコマンドライン上のファイルの位置です。数字がない場合は、3 つのファイルがすべて異なることを意味します。

ここに例を示します。ファイル old.txt および yours.txt には次の行が含まれています。

Line 1
Line 2
Line 3

ファイルmine.txtには、変更された最初の行が含まれています。

My file Line 1
Line 2
Line 3

これが diff3 コマンドです。

diff3 mine.txt older.txt yours.txt
3 つのファイルで diff3 を使用し、1 つのファイルに 1 つの変更を加えます。

「====1」区切り文字は、ファイル 1、つまりmine.txt を意味します。

「1:」はファイル 1 を意味します。 「1c」は、古いファイルの同じ行と一致させるには、行 1 を変更する必要があることを意味します。という線が表示されます。

ファイル 2 と 3 の対応する行が示されています。これらには互いに同じテキストが含まれているため、1 回リストされますが、2 回識別されます。積み重ねられた「2:1c」と「3:1c」は、その行が両方のファイルに存在し、その下に行が表示されていることを示します。

このテキストを使用して、mine.txt と yours.txt を同じにしてみましょう。

Line 1
Line 2
Line 3

old.txt ファイルの 2 行目は変更されています。

Line 1
Older file Line 2
Line 3

ファイル名は変更していないので、同じコマンドをもう一度実行できます。

diff3 mine.txt older.txt yours.txt
3 つのファイルで diff3 を使用し、ファイル 2 の 2 行目に 1 つの変更を加えます。

区切り文字「====2」の末尾の「2」は、このハンクの違いがファイル 2 にあることを示しています。ファイル 1 と 3 の対応する行が表示され、ファイル 2 との相違点のある行が表示されます。

ファイル 2 をもう一度変更して、他のファイルにない行を追加してみましょう。

Line 1
Older file Line 2
Line 3
Line 4

同じコマンドを使用できます。

diff3 mine.txt older.txt yours.txt
3 つのファイルで diff3 を使用し、ファイル 2 に 2 つの変更を加え、出力に 2 つのハンクを生成します。

今回はハンクが2人います。両方の区切り文字は、ファイル 2 の相違点を参照します。

最初のハンクは、ファイル 1 の 2 行目と、ファイル 2 の同じ行と一致するように 3 行目を変更する必要があることを意味します。または、ファイル 2 の 2 行目を他の 2 つのファイルと一致するように変更する必要があります。

2 番目のハンクでは、新しい情報が導入されます。 old.txt ファイルには 4 行目があります。 ‘1:3ある‘ と ‘3:3ある‘ ファイル 1 と 3 では改行が必要であることを教えてください。 添付 3 行目以降、ファイル 2 と一致します。その下に線が表示されます。

diff3 が表示できるもう 1 つのものは、差異を含む一連の行です。

この内容でmine.txtとolder.txtを同じにしてみましょう。

Line 1
Line 2
Line 3

yours.txt の 2 行を変更します。

Line 1
Yours Line 2
Yours Line 3

同じコマンドを実行します。

diff3 mine.txt older.txt yours.txt
3 つのファイルで diff3 を使用し、出力に行範囲を含めます。

今回は、ライン インジケーターは単一のライン番号を使用しません。行の範囲を表すために、コンマ「,」で区切られた 2 つの行番号が付いています。たとえば、「1:2,3c」は、ファイル 1 の 2 行目から 3 行目に相違があることを示します。

diff3 とのマージ

すべてをひとつにまとめる

diff3 に相違点をリストさせる代わりに、ファイルの内容と相違点を 1 つのファイルにマージするよう diff3 に依頼できます。実際に行っていることは、ファイル 3 とファイル 2 の差分をファイル 1 にまとめることです。

運が良ければ、ファイルは競合せずにマージされます。場合によっては、ファイル内の同じ場所に変更があり、競合が発生することがあります。競合が強調表示されるので、どの行セットを保持するかを選択できます。

出力はターミナル ウィンドウに書き込まれますが、これをファイルに簡単にリダイレクトし、そのファイルを編集して確認することができます。

ここでは簡単なケースを紹介します。これがmine.txtの内容です。

We're going to
run diff3
against these files.
Yipee!

これは、older.txt にある内容です。

We're going to
run diff3
against these files.

yours.txt ファイルにはこれが含まれています。

We're going to
run the diff3 command
against these files.

使い慣れたコマンドを使用して差分を実行し、-m (マージ) オプションを指定してコマンドを再度実行してマージを実行します。

diff3 mine.txt older.txt yours.txt
diff3 -m mine.txt older.txt yours.txt
競合する変更を行わずに 3 つのファイルに対して差分とマージを実行します。

これにより、older.txt と yours.txt の違いが Mine.txt に融合され、新しい 4 番目のバージョンが作成されます。この出力をキャプチャするには、コマンドにリダイレクトを追加します。

diff3 -m mine.txt older.txt yours.txt > fourth.txt

残念ながら、マージがこれほどスムーズになることはまれです。より複雑な例を次に示します。複数のファイルで同じ行が変更されています。

これが新しいmine.txtです

chaffinch
swallow
pigeon
sparrow
nuthatch

これは新しい old.txt です

chaffinch
swallow
pigeon
dove
nuthatch

最後に、新しい yours.txt です。

chaffinch
cuckoo
rook
dove
nuthatch
woodpecker
goldfinch

これは差分をとった結果です。

diff3 mine.txt older.txt yours.txt
競合する変更を含む 3 つのファイルの差分を実行します。

3 つのファイルすべてに変更があり、1 つのファイルに追加の行があります。マージを実行し、出力を新しいファイルにリダイレクトします。

diff3 -m mine.txt older.txt yours.txt > new-file.txt
3 つのファイルに対して diff を実行し、出力を 4 番目のファイルに送信します。

お気に入りのエディタを使用して、ファイルを開きます。

gedit new-file.txt
エディターで開かれた、競合のある diff の結果。

2 つの区切り文字「>>>>>>」の間のセクションは競合しています。

各ファイルの競合する行が順番に表示されます。ファイル 1 の行は「>>>>>>」の間にあります。

実際のファイルでは、保持したいセクションのテキストを含めるために、競合するいくつかの領域を確認して編集する必要があるでしょう。

違いと対立

異なるバージョンのファイルにどのような変更を加えたかは忘れがちです。 diff3 コマンドを使用すると、これらの違いを簡単に見つけることができます。マージには差分よりも人間の介入が必要ですが、少なくとも diff3 を使用すると競合を見逃すのが難しくなります。

このテーマについてさらに詳しく知りたい方は以下をご覧ください

公式情報はこちら

関連記事

前の投稿
4 GB の RAM を搭載したラップトップに推奨する Linux ディストリビューションは 2 つだけです
次の投稿
PC の下位互換性は奇跡です: 5 つの懐かしいコンポーネントが今でもそのまま挿入可能

関連記事