diffとは? わかりやすく解説

diff

別表記:ディフ

「diff」の意味・「diff」とは

「diff」は、主にコンピュータ世界で使われる言葉で、二つファイルデータ違いを示すためのツールコマンドを指す。具体的には、テキストファイルの行単位での差分比較・表示するUnix系コマンドラインツール一つである。また、バージョン管理システムであるGitでは、コミット間の差分表示するためのコマンドとしても使われる

「diff」の発音・読み方

「diff」の発音は、IPA表記では/dɪf/となる。IPAカタカナ読みでは「ディフ」となり、日本人発音するカタカナ英語では「ディフ」と読む。この単語発音によって意味や品詞が変わる単語ではない。

「diff」の定義を英語で解説

「diff」は、"a command that displays the differences between two files"と定義される。これは、「二つファイル間の違い表示するコマンド」という意味である。例えば、プログラムソースコードバージョン間変更点確認する際に利用される

「diff」の類語

「diff」の類語としては、「compare」や「contrast」がある。これらは、それぞれ比較する」と「対比するの意味を持つが、「diff」が具体的にファイルデータ差分を示すのに対し、これらの類語一般的な比較を指す。

「diff」に関連する用語・表現

「diff」に関連する用語としては、「patch」がある。「patch」は、diffによって生成され差分を元のファイル適用するためのコマンドである。また、merge」も関連語であり、複数変更統合するための操作を指す。

「diff」の例文

