サイトトップまとめドキュメントコマンドdiff ≫ diffの差分形式

diffの差分形式

unified形式

最初の---で始まる行は基準(元)のファイルの、次の+++で始まる行は比較するファイル(patchコマンドで修正するファイル)の名前とタイムスタンプ[61]が出力される。

@@の行では異なる内容の行を含むテキストブロック(Hunk)の各ファイル内における範囲を示しつつ、そのHunkが次の行から開始されることを示す。

各Hunk内では

  • +で始まる行: 元ファイル(1つ目の引数)にこの内容を追加したものが比較ファイル(2つ目の引数)となる / パッチ当ての際には追加行

  • -で始まる行: 元ファイルからこの内容を削除したものが比較ファイルとなる / パッチ当ての際には削除行

  • 半角スペースで始まる行: 修正箇所の周辺の内容

となり、行数が同じで内容の異なるテキストブロックの違いはこれらの組み合わせで表現される。patchコマンドでは半角スペースの行は処理しない。

例134 unified形式の例

  1. --- sample.txt.orig 2007-06-24 11:39:04.107394831 +0900
  2. +++ sample.txt 2007-06-24 12:14:25.822713856 +0900
  3. @@ -5,10 +5,9 @@
  4. なにぬねの
  5. はひふへほ
  6. まみむめも
  7. -やゆよ
  8. -らりるれろ
  9. +やゆよら
  10. +りるれろ
  11. わをん
  12. -がぎぐげご
  13. ざじずぜぞ
  14. だぢづでど
  15. ばびぶべぼ
  16. @@ -23,6 +22,7 @@
  17. ヤユヨ
  18. ラリルレロ
  19. ワヲン
  20. +ァィゥェォ
  21. ガギグゲゴ
  22. ザジズゼゾ
  23. ダヂヅデド

context形式

最初の2行[62]と差分(+/-開始行)の表記はunified形式に近い。

異なる内容の行を含むテキストブロック(Hunk)の内容を各ファイルごとにそのまま続けて[63]並べていて、差分出力は長くなる。

行数が同じで内容の異なる行(のまとまり)は!で始まる。

例135 context形式の例

*** sample.txt.orig     2007-06-24 11:39:04.107394831 +0900
--- sample.txt  2007-06-24 12:14:25.822713856 +0900
***************
*** 5,14 ****
  なにぬねの
  はひふへほ
  まみむめも
! やゆよ
! らりるれろ
  わをん
- がぎぐげご
  ざじずぜぞ
  だぢづでど
  ばびぶべぼ
--- 5,13 ----
  なにぬねの
  はひふへほ
  まみむめも
! やゆよら
! りるれろ
  わをん
  ざじずぜぞ
  だぢづでど
  ばびぶべぼ
***************
*** 23,28 ****
--- 22,28 ----
  ヤユヨ
  ラリルレロ
  ワヲン
+ ァィゥェォ
  ガギグゲゴ
  ザジズゼゾ
  ダヂヅデド

side-by-side形式

両方の内容を横に並べ、異なる行には記号が付く。違いが分かりやすいが非常に長くなり、ファイル名などの情報はない。

片方にだけある行は不等号、行数が同じで内容が異なる行は|が付く。

例136 side-by-side形式の例

あいうえお    あいうえお
かきくけこ    かきくけこ
さしすせそ    さしすせそ
たちつてと    たちつてと
なにぬねの    なにぬねの
はひふへほ    はひふへほ
まみむめも    まみむめも
やゆよ      | やゆよら
らりるれろ  | りるれろ
わをん        わをん
がぎぐげご  <
ざじずぜぞ    ざじずぜぞ
だぢづでど    だぢづでど
ばびぶべぼ    ばびぶべぼ
ぱぴぷぺぽ    ぱぴぷぺぽ
アイウエオ    アイウエオ
カキクケコ    カキクケコ
サシスセソ    サシスセソ
タチツテト    タチツテト
ナニヌネノ    ナニヌネノ
ハヒフヘホ    ハヒフヘホ
マミムメモ    マミムメモ
ヤユヨ        ヤユヨ
ラリルレロ    ラリルレロ
ワヲン        ワヲン
            > ァィゥェォ
ガギグゲゴ    ガギグゲゴ
ザジズゼゾ    ザジズゼゾ
ダヂヅデド    ダヂヅデド
バビブベボ    バビブベボ
パピプペポ    パピプペポ

既定の形式

内容の異なる行の周辺の内容は含まず、内容の異なる部分の内容と位置のみ表記したもの。

異なるブロックの範囲は8,9c8,9のように表記される。

unified形式+の行に相当するのが<で始まる行、-の行に相当するのが>

内容の異なる部分をそれぞれ続けて並べているのはcontext形式に近い。

例137 既定の形式の例

8,9c8,9
< やゆよ
< らりるれろ
---
> やゆよら
> りるれろ
11d10
< がぎぐげご
25a25
> ァィゥェォ

ed形式(edスクリプト)

非対話でテキストを編集するedコマンドが解釈/実行できる形式(edスクリプト)で、edコマンドによってパッチ当てができる(末尾にwコマンドを追加して渡す)が、繰り返し実行すると壊れる。

例138 ed形式(edスクリプト)の例

25a
ァィゥェォ
.
11d
8,9c
やゆよら
りるれろ
.

例139 diffコマンドが生成したedスクリプトの実行例

$ (cat [edスクリプト] && echo w) | ed - [パッチ対象ファイル]



[61] タイムスタンプ部分を削ってもpatchコマンドは動作する

[62] 異なるのは1行目の最初が***であること

[63] 片方にだけ含まれる内容に関するHunkは片方の内容だけとなる