共有
VPS
専用
WP Professional
WP Professional Plus
「diff」ツールは、2つのテキストファイルの差分を計算します。 その差分をパッチと呼びます。
diffとpatchは、テキストファイルを対象としています。 バイナリファイルや、.doc、.pdf、.xlsx、.wavファイルのような専用のアプリケーションで操作されるファイルは、diffやpatchではうまく動作しません。
なぜ diff と patch を使うのですか
理由 1: diff は、たとえ patch を使用しなくても、ファイル間で何が変更されたかを確認するためにそれ自体で有用です。
理由 2: 時々、第三者からパッチを入手して、それを自分のファイルに適用することができます。
理由 3: diff で使用した元のファイルと完全には一致しないファイルにパッチを適用することができます。
例えば、設定ファイル付きの CMS を使用していて、その設定ファイルにローカルな変更を加えた場合、CMS をアップグレードする際にそのローカルな変更を保持したいとします。 ベンダーの新しい設定を自分のバージョンにコピーすると、その変更が失われてしまいます。
diff とは
diff は、コマンド ラインからファイルの差分を比較する方法です (そのため「diff」と呼ばれています)。 たとえば、元のファイルがあって、それに変更を加えて別の名前で保存した場合、diffを使って2つのファイルを比較することができます。
diffの構文
diffはコマンドラインで使用します。 基本的な diff の構文は次のようになります。
diff
このコマンドは、あるファイルと別のファイルを比較するための基本的な構造を設定します。
基本的な構文 (オプションなし)
and を実際のファイル名に置き換えてください。 ファイルの拡張子は必ずファイル名に含めてください。 オプションなしの基本的な diff コマンドは次のようになります。
diff file1.html file2.html
この例では、コマンドは file1.html と file2.html を比較し、その差分をコマンド ラインに出力します。 ただし、オプションはコマンドの構文を少し変えます。
diff オプションは diff と最初のファイル名の間に入ります。 その場合は、該当するオプションの文字をすべてダッシュ(-)の後に追加します。 最終的には次のようになります:
diff -uy file1.html file2.html
各オプションにそれぞれのダッシュ (-) を与えるバリエーションも見られます。 複数のオプションを追加する方法はどちらも有効です
diff -u -y file1.html file2.html
一般的に使用されるオプションのリストについては、以下を参照してください。
オプション | 説明 |
-?N | 存在しないファイルを無視する |
-r | ディレクトリ内で再帰的に diff を実行します。 一度に複数のファイルを比較するのに使用します。 |
-u | 出力を読みやすい形式で表示します。 これにより、コンテキストラインなどの情報が削除される場合があります。 |
-y | 出力を強制的に差分を並べて表示します。 |
その他のオプションについては、GNUによるdiffオプションのリストをご覧ください。
diffの出力
diffコマンドを実行すると、基本的な出力は以下のようになります。
-y オプションを使用すると、出力の表示方法が変わります
11c11< this is text from the original file---> this is the same line from the second, changed file
変更点のみが出力に表示されるので、2 つのファイルを見分ける必要はありません。 その代わり、diffは比較して変更点を表示するようにします。
diffの出力に含まれる「><」という文字は、コンテンツが見つかったファイルの方向を示しています。 つまり、「diff file1 file2」というコマンドの場合、「<>」はファイル2の行を指します。
diffの出力の読み方
ここでは、diffの出力の読み方について簡単に説明します。
出力の最初の行
出力の最初の行は、差分を含む行番号と変更の種類を示しています。
2つの数字がカンマで区切られている場合は、最初の行番号から2番目の行番号までに変更があることを意味します。 上の画像の例では、11,12は、11行目から12行目までに変更があることを示しています。
上記の例で行番号を区切る「c」は、発生した変更の種類を示しています。 変更の種類を示すさまざまな文字があります。
レター | 意味 | |
c | コンテンツが置き換えられた | |
a | コンテンツが追加された。 | コンテンツが追加された |
d | コンテンツが削除された |
パッチを使用する場合は、以下の点に注意してください。 パッチとは?
残りの出力
残りの出力は、ファイル間の実際の相違点に関するものです。
変更された行は、<> 角括弧の隣に表示されます。 3つのダッシュ(—)は、最初のファイルの行末が変更され、次のファイルの行頭が変更されることを示します。 以下のように表示されます。
< text from file one---> text from file two
diffの基本的な理解ができたところで、次はpatchに移りましょう。
patchとは
patchはdiffの出力をファイルにまとめるコマンドです。 そして、ファイル化された出力を、変更が加えられた別のファイルに上書きすることができます。 例えば、パッチを使って、変更されたファイルの変更点を元のファイルに移し、同一のファイルにするというのが一般的な使い方です。 これは、更新されたファイルを元のファイルにコピー/ペーストすることでも実現できますが、パッチの方がはるかに高速で効率的です。
diff と patch の併用方法
diff は、2 つのファイルまたはフォルダ間の変更点をカタログ化します。 patch はそれらの変更点をファイルにまとめ、古いバージョンを更新することができます。
patch オプション
patch コマンドには、機能を追加するための独自のオプション セットがあります。 よく使われるオプションの一覧を以下に示します。
-b | 元のファイルのバックアップを作成します |
-i | パッチを標準入力からではなく、.patchファイルから読み込むように強制します。 |
-p | ファイルパスからファイル名までのスラッシュの数を削除するようにコマンドに指示します。 |
-R | 前のパッチを反転させる |
-s | コマンドを静かに実行します。 |
その他のオプションについては、GNUによるパッチオプションのリストを参照してください。
パッチの作成
パッチファイルの作成は、patchとdiffを一緒に使うための最初のステップです。
パッチファイルを作成するには、以下のコマンドをコマンドラインに入力してください:
diff -u file1.html file2.html > patchfile.patch
上の例では、diff の出力が patchfile.patch という名前のファイルに保存されます。
上記の例では、diff の出力が patchfile.patch という名前のファイルに保存されます。このコマンドを実行する際には、file1.html と file2.html を実際のファイル名に変更してください。 たとえば、更新された file2 からの変更点で file1 を上書きしたい場合があります。 そのためには、次のような構文を使います。
patch file1.html patchfile.patch
file1.html を元のファイルで置き換えます。 これにより、file1.html の古い内容が file2.html の変更された内容で上書きされます。
パッチを逆にする方法
パッチを当てる前にファイルを以前のバージョンに戻したい場合は、次のコマンドを実行することで可能です。
patch -p0 -R -i patchfile.patch
コマンド ラインでは、戻したいファイルの名前を入力するよう求められます。 ファイル名が入力されると、元に戻す処理が開始されます。
ディレクトリのパッチ
ディレクトリ全体への diff および patch の使用は、単一のファイルへの使用と同様のプロセスです。
最初のステップは、次のコマンドを使用してパッチ ファイルを作成することです:
diff -ruN folder1/ folder2/ > patchfile.patch
そして、元のフォルダー (この場合は folder1) にパッチを当てるコマンドを発行します:
patch -s -p0 < patchfile.patch
成功すると、元のディレクトリは 2 番目に更新されたフォルダーに合わせて更新されます。