1. Use the diff command to compare the two versions of the source code.(ソースコード二つバージョン比較するためにdiffコマンド使用する
2. The diff tool highlighted the differences between the files.(diffツールファイル間の違い強調表示した
3. I ran a diff to see what changes had been made.(何の変更が行われたかを確認するためにdiffを実行した
4. The diff output can be used to create a patch.(diffの出力パッチ作成するために使用できる
5. The diff command in Git shows the changes between commits.(Gitのdiffコマンドコミット間の変更表示する
6. He used diff to check for any discrepancies.(彼は不一致確認するためにdiffを使用した
7. The diff revealed several changes in the configuration file.(diffは設定ファイルいくつかの変更明らかにした)
8. The diff command is a powerful tool for developers.(diffコマンド開発者にとって強力なツールである)
9. You can use diff to compare directories as well as files.(ファイルだけでなくディレクトリ比較するためにdiffを使用できる
10. The diff showed that only a few lines had been modified.(diffは数行だけが修正されたことを示した

デフ【diff】

読み方:でふ

《「ディファレンシャル‐ギア」の略》差動歯車のこと。


.diff

読み方ディーアイエフエフ

.diffとは、データベースソフト表計算ソフトなどの間でデータ交換するためのファイル形式のひとつで、DIF形式.dif)が拡張され形式Date Interchange File Format)のことである。

.diffは、ファイル内容などの点では.dif形式との違いがない一部UNIX系OSなどでは、プログラムなどの差分ファイル区別する目的で .diffの拡張子用い場合がある。


diff

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/07 15:37 UTC 版)

diff(ディフ)は、ファイルの比較を行うためのコマンドで2つのファイル間の違いを出力できるプログラム。diffプログラムは単位でテキストファイル間の差異を表示する。最近の実装ではバイナリファイルもサポートしている。プログラムからの出力も「diff」(ディフ)と呼ばれるが出力をそのままpatchプログラムで適用できるため、「patch」(パッチ)との呼称も一般的である。また、diffコマンド以外からの出力であっても差分表示プログラムの出力はdiffと呼ばれることがある。"grep"が文字列探索そのものの代名詞になっているように、"diff"という語も差分検出一般を指すジャーゴンとなっている。

歴史

diffプログラムは1970年代初頭に、ニュージャージー州マーレイ・ヒルにあったAT&Tベル研究所で開発されたUNIX上で開発されたもので、1974年のUNIX第5版に同梱され最初に公開された最終バージョンはダグラス・マキルロイが開発したものであった。このバージョンのdiff実装については1976年にdiffの初期のプロトタイプ実装を行ったジェームズ・W・ハントとの共著による論文の中で研究成果として発表された。

マキロイの研究はスティーブ・ジョンソンによるGCOS上の比較プログラムやマイク・レスクによるproofプログラムの先行する研究の影響を受けたものだった。proofは元々UNIX上で開発されdiffのような行単位の変更箇所を出力するもので、行の挿入・削除を示すのにブラケット(<、>)による出力も用いられていた。これらの初期のアプリケーションではヒューリスティクスが使われていたが、その出力の安定性は低いものだった。ファイル比較ツールの潜在的な有用性に触発されたマキロイはより頑健で様々な対象に使用でき、かつPDP-11のハードウェア的な制約上でもうまく動作するようなツールの研究、設計に取り組んだ。このアプローチによる研究にはベル研の同僚であったアルフレッド・エイホ、エリオット・ピンソン、ジェファーソン・ウルマン、ハロルド・S・ストーンの研究者らとの協力を受けて取り組んだ。

Unixにおいては、edラインエディタの利用が「編集スクリプト」機能という概念と自然に結びつくようなdiff機能を提供することとなった。edによる編集スクリプトと元ファイルとを両方保存しておけば、edコマンドだけで変更後のファイルを完全に再構成できることになる。これを利用することによりファイルの複数改版履歴を保存するのに必要なディスク容量を相当減らすことができる。マキロイは元々様々な形式で出力できるようなdiffを作りその出力を処理できるようなポストプロセッサを作ろうと考えていたが、文法そのものをdiff形式として規定してしまい、さらにedコマンドが解釈できるような逆順入力に対応するようなdiffコマンドを実装する方がずっと単純で楽にできると判断した。1985年にはラリー・ウォールがこのdiff出力を入力として受け取ってファイルを変更するというアイデアを一般化、拡張して別コマンドとしてpatchを作成した。

diffが作られてしばらくは、ソフトウェアコードや技術文書のマークアップのソース部分の変更箇所を比較する、プログラムのデバッグ出力の検証、ファイルシステム中のファイル一覧の比較といった使い方が一般的であった。ed用の出力により、ファイルへの一連の変更をひとまとめにしてファイル容量を節約するというアイデアが出てきた。Source Code Control System(SCCS)はそのようなアイデアを実装したものとして1970年代後半に実装がなされた。

diffは概念的にはザナドゥ計画(Project Xanadu)の思想を受けたものである。Xanaduは1960年に出現したハイパーテキストプロジェクトでその「相互参照ウィンドウ」機能に必要な履歴版の管理・追跡という概念を示していた。ファイルの相違点の提示はこの機能の一部としてより広い用語「トランスクルージョン(transclusion)」に含まれていた。トランスクルージョンとはある文書が他の文書もしくは他の版の一部の中に含まれることを指す。

電子化時代の人文科学においては、コンピュータによる比較ツールは過去に大部で出版された文学作品に対しても用いられている。

使用法

以下のようにコマンドラインで2つのファイル名を指定して実行する。

diff original new

コマンドからの出力はファイル original をファイル new に変更するのに必要な箇所を示す。

originalnew がディレクトリを指していた場合diffは両ディレクトリに存在するファイル個々について実行されることになる。オプション-rを指定するとさらにサブディレクトリ以下を全て辿りディレクトリ内のファイル間についての差分を出力する。

利用例

以下、2つのファイル(originalnew)を例に説明する:

コマンド diff original new を実行すると、以下の通常のdiff出力が生成される:

0a1,6
> This is an important
> notice! It should
> therefore be located at
> the beginning of this
> document!
> 
8,14c14
< compress the size of the
< changes.
< 
< This paragraph contains
< text that is outdated.
< It will be deleted in the
< near future.
---
> compress anything.
17c17
< check this dokument. On
---
> check this document. On
24c24,28
< be added after it.
---
> be added after it.
> 
> This paragraph contains
> important new additions
> to this document.

この伝統的な出力形式では、a は追加(added)、d は削除(deleted)、c は変更(changed)を意味する。a/d/cの各文字の前には元ファイルでの行番号が書かれ、後ろに変更後ファイルでの行番号が出力される。行頭の山括弧はその行が追加されたのか、または削除されたのかを示している。追加行とは新しいファイルで新たに出現した部分、つまり元のファイルに付け加えられた部分のことで、削除行は新しいファイルでは無くなった、つまり元ファイルから除かれた行のことを指す。

標準では新旧両ファイルに共通する箇所は出力されない。行を移動した場合は新しい場所へは追記として示され、以前の箇所では削除行として示される。

変種

大半のdiff実装の仕様は1975年以来ほとんど変わらずにそのままである。主な変更点としてはコアアルゴリズムの改良、コマンドとして便利な機能の追加、新出力形式の設計がある。基本的なアルゴリズムは論文 "An O(ND) Difference Algorithm and its Variations"(Eugene W. Myers著)および "A File Comparison Program" (Webb Miller and Myers著)で説明されている。このアルゴリズムはこれとは別に独立してE.ウッコネンが発見して、 "Algorithms for Approximate String Matching" (E. Ukkonen著)において説明している。diffプログラムの最初のバージョンはテキストファイルの行単位での比較用に設計された。ここでの行は改行コードによって区切られていることを前提としていた。1980年までにはバイナリファイルへの対応も加えられた。

ポストプロセッサ sdiff は個々のdiff項目を並べて出力するものであり、 diffmk の方は印刷文書に変更箇所マークを挿入するためのものである。両者とも1981年以前にベル研外で開発されたものである。

Berkeley distribution of Unix ではコンテキスト形式(-C)の追加とファイルシステム中のディレクトリ構造を辿る機能(-r)が加わった。これらの機能は1981年7月にリリースされた2.8BSDから加わった。とりわけバークレーでコンテキスト形式が開発されたことによって、微細な変更が行われただけのソースコードへの改変をパッチの形で配布するような活動ができるようになった。

diff3コマンドは1ファイルを他の2つのファイルと比較する。これは1つのソースファイルを2人の人が変更したものを処理するためポール・ジェンセンが最初に開発した。直接実行されることはあまりなく大半はmergeプログラムから呼び出されて起動される。同様に、他の多くの履歴管理システムでも内部的に使われている。

Wdiffはテキスト中の単語単位・フレーズ単位での変更を見るためのツールであり、特に行折り返しや表幅などに相違がある場合に効果を発揮する[1]。Spiff はさらに、浮動小数の精度桁数の違いやプログラムファイルでの空白やコメントなどを無視した比較ができる[2]

コンテキスト形式(Context format)

「コンテキスト形式」の出力では変更された行部分に加えてその前後の変更されていない数行も示される。この呼称は、変更されていない行を加えることが「文脈(コンテキスト)」をパッチに与えることによる。この出力形式がpatchプログラムへの入力として使用される。また人間にとってもこの形式は読みやすく、パッチの適用にも適している。2ファイル間で変更のなかった箇所の行も出力されるため変更後のファイルでの変更箇所を特定するのが容易になる。これにより行番号の対応が取れなかったとしても変更点を追いやすくなり、変更を適用すべきかどうかの判断も行いやすくなる。

「変更内容の出力部」の上下に出力される変更のなかった行を何行分表示されるかはユーザが指定でき、全く出力しない「0」指定も可能であるが、標準では3行が出力される。変更箇所提示部において非変更行のコンテキストが隣接する変更箇所部分と重なる場合は、非変更箇所を2重に提示することはせず変更箇所を一つにまとめて提示する。

「!」から始まる行は2ファイル間での変更があった行、「+」から始まる行は行の挿入、行頭がスペースから始まる行は非変更行を示す。パッチの先頭行にはファイルのパスタイムスタンプといったファイルに関する情報が書かれる。各変更箇所の先頭にはそれぞれのファイルにおける変更箇所の対応行番号が書かれる。3つのアスタリスク(***)から始まる行では変更前ファイルでの行番号に対応する数字が出力され、3つのダッシュ(---)から始まる行では変更後ファイルでの行番号が出力される。出力行番号の数値はそれぞれのファイルにおける変更箇所の先頭行の行番号と先頭行からの行数を示す。

diff -c original newというコマンドを実行した際は、以下のような出力が行われる。

*** /path/to/original ''timestamp''
--- /path/to/new      ''timestamp''
***************
*** 1,3 ****
--- 1,9 ----
+ This is an important
+ notice! It should
+ therefore be located at
+ the beginning of this
+ document!
+
  This part of the
  document has stayed the
  same from version to
***************
*** 5,20 ****
  be shown if it doesn't
  change.  Otherwise, that
  would not be helping to
! compress the size of the
! changes.
!
! This paragraph contains
! text that is outdated.
! It will be deleted in the
! near future.

  It is important to spell
! check this dokument. On
  the other hand, a
  misspelled word isn't
  the end of the world.
--- 11,20 ----
  be shown if it doesn't
  change.  Otherwise, that
  would not be helping to
! compress anything.

  It is important to spell
! check this document. On
  the other hand, a
  misspelled word isn't
  the end of the world.
***************
*** 22,24 ****
--- 22,28 ----
  this paragraph needs to
  be changed. Things can
  be added after it.
+
+ This paragraph contains
+ important new additions
+ to this document.

ユニファイド形式 (Unified format)

ユニファイド形式(unified formatunidiffとも呼ぶ)はコンテキスト形式における技術的改良を継承し、より少量の出力でより読みやすい形式を追求し生まれた。通常、ユニファイド形式は「-u」オプションにより指定される。この出力形式はpatchプログラムへの入力形式として使われることが多い。現在、多くのプロジェクトにおいてdiff出力によるパッチを投稿する際にはこのユニファイド形式を使うよう推奨している。このため、このユニファイド形式がソフトウェア開発者の間でのいわば共通形式となっている。

ユニファイド形式diffを最初に開発したのはウェイン・デイヴィソンで、1990年8月のことであった[3]リチャード・ストールマンGNUプロジェクトのdiffコマンドにこの機能を1ヶ月後に加え、1991年1月リリースのGNU diff 1.15から使えるようになった。GNU diffではその後、任意の形式のdiff出力を扱えるようコンテキスト出力サポートの拡張が進められた。GNU diffおよびdiff3は現在他のdiff系ツールやpatch系ツールと共にdiffutilsパッケージに含まれている。Emacsはインタフェースを備え、Ediffツールとしてパッチが変更する内容を表示しユーザが動的にパッチファイルの変更点を編集・マージすることができる。

ユニファイド出力形式ではヘッダの2行はコンテキスト形式と同一のもので始まるものの、元ファイルは「---」で示され新ファイルは「+++」で示される。これに続く変更箇所ではファイル間の相違が示されるが、非変更箇所は「 」(スペース)、挿入行は「+」、削除行は「-」で始まる行で示される。

変更箇所ではその範囲を示す行番号・行数の情報に続いて行の挿入・削除、非変更箇所などが出力される。範囲を示す情報は2つの@マークで囲まれて出力され、前述のコンテキスト出力で示された内容は1行にまとめられた形で出力される。変更箇所の範囲情報の出力形式を以下に示す:

@@ -R +R @@

変更箇所の範囲情報は2つの範囲についての情報を含んでいる。一方はマイナス記号が頭に付いた元ファイルにおける変更箇所を示すものであり、もう一方はプラス記号が頭に付いた変更後のファイルにおける変更箇所を示している。範囲を示すRl,sという形式となり、lは変更箇所の開始行、sはそれぞれのファイルにおける変更箇所の行数を示している。GNU diffの大半のバージョンでは、Rにおいてsがデフォルトの1である場合にはカンマ以降を省略した形式も使える。

元ファイルの変更箇所の範囲を示す情報では非変更箇所行・削除行についての行数分も含んだ情報が提示される。一方、変更後ファイルにおける範囲情報でも非変更箇所行・挿入行の分も含んだ情報が出力される。変更箇所における行数と範囲情報が示している行数が一致しない場合、その出力は不正な形式として拒絶される。

ある行が変更された場合、削除+挿入として表現される。元ファイルと変更後ファイルの変更箇所が同一の場所に現われ相互に隣り合って出力されることになる。以下のその一例を示す。

-check this dokument. On
+check this document. On

diff -u original newというコマンドを実行した際は、以下のような出力が行われる。:

--- /path/to/original ''timestamp''
+++ /path/to/new      ''timestamp''
@@ -1,3 +1,9 @@
+This is an important
+notice! It should
+therefore be located at
+the beginning of this
+document!
+
 This part of the
 document has stayed the
 same from version to
@@ -5,16 +11,10 @@
 be shown if it doesn't
 change.  Otherwise, that
 would not be helping to
-compress the size of the
-changes.
-
-This paragraph contains
-text that is outdated.
-It will be deleted in the
-near future.
+compress anything.

 It is important to spell
-check this dokument. On
+check this document. On
 the other hand, a
 misspelled word isn't
 the end of the world.
@@ -22,3 +22,7 @@
 this paragraph needs to
 be changed. Things can
 be added after it.
+
+This paragraph contains
+important new additions
+to this document.

diff出力形式の中には特定のプログラムや一定の利用法の中で変更や拡張が加えられているものもある。例えばバージョン管理システムでは、diffのヘッダ出力部分のタイプスタンプの箇所に版番号・バージョン番号や「ワーキングコピー」その他のコメント類を出力する場合もある。また複数のdiff出力を一つにまとめた形式が使えるものもある。この場合各変更ファイルのヘッダとして以下のような形式が使われる。:

 Index: path/to/file.cpp
 ===================================================================

実装

GNU Diffutils

Diffutils
開発元 GNUプロジェクト
最新版
3.10.2 / 2023年1月2日 (17か月前) (2023-01-02)
プログラミング
言語
C
ライセンス GPL
公式サイト www.gnu.org/s/diffutils/
テンプレートを表示

GNUではDiffutilsパッケージが製作されている。この中には、以下のものが含まれている。

脚注

  1. ^ Wdiff - GNU Project - Free Software Foundation”. www.gnu.org. 2023年8月30日閲覧。
  2. ^ Komarnitsky, Alek (1999年8月21日). “spiff-1.0”. web.archive.org. utah.edu. 1999年8月21日時点のオリジナルよりアーカイブ。2023年8月30日閲覧。
  3. ^ comp.sources.miscのVolume 14にunidiffとして投稿。

関連項目

参考文献

外部リンク



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

「diff」に関係したコラム

辞書ショートカット

すべての辞書の索引

「diff」の関連用語

diffのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



diffのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
実用日本語表現辞典実用日本語表現辞典
Copyright © 2025実用日本語表現辞典 All Rights Reserved.
デジタル大辞泉デジタル大辞泉
(C)Shogakukan Inc.
株式会社 小学館
拡張子辞典拡張子辞典
Copyright © 2005-2025 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【.diff】の記事を利用しております。
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのdiff (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2025 GRAS Group, Inc.RSS