| 差分 | |
|---|---|
| 原作者 | ダグラス・マキロイ(AT&Tベル研究所) |
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| 初回リリース | 1974年6月 (1974-06) |
| 書かれた | C |
| オペレーティング·システム | Unix、Unixライク、V、Plan 9、Inferno |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | プラン9: MITライセンス |
diffは、ファイルの内容を比較し、差異を報告するシェルコマンドです。diffという用語は、コマンドの出力を識別するためにも使用され、コマンドを実行する動詞としても使用されます。ファイルの差分を取得するには、diffを実行して差分を作成します。[ 1 ]
通常、このコマンドはテキストファイルの比較に使用されますが、バイナリファイルの比較もサポートしています。入力ファイルの1つにテキスト以外のデータが含まれている場合、コマンドはデフォルトで簡易モードに設定され、ファイルの違いについての概要のみを報告します。--textオプションを使用すると、常に行単位の差異を報告しますが、バイナリデータは一般的にテキストのように行構造化されていないため、出力が理解しにくい場合があります。[ 2 ]
このコマンドは主に2つのファイル間の変更を分析するためにアドホックに使用されますが、特別な用途として、コマンドで使用するためのパッチファイルpatchを作成するというものがあります。このコマンドは、diff出力レポートをパッチファイルとして使用するために特別に設計されています。POSIX は、共有ファイル形式を含むコマンドdiffとコマンドを標準化しました。 [ 3 ]patch
歴史
最初のdiffユーティリティは、1970年代初頭、ニュージャージー州マレーヒルのベル研究所でUnixオペレーティングシステム向けに開発されました。これは1974年にリリースされたUnix第5版の一部であり、 [ 4 ]ダグラス・マキロイとジェームズ・ハントによって開発されました。この研究は、 diffの初期プロトタイプを開発したジェームズ・W・ハントとの共著による1976年の論文で発表されました。[ 5 ]この論文で説明されたアルゴリズムは、ハント・シマンスキーアルゴリズムとして知られるようになりました。
マキロイの研究は、スティーブ・ジョンソンのGECOSの比較プログラムとマイク・レスクの証明プログラムに先行し、影響を受けていた。証明も Unix で始まり、diffと同様に行単位の変更を生成し、プログラム出力で行の挿入と削除を表すために山括弧 (>" と "<") さえ使用していた。しかし、これらの初期のアプリケーションで使用されたヒューリスティックスは信頼できないと判断された。 diff ツールの潜在的な有用性に刺激を受けたマキロイは、さまざまなタスクに使用でき、PDP -11のハードウェアの処理とサイズの制限内で十分に機能する、より堅牢なツールの研究と設計に取り組むことになった。この問題に対する彼のアプローチは、ベル研究所のアルフレッド・エイホ、エリオット・ピンソン、ジェフリー・ウルマン、ハロルド・S・ストーン などの人々との共同作業から生まれた。
Unixの文脈では、edラインエディタの使用により、 diff はマシンが利用可能な「編集スクリプト」を自然に作成することができました。これらの編集スクリプトは、ファイルに保存されると、元のファイルと共にedによって完全に再構成され、変更されたファイルにすることができます。これにより、ファイルの複数のバージョンを維持するために必要な二次記憶装置が大幅に削減されました。McIlroy は、様々な出力形式を設計・実装できるdiffのポストプロセッサを作成することを検討しましたが、 edコマンドが受け入れる構文と逆順入力の生成をdiffに任せる方が、より簡素でシンプルであると判断しました。
1984年、ラリー・ウォールはテキストファイルにパッチを適用するためのパッチユーティリティ(mod.sourcesとnet.sourcesニュースグループ[ 6 ] [ 7 ] [ 8 ]でソースコードを公開)を作成しました。これは、 diffの出力と変更前の内容を含むdiff入力ファイルを使用して、変更後の内容を含むファイルを作成するものです。
X/Open Portability Guide 1987年第2版にはdiffが含まれています。コンテキストモードはPOSIX.1-2001(第6版)で追加されました。ユニファイドモードはPOSIX.1-2008(第7版)で追加されました。[ 9 ]
diffの初期の用途としては、ソフトウェアコードと技術文書のマークアップのソースコードの変更点の比較、プログラムのデバッグ出力の検証、ファイルシステムリストの比較、コンピュータアセンブリコードの解析などが一般的でした。ed の出力対象は、ファイルに加えられた一連の変更を圧縮することを目的としていました。ソースコード管理システム(SCCS)とそのリビジョンアーカイブ機能は、1970年代後半にdiffの編集スクリプトを保存したことから生まれました。
アルゴリズム
他の目的で使用される編集距離の概念とは異なり、diffは文字指向ではなく行指向ですが、1 つのファイルを他のファイルから作成するために削除と挿入の最小セットを決定しようとする点では レーベンシュタイン距離に似ています。
diffの操作は、最長共通部分列問題を解くことに基づいています。[ 5 ]この問題では、2つの項目のシーケンスが与えられます。
a b c d f g h j q z
a b c d e f g i j krxy z
そして、両方の元のシーケンスに同じ順序で存在するアイテムの最長シーケンスを見つけたいとします。つまり、最初の元のシーケンスからいくつかのアイテムを削除し、2番目の元のシーケンスから他のアイテムを削除することで得られる新しいシーケンスを見つけたいのです。また、このシーケンスは可能な限り長くしたいとします。この場合、
abcdfgjz
最長共通部分列からdiffのような出力を得るのは、ほんの少しのステップで済みます。ある項目が部分列には存在しないが、最初の元の列には存在する場合、その項目は削除されているはずです(下の「-」マークで示されています)。また、ある項目が部分列には存在しないが、2番目の元の列に存在する場合、その項目は挿入されているはずです(下の「+」マークで示されています)。
ehiqkrxy + - + - + + + +
使用
このdiffコマンドは、 のような2つの引数を受け取ります。通常、これらの引数は通常のファイルを指しますが、2つの引数がディレクトリを指す場合、コマンドはディレクトリ内の対応するファイルを比較します。 オプションを指定すると、一致するサブディレクトリを再帰的に下降し、対応する相対パスを持つファイルを比較します。 diff originalnew-r
デフォルトの出力形式
以下の例は、元のファイルと新しいファイルの内容、そしてdiffデフォルト形式での出力結果を示しています。読みやすさを向上させるため、出力は色分けして表示されています。デフォルトでは diff はプレーンテキストを出力しますが、GNU diff はオプションを使用するとカラーハイライトを使用します--color。
オリジナル: この部分は 文書は バージョンから同じ バージョン。 表示されない場合は表示される 変化。そうでなければ、 役に立たないだろう サイズを圧縮する 変更。 この段落には 古くなったテキスト。 削除されます 近い将来。 綴ることは重要です この文書を確認してください。 一方、 スペルミスの単語は 世界の終わり。 残りの部分では何も この段落は 変わることができる。 その後に追加されます。 | 新しい: これは重要な 気づくはずです したがって、 この始まり 書類! この部分は 文書は バージョンから同じ バージョン。 表示されない場合は表示される 変化。そうでなければ、 役に立たないだろう サイズを圧縮する 変更。 綴ることは重要です この文書を確認してください。 一方、 スペルミスの単語は 世界の終わり。 残りの部分では何も この段落は 変わることができる。 その後に追加されます。 この段落には 重要な新機能 この文書に。 | 出力: 0a1,6 > これは重要な > 注意してください! > したがって、 > この始まり > ドキュメント! > 11,15d16 < この段落には < 古くなったテキスト。 < 削除されます < 近い将来。 < 17c18 < このドキュメントを確認してください。 --- > この文書を確認してください。 24a26,29 > > この段落には > 重要な新機能 > このドキュメントに。 |
このデフォルト形式では、aは追加、dは削除、 はc変更を表します。元のファイルの行番号は1文字コードの前に表示され、新しいファイルの行番号はその後に表示されます。小なり記号と大なり記号(追加、削除、または変更された行の先頭)は、行がどのファイルに存在するかを示します。追加行は元のファイルに追加され、新しいファイルに表示されます。削除行は元のファイルから削除され、新しいファイルには表示されません。
デフォルトでは、両方のファイルに共通する行は表示されません。移動された行は、新しい場所に追加された行と、古い場所から削除された行として表示されます。[ 10 ]ただし、一部のdiffツールでは、移動された行が強調表示されます。
スクリプトを編集する
最新バージョンのdiffでは、オプションを使用してedスクリプトを生成できます-e。この例の編集スクリプトは次のようになります。
24時この段落には、このドキュメントに対する重要な新規追加が含まれています。 。 17 cこの文書を確認してください。 。 11,15 d 0 aこれは重要なお知らせです!したがって、この文書の冒頭に記載する必要があります。 。
edを使って元のファイルの内容を新しいファイルの内容に変換するには、この diff ファイルに2行追加します。1行目には(write) コマンド、もう1行には(quit) コマンド(例えば)が含まれます。ここでは diff ファイルにmydiffという名前を付け、 を実行した際に変換が実行されるようにします。 wqprintf"w\nq\n">>mydiffed-soriginal<mydiff
コンテキスト形式
Unix の Berkeley ディストリビューションでは、コンテキストフォーマット( -c) と、ファイル システムのディレクトリ構造の再帰機能 ( ) を追加することに重点が置かれ-r、これらの機能は 1981 年 7 月にリリースされた 2.8 BSD に追加されました。Berkeley で導入された diff のコンテキスト フォーマットは、最小限の変更が行われた可能性のあるソース コードのパッチを配布するのに役立ちました。
コンテキスト形式では、変更された行は、その前後の変更されていない行と並べて表示されます。変更されていない行を任意の数だけ含めることで、パッチにコンテキストが提供されます。コンテキストは、2つのファイル間で変更されていない行で構成され、変更されたファイル内での行の位置を特定し、行番号が一致しているかどうかに関係なく、変更を適用する場所を見つけるための参照として機能します。コンテキスト形式は、パッチ適用時の可読性と信頼性を向上させ、パッチプログラムへの入力として受け入れられる出力を実現します。このインテリジェントな動作は、従来のdiff出力では実現できません。
変更ハンクの上下に表示される変更されていない行の数はユーザーが定義でき、0行も指定できますが、通常は3行がデフォルトです。変更されていない行のコンテキストが隣接するハンクと重なる場合、diffは変更されていない行の重複を避け、ハンクを1つのハンクにマージします。
「!」は 2 つのファイルで対応する行間の変更を表します。一方、「+」は行の追加を表し、「-」は行の削除を表します。空白は変更されていない行を表します。パッチの先頭には、タブ文字で区切られたフルパスとタイムスタンプを含むファイル情報が記述されます。各ハンクの先頭には、ファイル内の対応する変更に適用される行番号が記述されます。3 つのアスタリスクで囲まれた数値範囲は元のファイルに適用され、3 つのダッシュで囲まれた数値範囲は新しいファイルに適用されます。ハンク範囲は、それぞれのファイルの開始行番号と終了行番号を指定します。
このコマンドはdiff -c original new次の出力を生成します。
*** /path/to/original timestamp --- /path/to/new timestamp *************** *** 1,3 **** --- 1,9 ---- + これは重要なお知らせです!従って、この文書の冒頭に記載する必要があります! +この部分は バージョンから変更されていません *************** *** 8,20 **** 変更のサイズを圧縮します 。 - この段落には、古いテキストが含まれています。- 近い将来に削除されます。スペルミスは重要です !この文書を確認してください。ただし、 スペルミスが あっても世界が終わるわけではありません。--- 14,21 ----変更のサイズを圧縮します 。 スペルミスは重要です !この文書をチェックしてください。ただし、 スペルミスが あっても世界が終わるわけではありません。 *************** *** 22,24 **** --- 23,29 ----この段落は 変更が必要です。 この段落の後には内容を追加できます。 + + この段落には、この文書への重要な追加事項が含まれています。統一フォーマット
ユニファイド形式(またはユニディフ形式)[ 11 ] [ 12 ]は、コンテキスト形式の技術的改良を継承していますが、古いテキストと新しいテキストが隣接して表示される、より小さな差分を生成します。ユニファイド形式は通常、「-u」コマンドラインオプションを使用して呼び出されます。この出力は、パッチプログラムの入力としてよく使用されます。多くのプロジェクトでは、「差分」をユニファイド形式で提出することを明示的に要求しているため、ユニファイド差分形式はソフトウェア開発者間の交換において最も一般的な形式となっています。
統合コンテキスト diff は、1990年8月に Wayne Davison によって開発されました(comp.sources.misc の第14巻に掲載されたunidiffで)。1か月後、 Richard Stallman がGNU プロジェクトの diffに統合 diff のサポートを追加し、この機能は1991年1月にリリースされたGNU diff 1.15 で初めて導入されました。その後、GNU diff はコンテキスト形式を一般化し、任意のフォーマットで diff を表示できるようになりました。
フォーマットはコンテキストフォーマットと同じ2行のヘッダーで始まりますが、元のファイルの先頭に「---「そして新しいファイルの先頭には「+++"。これに続いて、ファイル内の行の差異を含む1 つ以上の変更ハンクが続きます。変更されていないコンテキスト行の前にはスペース文字が付き、追加行の前にはプラス記号が付き、削除行の前にはマイナス記号が付きます。
ハンクは範囲情報で始まり、その直後に行の追加、行の削除、そして任意の数のコンテキスト行が続きます。範囲情報は二重のアットマーク(@)で囲まれ、コンテキスト形式(上記)で2行に渡って表示される内容を1行にまとめます。範囲情報行の形式は以下のとおりです。
@@ -l,s +l,s @@オプションのセクション見出し
ハンク範囲情報には、2つのハンク範囲が含まれます。元のファイルのハンク範囲にはマイナス記号が付き、新しいファイルの範囲にはプラス記号が付きます。各ハンク範囲はl,sという形式です。ここで、 lは開始行番号、sは各ファイルにおける変更ハンクが適用される行数です。多くのバージョンのGNU diffでは、各範囲のカンマと末尾の値sを省略できます。その場合、sはデフォルトで1になります。実際に重要な値は最初の範囲のl行番号のみであり、その他の値はすべてdiffから計算できます。
元のファイルのハンク範囲は、すべてのコンテキストハンク行と削除ハンク行(変更を含む)の合計である必要があります。新しいファイルのハンク範囲は、すべてのコンテキストハンク行と追加ハンク行(変更を含む)の合計である必要があります。ハンクサイズ情報がハンク内の行数と一致しない場合、diffは無効とみなされ、拒否される可能性があります。
オプションとして、ハンク範囲の後に、そのハンクが含まれるセクションまたは関数の見出しを記述することができます。これは主に、diffを読みやすくするために役立ちます。GNU diffでdiffを作成する場合、見出しは正規表現マッチングによって識別されます。[ 13 ]
行が変更された場合、それは削除と追加として表現されます。元のファイルと新しいファイルのハンクは同じハンクに出現するため、これらの変更は互いに隣接して表示されます。[ 14 ] 以下の例では、この現象が見られます。
-この文書を確認してください。 +この文書を確認してください。
このコマンドはdiff -u original new次の出力を生成します。
--- /path/to/original timestamp +++ /path/to/new timestamp @@ -1,3 +1,9 @@ +これは重要なお知らせです!従って、このドキュメントの先頭に配置する必要があります! +ドキュメントのこの部分は バージョンから@@ -8,13 +14,8まで変更 されていません 。 @@ 変更のサイズを圧縮します 。-この段落には古いテキストが含まれています。 -近い将来に削除されます。-この文書のスペルチェックは重要です 。この文書をチェックしてください。ただし、 スペルミスがあっても大した問題ではありません 。 @@ -22,3 +23,7 @@この段落は 変更する必要があります。この段落の後には内容 を追加できます。 + +この段落には、この文書への重要な追加事項が含まれています。ファイル名とタイムスタンプをきちんと区別するために、両者の間にはタブ文字が区切り文字として使用されています。タブ文字は画面上では表示されず、コンソールやターミナル画面から差分をコピー&ペーストすると失われる可能性があります。
拡張機能
特定のプログラムや特定のコンテキストで使用され、理解されるdiff形式には、いくつかの修正や拡張が存在します。例えば、Subversionなどの一部のリビジョン管理システムでは、diffのヘッダーセクションにタイムスタンプの代わりに、またはタイムスタンプに加えて、バージョン番号、「作業コピー」、その他のコメントを指定します。
一部のツールでは、変更されたファイルごとに次のようなヘッダーを使用して、複数の異なるファイルの diff を 1 つにマージできます。
インデックス: path/to/file.cpp
改行で終わらないファイルという特殊なケースは処理されません。POSIX標準unidiffも、diffこの種のファイルの処理方法も定義されていません。(実際、このようなファイルは厳密なPOSIX定義では「テキスト」ファイルではありません。[ 15 ])GNU diffとgitは「\ No newline at end of file」(または翻訳版)という診断メッセージを出力しますが、この動作は移植性がありません。[ 16 ] GNU patchはこのようなケースを処理できないようですが、git-applyは処理できます。[ 17 ]
patchプログラムは必ずしも実装固有のdiff出力を認識するわけではありません。しかし、GNU patchはgitパッチを認識し、少し異なる動作をすることが知られています。[ 18 ]
実装と関連プログラム
1975年以降の変更には、コアアルゴリズムの改良、コマンドへの便利な機能の追加、新しい出力形式の設計が含まれます。基本的なアルゴリズムは、Eugene W. Myersによる論文「An O(ND) Difference Algorithm and its Variations」[ 19 ] およびWebb MillerとMyersによる「A File Comparison Program」[ 20 ]で説明されています。このアルゴリズムは、 Esko Ukkonenによる「Algorithms for approximate String Matching 」 [ 21 ] で独立に発見され説明されました。diffプログラムの最初のバージョンは、改行文字が行を区切ること を期待してテキストファイルの行比較用に設計されました。1980年代までには、バイナリファイルがサポートされたため、アプリケーションの設計と実装が変更されました。
GNU diffとdiff3は、他のdiffおよびpatch関連のユーティリティとともにdiffutilsパッケージに含まれています。[ 22 ]
フォーマッタとフロントエンド
ポストプロセッサsdiffとdiffmk は、それぞれ並べて比較する差分リストと、印刷された文書に変更マークを適用します。どちらも1981年以前にベル研究所の別の場所で開発されました。
Diff3は、2つの差分を照合することで、1つのファイルと他の2つのファイルを比較します。これは元々、Paul Jensenによって、2人が共通のソースを編集する際に行われた変更を照合するために考案されました。また、RCSなどのリビジョン管理システムでもマージに使用されています。[ 23 ]
Emacs には、パッチ ファイルの対話型編集機能とマージ機能を組み合わせたユーザー インターフェイスでパッチが提供する変更を表示するための Ediffがあります。
Vimは2~8個のファイルを比較し、差異を色で強調表示するvimdiffを提供しています。 [ 24 ] 歴史的にはdiffプログラムを呼び出していましたが、最近のvimはgitのxdiffライブラリ(LibXDiff)コードのフォークを使用しており、速度と機能が向上しています。[ 25 ]
GNU Wdiff [ 26 ]は、単語の折り返しや列幅の違いがあっても、テキスト文書内で変更された単語やフレーズを表示するdiffのフロントエンドです。
colordiffはPerlの「diff」ラッパーで、追加・削除されたビットを色分けした同じ出力を生成します。[ 27 ] diff-so-fancyとdiff-highlightは新しい類似品です。[ 28 ]「delta」はRustの書き換えで、変更部分とコードを同時に強調表示します。[ 29 ]
Patchutilsには、コンテキストdiffと統合diffを結合、並べ替え、比較、修正するツールが含まれています。[ 30 ]
アルゴリズム微分
ソースファイルを構文構造で比較するユーティリティは、主にいくつかのプログラミング言語の研究ツールとして開発されてきました。[ 31 ] [ 32 ] [ 33 ]一部は商用ツールとして利用可能です。[ 34 ] [ 35 ]さらに、構文を考慮したdiffを実行する無料のツールには次のものがあります。
- C++: zograscope、ASTベース。[ 36 ]
- HTML: Daisydiff、[ 37 ] html-differ。
- XML: MicrosoftのxmldiffpatchとIBMのxmldiffmerge 。 [ 38 ] [ 39 ]
- JavaScript : astii (AST ベース)。
- 多言語対応:Pretty Diff(コードをフォーマットしてから比較)[ 40 ]
spiffはdiffの変種で、浮動小数点演算における丸め誤差や空白文字による差異を無視します。これらの誤差や空白文字は、一般的にソースコードの比較には無関係です。オリジナル版はBellcoreが作成しました。 [ 41 ] [ 42 ] HPUXポートが最新の公開リリースです。spiffはバイナリファイルをサポートしていません。spiffは標準のdiff形式で標準出力に出力し、 C、Bourneシェル、Fortran、Modula-2、Lispプログラミング言語での入力を受け付けます。[ 43 ] [ 44 ] [ 41 ] [ 45 ] [ 42 ]
LibXDiffは、1998年から多くのアルゴリズムへのインターフェースを提供するLGPLライブラリです。当初は、 Rabinフィンガープリントを用いた改良版Myersアルゴリズムが実装されていました(2008年の最終リリース時点)[ 46 ]。しかし、gitとlibgit2のフォークによってリポジトリが拡張され、独自のアルゴリズムが多数追加されました。「ヒストグラム」と呼ばれるアルゴリズムは、速度と品質の両面でオリジナルのMyersアルゴリズムよりもはるかに優れていると一般的に評価されています。[ 47 ] [ 48 ]これは、Vimで使用されているLibXDiffの最新バージョンです。[ 25 ]
参照
- cmp – ファイル比較コマンド
- ファイル比較ツールの比較
- デルタ符号化 – データ伝送方式の種類
- 差演算子 – 無限の数列を定義するパターンリダイレクト先の簡単な説明を表示するページ
- ファイル比較 – 複数のファイルを比較するコマンドラインプログラム
- ソフトウェア構成管理の歴史
- リビジョン管理 – ソースコードまたはデータのバージョン管理リダイレクト先の簡単な説明を表示するページ
- ソフトウェア構成管理 – ソフトウェアの変更の追跡と制御
- WinDiff – Microsoftのファイル比較プログラム
参考文献
- ^ Eric S. Raymond (ed.), "diff" Archived 2014-01-31 at the Wayback Machine , The Jargon File , version 4.4.7
- ^ MacKenzie他 「バイナリファイルとテキスト比較の強制」『 GNU DiffとPatchによるファイルの比較とマージ』 2007年4月28日ダウンロード。 [1] 2017年12月19日Wayback Machineにアーカイブ
- ^ IEEE Computer Society ; The Open Group (2008年9月26日).情報技術標準—ポータブルオペレーティングシステムインターフェース(POSIX)基本仕様、第7版。pp. 2599– 2607。IEEE Std. 1003.1-2001 では、従来の「ed スクリプト」およびコンテキスト diff 出力形式が指定されています。IEEE Std. 1003.1-2008 では、(当時より一般的だった) 統合形式が追加されました。
- ^ https://minnie.tuhs.org/cgi-bin/utree.pl?file=V5/usr/source/s1/diff1.c
- ^ a b James W. Hunt、M. Douglas McIlroy (1976年6月). 「An Algorithm for Differential File Comparison」(PDF) . Computing Science Technical Report, Bell Laboratories . 41. 2014年12月26日時点のオリジナルよりアーカイブ(PDF) . 2015年5月6日閲覧.
- ^ Larry Wall (1984年11月9日). 「パッチ適用ツール - まさにこれだ!!!」 .ニュースグループ: net.sources . Usenet: [email protected] . 2022年2月19日時点のオリジナルよりアーカイブ。 2015年5月11日閲覧。
- ^ Larry Wall (1984年11月29日). "patch version 1.2--YOU WANT THIS" .ニュースグループ: net.sources . Usenet: [email protected] . 2020年3月21日時点のオリジナルよりアーカイブ。 2015年5月11日閲覧。
- ^ Larry Wall (1985年5月8日). 「パッチバージョン1.3」 .ニュースグループ: net.sources . Usenet: [email protected] . 2022年2月19日時点のオリジナルよりアーカイブ。 2015年5月11日閲覧。
- ^ – シェルおよびユーティリティリファレンス、 The Single UNIX 仕様、バージョン5、 The Open Group
- ^ David MacKenzie、Paul Eggert、Richard Stallman (1997). 『GNU DiffとPatchによるファイルの比較とマージ』ブリストル: Network Theory. ISBN 978-0-9541617-5-0. 2015年3月31日時点のオリジナルよりアーカイブ。2015年3月17日閲覧。
- ^ 「Unified Formatの詳細な説明」 GNU Diffutils(バージョン3.7、2018年1月7日) 2020年1月18日時点のオリジナルよりアーカイブ。2020年1月29日閲覧。
- ^ van Rossum, Guido. 「Unified Diff Format」 . All Things Pythonic . 2019年12月25日時点のオリジナルよりアーカイブ。2020年1月29日閲覧。
- ^ 2.2.3 差異のあるセクションの表示、GNU diffutilsマニュアル
- ^ Unified Diff Format by Guido van Rossum、2006年6月14日
- ^ http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403 2013年4月29日アーカイブWayback Machineセクション3.206
- ^ 「不完全な行(ファイルの比較とマージ)」www.gnu.org。
- ^ "git: apply.c" . Git. 2023年5月8日.
- ^ "patch.c\src - patch.git - GNU patch" . git.savannah.gnu.org .
Git形式の差分では、各パッチの「before」状態は、ファイルを変更する前の初期状態を指します。
- ^ E. Myers (1986). 「O(ND)差分アルゴリズムとそのバリエーション」. Algorithmica . 1 (2): 251– 266. CiteSeerX 10.1.1.4.6927 . doi : 10.1007/BF01840446 . S2CID 6996809 .
- ^ Webb Miller; Eugene W. Myers (1985). 「ファイル比較プログラム」.ソフトウェア:実践と経験. 15 (11): 1025– 1040. CiteSeerX 10.1.1.189.70 . doi : 10.1002/spe.4380151102 . S2CID 15489614 .
- ^ Esko Ukkonen ( 1985). 「近似文字列マッチングアルゴリズム」情報制御64 ( 1–3 ): 100–118 . doi : 10.1016/S0019-9958(85)80046-2 .
- ^ GNU Diffユーティリティ 2015年3月16日アーカイブWayback Machine。フリーソフトウェア財団によって提供されています。無料のドキュメント。無料のソースコード。
- ^ “merge (GNU RCS 5.10.0)” . gnu.org . 2019年9月18日時点のオリジナルよりアーカイブ。2021年1月22日閲覧。
- ^ Moolenaar, Bram . 「Vim ドキュメント: diff」 . vimdoc.sourceforge.net .オリジナルから2020年2月16日アーカイブ。2020年5月1日閲覧。diff
モードで編集を開始する最も簡単な方法は、「vimdiff」コマンドを使用することです。これはVimを通常通り起動し、さらに引数間の差分を表示するための設定を行います。これは以下のコマンドと
同等です。
vimdiff file1 file2 [file3] [file4] [...file8]vim -d file1 file2 [file3] [file4] [...file8] - ^ a b Brabandt, Christian (2018年12月1日). 「The power of diff」 . Vimways . 2018年12月2日時点のオリジナルよりアーカイブ。 2020年5月1日閲覧。
- ^ "gnu.org" . gnu.org . 2020年8月11日時点のオリジナルよりアーカイブ。 2020年9月12日閲覧。
- ^ "colordiff" . www.colordiff.org . 2018年6月14日時点のオリジナルよりアーカイブ。 2018年6月14日閲覧。
- ^ "diff-so-fancy" . So Fancy. 2023年5月6日.
- ^ダン・デイヴィソン (2023 年 5 月 8 日)。「ダンダヴィソン/デルタ」。GitHub。
- ^ Waugh, Tim (2020年6月12日). 「twaugh/patchutils」 . GitHub . 2020年10月1日時点のオリジナルよりアーカイブ。2020年6月28日閲覧。
- ^ Horwitz, Susan (1990年6月). 「プログラムの2つのバージョン間の意味的およびテキスト的差異の特定」 . ACM SIGPLAN Notices . 25 (6): 234– 245. CiteSeerX 10.1.1.49.3377 . doi : 10.1145/93548.93574 . 2010年6月12日時点のオリジナルよりアーカイブ。 2017年11月1日閲覧。
- ^ Yang, Wuu (1991年7月). 「2つのプログラム間の構文の違いの識別」.ソフトウェア:実践と経験. 21 (7): 739– 755. CiteSeerX 10.1.1.13.9377 . doi : 10.1002/spe.4380210706 . S2CID 10853673 .
- ^ Grass. Cdiff: C++プログラムのための構文指向Diff. Proceedings USENIX C++ Conf., pp. 181-193, 1992
- ^ Compare++、 http://www.coodesoft.com/ 2011年11月29日アーカイブ、 Wayback Machine
- ^ SmartDifferencer、 http://www.semanticdesigns.com/Products/SmartDifferencer 2009年10月14日アーカイブ、Wayback Machineより
- ^ “xaizek/zograscope” . GitHub . 2020年5月26日. 2020年12月21日時点のオリジナルよりアーカイブ。2020年6月27日閲覧。
- ^ DaisyDiff , https://code.google.com/p/daisydiff/ 2015年3月19日アーカイブ、Wayback Machine
- ^ xmldiffpatch、 http://msdn.microsoft.com/en-us/library/aa302294.aspx 2009年10月27日アーカイブ、 Wayback Machine
- ^ xmldiffmerge、 http://www.alphaworks.ibm.com/tech/xmldiffmerge 2009年9月24日アーカイブ、 Wayback Machine
- ^ Cheney, Austin. Pretty Diff - ドキュメント. http://prettydiff.com/documentation.php 2012年7月31日アーカイブ、Wayback Machineより
- ^ a b dontcallmedotcom. 「spiff」 . GitHub . 2015年3月26日時点のオリジナルよりアーカイブ。2013年6月16日閲覧。
- ^ a b Nachbar, Daniel W (1999年12月1日). 「HP-UXの移植とアーカイブ」 . イギリス. 2012年9月5日時点のオリジナルよりアーカイブ。2013年6月13日閲覧。
- ^ "SPIFF 1" . 1988年2月2日. 2016年10月2日時点のオリジナルよりアーカイブ。2013年6月16日閲覧。
- ^ Nachbar, Daniel W (1988年2月2日). 「Man page」 . 英国. 2012年9月10日時点のオリジナルよりアーカイブ。 2013年6月16日閲覧。
- ^ Davide (2009年9月28日). 「stackoverflow」 . 2022年2月19日時点のオリジナルよりアーカイブ。2013年6月16日閲覧。
- ^ Libenzi, Davide. 「LibXDiff」 . SourceForge FreshMeat . 2020年7月1日時点のオリジナルよりアーカイブ。 2020年6月28日閲覧。
- ^ Nugroho, Yusuf Sulistyo; Hata, Hideaki; Matsumoto, Kenichi (2020年1月). 「Gitにおける異なるdiffアルゴリズムの違いとは?:コード変更には--histogramを使用する」 . Empirical Software Engineering : 790–823 . arXiv : 1902.02467 . doi : 10.1007/s10664-019-09772-z . S2CID 59608676 .
- ^ 「アルゴリズム - 'git diff --patience' と 'git diff --histogram' の違いは何ですか?」 . Stack Overflow . 2022年2月19日時点のオリジナルからのアーカイブ。 2020年6月28日閲覧。
確かに、histogram diff はMyersよりもわずかに優れている一方で、patience は他の方法よりもはるかに遅いことがわかります。
さらに読む
- ポール・ヘッケル (1978年4月). 「ファイル間の差異を分離する手法」 . Communications of the ACM . 21 (4): 264– 268. doi : 10.1145/359460.359467 . S2CID 207683976 .ファイル間の相違点を分離する技術
- ヒルシュバーグ線形空間改良法を用いたMyers SES/LCSアルゴリズムの汎用実装(Cソースコード)
外部リンク
- : 2つのファイルを比較する – シェルおよびユーティリティリファレンス、The Single UNIX Specification、バージョン5、The Open Group
- – Plan 9プログラマーズマニュアル 第1巻
- – インフェルノ一般コマンドマニュアル
- JavaScript実装