Was ist der Unterschied zwischen Git Diff HEAD und Git Diff - inszeniert?

74

Was ist der Unterschied zwischen git diff HEADund git diff --staged? Ich habe beide ausprobiert, aber beide geben die gleiche Ausgabe.

vhd
quelle
1
Überprüfen Sie hier: stackoverflow.com/questions/1587846/…
Viacheslav Kondratiuk
@ Johnsyweb sorry; "genau" gleiche Ausgabe
vhd
2
--stagedist ein Synonym für --cached. Das Diagramm in stackoverflow.com/questions/1587846/… erläutert den Unterschied. Als Duplikat markiert
Abizern
Bald (Git 2.3.4+, Q2 2015) git status -v -vwird deutlich den Unterschied zwischen den beiden Unterschieden zeigen: siehe meine Antwort unten
VonC

Antworten:

109

Angenommen, diese Ausgabe für git status:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   y
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   x
#

Wie Sie sehen, wurde eine Datei geändert, aber nicht für das Festschreiben bereitgestellt, und eine neue Datei wurde hinzugefügt, die zum Festschreiben bereit ist.

git diff --staged zeigt nur Änderungen an Dateien im Bereich "Bereitgestellt" an.

git diff HEADzeigt alle Änderungen an verfolgten Dateien an. Wenn Sie alle Änderungen für das Festschreiben bereitgestellt haben, werden beide Befehle gleich ausgegeben.

Carlos Campderrós
quelle
Sollten es nicht nicht verfolgte Dateien an der Stelle von verfolgten Dateien sein? Denn wenn ich den Git-Status ohne Hinzufügen einer Datei mache, wird die nicht bereitgestellte Datei als nicht verfolgte Datei angezeigt.
VHD
Wenn es sich um eine neue Datei handelt, die Sie zuvor noch nicht hinzugefügt haben, wird sie als nicht verfolgt angezeigt und in keiner git diffVariante angezeigt . Wenn die Datei zuvor hinzugefügt und festgeschrieben wurde und Sie Änderungen daran vorgenommen haben, wird sie als "nicht für das
Festschreiben bereitgestellt
Gibt es eine Möglichkeit, diffzwischen der bereitgestellten Version und der nicht bereitgestellten Version derselben Datei zu wechseln?
Geremia
@geremia git diff --stagedmacht das, wenn ich dich richtig verstanden habe.
Carlos Campderrós
1
@ CarlosCampderrós Oh ja, solange Sie die Datei angeben, unterscheidet sich die inszenierte von der nicht inszenierten Version.
Geremia
43
  • git diff Unterschied zwischen Bühne und Arbeitsverzeichnis anzeigen
  • git diff --staged Unterschied zwischen HEAD und Stage anzeigen
  • git diff HEAD Unterschied zwischen HEAD und Arbeitsverzeichnis anzeigen

Geben Sie hier die Bildbeschreibung ein
img src

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein
img src

  • origin bezieht sich auf das Quell-Repository, von dem es geklont wurde.
  • HEAD ist ein Verweis auf das letzte Commit in der aktuell ausgecheckten Verzweigung.
  • Inszeniert und Index sind beide gleich
  • Nicht bereitgestellte Änderungen sind in unserem Arbeitsverzeichnis vorhanden , aber Git hat sie noch nicht in den Versionsverlauf aufgenommen.
  • Bereitgestellte Änderungen ähneln nicht bereitgestellten Änderungen, mit der Ausnahme, dass sie beim nächsten Ausführen von git commit als festgeschrieben markiert wurden
Premraj
quelle
15
Die Top-Grafik hat mir geholfen. Niedrigere Grafiken nicht so sehr.
Nick Weavers
@NickWeavers Ich habe die Grafiken entfernt, weil sie ziemlich ablenkend sind und der Antwort nichts hinzufügen.
Folgeyang
Hat jemand eine Idee, mit welchem ​​Tool die Top-Grafik erstellt wurde?
creativemateriel
1
@creativemateriel Ich denke, TikZ wurde verwendet: overleaf.com/learn/latex/TikZ_package
01F0
8

Mit dem Upcomming können Sie den Unterschied zwischen den beiden Unterschieden leichter erkennen (Git 2.3.4+, Q2 2015). git status -v -v

Siehe Commit 4055500 von Michael J Grubermjg , es macht einen guten Job und erklärt den Unterschied zwischen git diff HEADund git diff --staged:

commit/ status: zeige den Index-Arbeitsbaum diff mit-v -v

git commitund git statusim Langformat zeigen Sie den Unterschied zwischen HEAD und dem Index, wenn angegeben -v. Auf diese Weise kann eine Vorschau eines Commits angezeigt werden .

Sie listen auch verfolgte Dateien mit nicht bereitgestellten Änderungen auf, jedoch ohne Unterschied.

-v -vFühren Sie ' ' ein, das den Unterschied zwischen dem Index und dem Arbeitsbaum zusätzlich zum Indexunterschied zeigt HEAD. Dies ermöglicht eine Überprüfung nicht bereitgestellter Änderungen, die möglicherweise im Commit fehlen .

Im Fall von ' -v -v' zusätzliche Kopfzeilen

Changes to be committed:
# and
Changes not staged for commit:

werden vor den Diffs eingefügt, die denen im Statusbereich entsprechen; Letzterem geht 50 * " -" voraus , damit es mehr hervorsteht.

VonC
quelle
0

Sie können die beiden diff-Befehle auch unterschiedlich ausgeben, wenn Sie sie bei einer erfolglosen Zusammenführung ausführen, dh bei nicht zusammengeführten Pfaden.

Ich konnte nicht herausfinden, warum es sich so verhält, aber Sie können hier mehr darüber lesen

Bimme
quelle
0

Ein weiterer Unterschied zwischen Randfällen: In einem neu erstellten Git-Repo, in dem bisher nur ausgeführt git initwurde, git diff HEADführt dies zu einem schwerwiegenden Fehler (mehrdeutiges Argument 'HEAD'), während git diff --stagedkeine Ausgabe erzeugt wird.

dave_k_smith
quelle