2016-10-03 5 views
11

Wenn ich git diff laufen, beginnt die Ausgabe mit:Worauf bezieht sich der "diff --git" -Ausgang in "git diff"?

diff --git a/foo/bar b/foo/bar 

Wenn ich versuche, das gute alte diff --git zu laufen, ich gesagt, dass die --git Option nicht (offensichtlich nicht vorhanden ist, ich denke, es wäre dumm erscheinen für ein Low-Level-Tool, um über eine bestimmte DVCS zu wissen). Es gibt keine Erwähnung davon in der man Seite. Woher kommt das?

+0

Es ist in der Tat verwirrend, wie git diese Befehle auf eine so seltsame Weise enthält. –

+3

Die bestimmte Ausgabe wird hier hinzugefügt: https: //github.com/git/git/commit/b58f23b38a9a9f28d751311353819d3cdf6a86da und die Begründung dafür ist irgendwo hier vergraben: http://www.gelato.unsw.edu.au/archives/ git/0505/3812.html – nos

+0

Jemand hat es entfernt, aber ich hatte ursprünglich ein "osx" -Tag, um anzuzeigen, dass dies das "diff" war, das mit macOS ausgeliefert wird, und die GNU-Tools könnten * diff * er sein. – JHZ

Antwort

8

Es ist eine "imaginäre diff Option", verwendet, um den Leser, um anzuzeigen, dass es nicht nur die Ausgabe der von Lauf diff Befehl. Zum Beispiel Repo in git eigener git:

$ git diff HEAD~1..HEAD | head 
diff --git Documentation/git.txt Documentation/git.txt 
index bd659c4..7913fc2 100644 
--- Documentation/git.txt 
+++ Documentation/git.txt 
@@ -43,6 +43,11 @@ unreleased) version of Git, that is available from the 'master' 
branch of the `git.git` repository. 
Documentation for older releases are available here: 

+* link:v2.10.0/git.html[documentation for release 2.10] 
+ 
$ 

Der diff Befehl selbst, wenn Sie es mit dem gleichen Dateinamen aufgerufen zweimal, würde keine Unterschiede zeigen. git erstellt vermutlich temporäre Dateien, die zwei verschiedenen Versionen von Documentation/git.txt entsprechen, und füttert sie an diff - aber die Namen dieser temporären Dateien wären nicht nützlich. Ich denke, git diff massiert die Ausgabe von diff, um es für den Leser sinnvoller zu machen.

Tauchen in den git-Quellcode, hat diff.c die Zeichenfolge "diff --git" als String fest verdrahtet wörtliche:

strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, meta, a_one, b_two, reset); 

Und ein Blick in die Geschichte der diff.c für die früheste Version, die die Zeichenfolge enthält:

$ git log -n 1 b58f23b3 
commit b58f23b38a9a9f28d751311353819d3cdf6a86da 
Author: Junio C Hamano <[email protected]> 
Date: 2005-05-18 09:10:47 -0700 

    [PATCH] Fix diff output take #4. 

    This implements the output format suggested by Linus in 
    <[email protected]>, except the 
    imaginary diff option is spelled "diff --git" with double dashes as 
    suggested by Matthias Urlichs. 

    Signed-off-by: Junio C Hamano <[email protected]> 
    Signed-off-by: Linus Torvalds <[email protected]> 
$ 

Vermutlich ist <Pine.LNX...> die Nachrichten-ID einer E-Mail-Nachricht in einer Mailing-Liste irgendwo. In jedem Fall macht diese Commit-Nachricht deutlich, dass diff --git eine "imaginäre Diff-Option" ist.

This email message, zitiert von nos in einem Kommentar, scheint ein Teil der Diskussion zu sein, die dazu führte.

0

Die --git bedeutet, dass diff im "git" diff-Format ist. Es bezieht sich nicht auf und die Option des Befehls /usr/bin/diff Sie können die Liste der diff format Dokumentation finden. Andere Formate sind:

  • diff --combined
  • diff --cc
  • diff --summary
Verwandte Themen