Gitのdiff出力で「@@ -1 +1 @@」はどういう意味ですか?


103

から返された情報からデータを収集してきました

git diff <commitId>..<commitId>

そして私は偶然 @@ -1 +1 @@

それが何を言っているのか理解できません。私はGoogleで少し検索しましたが、役に立ちませんでした。


どのようなファイルがそのようなヘッダーになるのか説明できますか?
kworr

@kworrばかげた質問です。統一形式のdiffには範囲ヘッダーがあります。
ユーバルアダム

@YuvalAdam:実際にはdiff統一フォーマットには[-+] <position>、<lines>のように入力する必要のあるフィールドが多く、ここでは変更は表示されていませんが、この変更はファイルの最初の行に影響します。
kworr

回答:


69

統一されたdiff hunk識別子です。これはGNU Diffutilsによって文書化されています。

統一された出力形式は、次のような2行のヘッダーで始まります。

--- from-file from-file-modification-time 
+++ to-file to-file-modification-time

タイムスタンプ2002-02-21 23:30:39.942229878 -0800は、日付、小数秒の時間、およびタイムゾーンを示すように見えます。小数のタイムスタンプをサポートしないホストでは、小数の秒は省略されます。

--label=labelオプションでヘッダーのコンテンツを変更できます。See Alternate Namesを参照してください。

次に、1つまたは複数の違いがあります。各ハンクは、ファイルが異なる1つの領域を示しています。統一形式のハンクは次のようになります。

@@ from-file-line-numbers to-file-line-numbers @@
  line-from-one-file 
 line-from-or-file ...

ハンクに1行しかない場合は、開始行番号のみが表示されます。それ以外の場合、その行番号はのようになります。空のハンクは、ハンクに続く行から始まると見なされます。start,count

ハンクとそのコンテキストに2つ以上の行が含まれている場合、その行番号はのようになります。それ以外の場合は、最終行番号のみが表示されます。空のハンクは、ハンクの前の行で終了すると見なされます。start,count

両方のファイルに共通の行は、空白文字で始まります。2つのファイル間で実際に異なる行の左側の印刷列には、以下の標識文字の1つがあります。

  • +
    最初のファイルに行が追加されました。
  • -
    最初のファイルからここで行が削除されました。

68

簡単な例の分析

形式は基本的にはdiff -u統一された差分と同じです。

例えば:

diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')

ここでは、2、3、14、15行目を削除しました。出力:

@@ -1,6 +1,4 @@
 01
-02
-03
 04
 05
 06
@@ -11,6 +9,4 @@
 11
 12
 13
-14
-15
 16

@@ -1,6 +1,4 @@ 手段:

  • -1,6これは、最初のファイルのこの部分が1行目から始まり、合計6行を示していることを意味します。したがって、1行目から6行目までを示しています。

    1
    2
    3
    4
    5
    6
    

    -通常はとして呼び出すため、「古い」を意味しdiff -u old newます。

  • +1,42番目のファイルのこの部分は1行目から始まり、合計4行を示します。したがって、1行目から4行目までを示しています。

    + 「新しい」を意味します。

    2行が削除されたため、6行ではなく4行しかありません!新しいハンクは次のとおりです。

    01
    04
    05
    06
    

@@ -11,6 +9,4 @@ 2番目のハンクも同様です。

  • 古いファイルには、古いファイルの11行目から始まる6行があります。

    11
    12
    13
    14
    15
    16
    
  • 新しいファイルには、新しいファイルの9行目から始まる4行があります。

    11
    12
    13
    16
    

    11前のハンクで2行と2行をすでに削除しているため、lineは新しいファイルの9行目であることに注意してください。

ハンクヘッダー

あなたのgitのバージョンと設定に応じて、あなたはまた、次のコード行を取得することができます@@例えば、ラインfunc1() {で:

@@ -4,7 +4,6 @@ func1() {

これ-pはplain のフラグで取得することもできdiffます。

例:古いファイル:

func1() {
    1;
    2;
    3;
    4;
    5;
    6;
    7;
    8;
    9;
}

lineを削除する6と、diffに次のように表示されます。

@@ -4,7 +4,6 @@ func1() {
     3;
     4;
     5;
-    6;
     7;
     8;
     9;

これは正しい行ではないことに注意してください。func11をスキップしました2

この素晴らしい機能は、多くの場合、各ハンクがどの関数またはクラスに属しているかを正確に伝えます。これは、diffを解釈するのに非常に役立ちます。

ヘッダーを選択するアルゴリズムがどのように機能するかについては、「git diffハンクヘッダーの抜粋はどこから来るのか」で説明されています。


ああ、私は@@ -1,6 +1,4 @@「1行目から開始して、古い行数は6でしたが、新しい行数は4です」と読みました
クラウド

1
@Cloud yupそれだけです:-)
Ciro Santilli郝海东冠状病六四事件法轮功

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.