diff出力の統合形式を理解する方法は?

diff出力の統合形式を理解する方法は?

~からディフチルマニュアル

以下は1つ以上の違いです。各ブロックは異なるファイル領域を示しています。均一にハンサムな男は次のとおりです。

@@ from-file-line-numbers to-file-line-numbers @@
line-from-either-file
line-from-either-file...

チャンクに1行しか含まれていない場合、開始行番号のみが表示されます。 そうでなければ行番号は「start, count」と同じです。空のブロックは、ブロックの後の行から始まると見なされます。

ブロックとそのコンテキストに複数の行が含まれている場合、行番号は「start、count」と同じです。そうでなければ終了行番号のみが表示されます。空のブロックは、ブロックの前の行で終わると見なされます。

どういう意味ですか?また、その意味のいくつかの例を挙げることができますか?

特に、最後の2つの段落の状況の違いを知ることはできません。彼らは同じ事件について話しているようですが、私はそうではないと思います。

  • 最初の段落の「if」の場合と2番目の段落の「else」の場合の違いは何ですか?

  • 最初の段落の「else」ケースと2番目の段落の「if」の場合の違いは何ですか?

ベストアンサー1

私は(あなたが強調した2つのうち)最初の段落が説明しようとしていますfrom-file-line-numbersが、2番目の段落は説明しようとしていると思いますto-file-line-numbers

あいまいなテキストは無視し、GNUがdiff統合を実装する方法diff(問題を解決するタイトル)について説明します。

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つの違いセット(「チャンク」)しかないことを示しています。 Unity パッチでは、各ファイルの比較は---("from" file) と ("to" file) で始まる一対の行として導入され+++ます。各ファイル比較では、各ブロックはlineで始まり、終わる行で始まります@@。この行は、ソースファイルとターゲットファイルの変更場所を識別します。開始位置は-(次の数字の一部ではありません)で始まり、終了位置はで始まります+。位置は、開始線と長さ(1の場合は省略)の数字のペアです。そのため、上記のパッチでは、fromファイルの1行目から始まる3行をtoファイルの1行目から始まる1行に変換する変更を行いました。

ハンサムな男は文脈を入れることができますが、上記の場合はそうです。デフォルトでは、diff3行のコンテキストが含まれています(存在する場合)。また、重複するコンテキストのある塊もマージします。変更前および/または変更後に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。遠い。)

おすすめ記事