このdiff
プログラムは、さまざまな形で、2 つのテキスト ファイルの違いを計算し、両方のファイル全体を表示するよりもコンパクトに表現するのにかなり優れています。挿入および削除された一連の行のチャンク (または場合によっては変更された行ですが、これは削除の後に挿入が続くことと同じです) として違いを示します。ソース管理システムでは、同じまたは非常に類似したプログラムまたはアルゴリズムを使用してpatch
、同じファイルの 2 つのバージョン間の違いを表すために必要なストレージを最小限に抑えます。アルゴリズムについては、こちらとこちらで説明しています。
しかし、テキストのブロックがファイル内で移動されると、それは失敗します。
次の 2 つのファイルがあるa.txt
とb.txt
します (両方とも 6 行ではなく数百行あると想像してください)。
a.txt b.txt
----- -----
1 4
2 5
3 6
4 1
5 2
6 3
diff a.txt b.txt
これを示します:
$ diff a.txt b.txt
1,3d0
< 1
< 2
< 3
6a4,6
> 1
> 2
> 3
a.txt
からへの変更はb.txt
、「最初の 3 行を最後に移動する」と表現できますが、移動したdiff
行のチャンクの完全な内容を 2 回示しており、この大きな変更を非常に簡単に説明する機会を逃しています。
テキストのブロックを 1 回だけ表示することに注意してください。これdiff -e
は、削除された行の内容が表示されないためです。
(a) 挿入と削除を表す の機能をdiff
保持し、(b) コンテンツ全体を表示することなく移動したテキスト ブロックを効率的に表すアルゴリズムの変形はありますか?diff