diff3 コマンド

3つのファイルを行ごとに比較します。

概要

diff3 は3つのファイルを比較し、それらの間の違いを識別します。特に、共通の祖先から派生した2つの異なるバージョンのファイルからの変更をマージするのに役立ち、バージョン管理や共同編集において価値があります。

オプション

-A, --show-all

特殊なマーカーを使用して、競合を含むすべての変更を出力します。

$ diff3 -A file1 file2 file3
<<<<<<< file1
Line from file1
||||||| file2
Line from file2
======= 
Line from file3
>>>>>>> file3

-e, --ed

最初のファイルから3番目のファイルへの変更を2番目のファイルに組み込むedスクリプトを作成します。

$ diff3 -e file1 file2 file3
w
q

-m, --merge

競合がマークされたマージファイルを出力します。

$ diff3 -m file1 file2 file3
<<<<<<< file1
Line from file1
||||||| file2
Line from file2
=======
Line from file3
>>>>>>> file3

-T, --initial-tab

出力行の先頭にタブを付けることで、タブを揃えます。

$ diff3 -T file1 file2 file3
	<<<<<<< file1
	Line from file1
	||||||| file2
	Line from file2
	=======
	Line from file3
	>>>>>>> file3

-x, --overlap-only

重複する変更のみを表示します。

$ diff3 -x file1 file2 file3
==== 1:1c 2:1c 3:1c
Line from file1
Line from file2
Line from file3

使用例

基本的な比較

$ diff3 original.txt yours.txt theirs.txt
====
1:1c
This is the original line.
2:1c
This is your modified line.
3:1c
This is their modified line.

マージファイルの作成

$ diff3 -m original.txt yours.txt theirs.txt > merged.txt
$ cat merged.txt
<<<<<<< yours.txt
This is your modified line.
||||||| original.txt
This is the original line.
=======
This is their modified line.
>>>>>>> theirs.txt

マージ用のEdスクリプトの作成

$ diff3 -e original.txt yours.txt theirs.txt > merge.ed
$ ed - yours.txt < merge.ed > merged.txt

ヒント:

出力フォーマットの理解

デフォルトの出力では、各変更は ==== の後に行番号と変更タイプでマークされます。例えば、1:1c 2:1c 3:1c は3つのファイルすべての1行目が変更されていることを意味します。

バージョン管理でのdiff3の使用

異なるブランチからの変更をマージする場合、最初の引数として元のファイル、2番目に自分の修正バージョン、3番目に相手の修正バージョンを使用します。

マージ競合の解決

-m オプションを使用する場合、出力ファイル内の競合マーカー(<<<<<<<|||||||=======>>>>>>>)を探し、手動で編集して競合を解決します。

よくある質問

Q1. diffとdiff3の違いは何ですか?

A. diff は2つのファイルを比較しますが、diff3 は3つのファイルを比較します。これにより、共通の祖先から派生した2つの異なるバージョンからの変更をマージするのに役立ちます。

Q2. diff3の出力をどのように解釈すればよいですか?

A. 出力はファイルが異なる部分を示し、各ファイルからの行番号と内容を表示します。フォーマットは使用するオプションによって異なります。

Q3. diff3は自動的に競合を解決できますか?

A. いいえ、diff3は競合を識別できますが、自動的に解決することはできません。出力に競合をマークし、手動で解決する必要があります。

Q4. マージ出力をファイルに保存するにはどうすればよいですか?

A. リダイレクションを使用します:diff3 -m file1 file2 file3 > merged_file

参考文献

https://www.gnu.org/software/diffutils/manual/html_node/Invoking-diff3.html

改訂履歴