次に、1つまたは複数の差分の塊があります。各ハンクは、ファイルが異なる1つの領域を示しています。統一形式のハンクは次のようになります。
@@ from-file-line-numbers to-file-line-numbers @@ line-from-either-file line-from-either-file...
ハンクに1行しか含まれていない場合、その開始行番号のみが表示されます。 それ以外の場合その行番号は「start、count」のようになります。空のハンクは、ハンクに続く行から始まると見なされます。
ハンクとそのコンテキストに2行以上が含まれている場合、その行番号は「start、count」のようになります。 それ以外の場合終了行番号のみが表示されます。空のハンクは、ハンクの前の行で終了すると見なされます。
彼らはどういう意味ですか?また、それらの意味を示すためにいくつかの例を挙げていただけますか?
特に、最後の2つの段落のケースの違いはわかりませんでした。彼らは同じケースについて話しているようですが、私はそうではないと思います。
最初の段落の "if"ケースと2番目の段落の "otherwise"ケースの違いは何ですか?
最初の段落の「そうでない」ケースと2番目の段落の「if」ケースの違いは何ですか?
(強調した2つの)最初の段落がfrom-file-line-numbers
を説明しようとしているのに対し、2番目の段落はto-file-line-numbers
を説明しようとしていると思います。
あいまいなテキストは無視し、GNU diff
が統一されたdiff
sを実装する方法(質問のタイトルに対応))について説明します。
diff -u <(printf "a\nb\nc\n") <(printf "a\n")
以下を生成します:
--- /proc/self/fd/11 2018-11-08 11:16:09.183611033 +0100
+++ /proc/self/fd/12 2018-11-08 11:16:09.184611029 +0100
@@ -1,3 +1 @@
a
-b
-c
(以降の例では、説明の必要がないため、最初の2行は省略します。)
これは、2つの「ファイル」が異なり、1セットの違い(「塊」)があることを示しています。統合パッチでは、各ファイル比較は---
(「from」ファイル)と+++
(「to」ファイル)で始まる1組の行によって導入されます。各ファイル比較内では、各ハンクは@@
で始まり、末尾が1行の行で始まります。この行は、fromファイルとtoファイルでの変更の場所を識別します。 fromの場所は-
で始まります(これは後続の番号の一部ではありません)。toの場所は+
で始まります。ロケーションは、開始線と長さ(1の場合は省略されます)の2つの数字のペアです。したがって、上記のパッチでは、fromファイルの1行目から始まる3行をtoファイルの1行目から始まる1行に変換する変更があります。
ハンクにはコンテキストを含めることができますが、これは上記の場合です。デフォルトでは、diff
には、可能な場合は3行のコンテキストが含まれます。また、コンテキストが重複するハンクもマージします。変更の前後に3行のコンテキストがない場合、コンテキストは削減されます。したがって、上記では変更前のコンテキストは1行のみで、変更後はありません。このコンテキストは、ハンクで指定された変更の一部としてカウントされるため、開始行と長さに影響します。
diff -u0 <(printf "a\nb\nc\n") <(printf "a\n")
これを示します:
@@ -2,2 +1,0 @@
-b
-c
これは同じ変更ですが、コンテキストはありません。したがって、2行目から始まる2行を1行目から始まる行に変換する変更に削減されます。
最も単純な場所は、コンテキストなしで1行を変更するパッチに対応します。
$ diff -u0 <(printf "a\nb\nc\n") <(printf "a\nb\nd\n")
@@ -3 +3 @@
-c
+d
コンテキストでは、これは
@@ -1,3 +1,3 @@
a
b
-c
+d
(コンテキストの有用性は、元のファイルと完全に一致しない「from」ファイルでパッチを引き続き有効にできるようにすることです。patch
は、行番号が完全に一致しない「ファジー」パッチを適用します。元の場所から特定の距離内でコンテキストを見つけます。)