Ich habe ein paar Änderungen vorgenommen, die begangen werden sollen. Wie kann ich den Unterschied aller Dateien sehen, die für das nächste Commit bereitgestellt werden? Ich kenne den Git-Status , möchte aber die tatsächlichen Unterschiede sehen - nicht nur die Namen der Dateien, die bereitgestellt werden.
Ich habe gesehen, dass die git-diff (1) Manpage sagt
Git Diff [--Optionen] [-] […]
In diesem Formular werden die Änderungen angezeigt, die Sie in Bezug auf den Index vorgenommen haben (Staging-Bereich für das nächste Commit). Mit anderen Worten, die Unterschiede sind das, was Sie Git sagen könnten , um den Index weiter zu erweitern, aber Sie haben es immer noch nicht. Sie können diese Änderungen mit git-add (1) durchführen.
Leider kann ich das nicht ganz verstehen. Es muss einen praktischen Einzeiler geben, für den ich einen Alias erstellen könnte, oder?
git status -v
funktioniert auch. Siehe meine Antwort untenless
, wie in:git status -v | less
- überschaubare Stücke :)Antworten:
Es sollte einfach sein:
--cached
bedeutet, die Änderungen im Cache / Index (dh bereitgestellte Änderungen) gegenüber dem aktuellen anzuzeigenHEAD
.--staged
ist ein Synonym für--cached
.--staged
und--cached
zeigt nicht aufHEAD
, nur Unterschied in Bezug aufHEAD
. Wenn Sie auswählen, was mitgit add --patch
(odergit add -p
) festgeschrieben werden soll ,--staged
wird zurückgegeben, was inszeniert ist.quelle
git diff --name-only --cached
pro Beitrag unter stackoverflow.com/a/4525025/255187git difftool --staged
anstattgit diff --staged
das standardmäßige visuelle Diff-Tool für jede Datei zu starten.difftool
kann auch durchdiff
andere Argumente ersetzt werden.git difftool --staged -d
die beiden Verzeichnisse in einem visuellen Tool und nicht in einer Datei gleichzeitig unterscheiden.git diff --cached -- <stagedfile>
Eine einfache Grafik macht dies klarer:
Git Diff
Zeigt die Änderungen zwischen dem Arbeitsverzeichnis und dem Index an. Dies zeigt, was geändert wurde, aber nicht für ein Commit bereitgestellt wird.
Git diff - zwischengespeichert
Zeigt die Änderungen zwischen dem Index und dem HEAD an (dies ist das letzte Commit in diesem Zweig). Dies zeigt, was dem Index hinzugefügt und für ein Commit bereitgestellt wurde.
Git Diff HEAD
Zeigt alle Änderungen zwischen dem Arbeitsverzeichnis und HEAD an (einschließlich Änderungen im Index). Hier werden alle Änderungen seit dem letzten Festschreiben angezeigt, unabhängig davon, ob sie für das Festschreiben bereitgestellt wurden oder nicht.
Auch :
365Git ist etwas detaillierter .
quelle
foo.c
und diese nicht ausführengit add foo.c
,foo.c
befindet sie sich nicht im Index . Es wird nicht für das Festschreiben bereitgestellt. Wenn esgit diff foo.c
naiv mit der Arbeitfoo.c
am Index verglichen würde, müsste es einen riesigen Unterschied zwischen einer leeren / nicht vorhandenen Datei und dem gesamten Inhalt von zeigenfoo.c
. Wenn also eine Datei nicht im Index vorhanden istgit diff
, wird für diese Datei auf die Verwendung derHEAD
Kopie zurückgegriffen.HEAD
auf die die bereitgestellten Änderungen angewendet werden. Denken Sie daran, dass Git Änderungen speichert und nicht ganze Dateien. Wenn Sie eine Datei bereitstellen, werden nur die vorgenommenen Änderungen gespeichert. Wenn der Index leer ist, wie Sie es implizieren, weiß er nicht, wie die Änderungen im Index gespeichert werden sollen, und muss die gesamte Datei als "neu hinzugefügt" speichern - was falsch ist.HEAD
haben die unveränderte Version derfoo.c
Datei (es handelt sich nicht um physische Kopien, sondern nur um logische Kopien für Sie und mich. Für Git handelt es sich nur um denselben Datenstrom, auf den sich jedes Commit bezieht, auf das sich diese Datei jemals bezieht ). Wenn Sie alsogit diff
auf der vollständig nicht bereitgestellten Datei arbeitenfoo.c
, wird nicht wirklich darauf zurückgegriffen,HEAD
dass der Diff tatsächlich mit dem Index ausgeführt wird (der zufällig genau dieselbe Version der Datei enthält wieHEAD
). Die Grafik ist also korrekt.git status -v
ist gleichbedeutend mitgit diff --cached
(plusgit status
natürlich)Wenn Sie an einer visuellen Ansicht nebeneinander interessiert sind, kann das diffuse visuelle Diff-Tool dies tun. Es werden sogar drei Fenster angezeigt, wenn einige, aber nicht alle Änderungen vorgenommen wurden. Bei Konflikten gibt es sogar vier Fenster.
Rufe es mit auf
in Ihrer Git-Arbeitskopie.
Wenn Sie mich fragen, ist der beste visuelle Unterschied, den ich seit einem Jahrzehnt gesehen habe. Es ist auch nicht spezifisch für Git: Es arbeitet mit einer Vielzahl anderer VCS zusammen, einschließlich SVN, Mercurial, Bazaar, ...
Siehe auch: Zeige sowohl inszenierten als auch funktionierenden Baum in Git Diff?
quelle
brew install diffuse
funktioniert unter OS X. Zeigt keine 3 Fenster an, wenn sowohl nicht bereitgestellte als auch bereitgestellte Änderungen vorgenommen wurden. Meinten Sie Änderungen, die noch nicht im Index enthalten sind?Beachten Sie, dass
git status -v
auch die inszenierten Änderungen angezeigt werden! (was bedeutet, dass Sie -git add
- einige Änderungen inszeniert haben müssen . Keine inszenierten Änderungen, kein Unterschied mitgit status -v
. Diesgeschieht seit Git 1.2.0, Februar 2006 )
Hat in seiner langen Form (Standard)
git status
eine undokumentierte "ausführliche" Option, die tatsächlich den Unterschied zwischen HEAD und Index anzeigt.Und es wird noch vollständiger: siehe " Sowohl inszenierten als auch funktionierenden Baum in git diff anzeigen ? " (Git 2.3.4+, 2. Quartal 2015):
quelle
git diff HEAD
git status -vv
auch beinhaltet, wasgit diff HEAD
tut.git version 1.8.3.1
. Ich weiß, dass es alt ist, aber wenn möglich, notieren Sie, wann diese Flagge eingeführt wurde.git status -v
älter ( github.com/git/git/commit/… , git 1.2.0, Februar 2006!). Beachten Sie, dass der Unterschied zwischen dem Index angezeigt wird undHEAD
: Wenn Sie dem Index etwas hinzugefügt haben (neingit add
),git status -v
wird kein Unterschied angezeigt.git status -v -v
ist neuer (Git 2.3.4, März 2015)git diff -v
.Sie können diesen Befehl verwenden.
Die
--cached
Optiongit diff
bedeutet, bereitgestellte Dateien abzurufen, und die--name-only
Option bedeutet, nur Namen der Dateien abzurufen.quelle
--name-only
Option, dass ich genauso gut den regulärengit status
Ab Version 1.7 sollte es sein:
quelle
VERWENDUNG EINES VISUAL DIFF TOOL
Die Standardantwort (in der Befehlszeile)
Die Top-Antworten hier zeigen korrekt, wie die zwischengespeicherten / bereitgestellten Änderungen in den
Index
folgenden Bereichen angezeigt werden :oder
$ git diff --staged
was ist ein Alias.Starten Sie stattdessen das Visual Diff Tool
Die Standardantwort spuckt die Diff-Änderungen bei der Git-Bash aus (dh in der Befehlszeile oder in der Konsole). Für diejenigen , die eine visuelle Darstellung der Datei Unterschiede inszenierten bevorzugen, gibt es ein Skript innerhalb von git , die Kutter ein Diff - Tool für jede Datei und nicht gesehen , als sie auf der Kommandozeile zeigt, genannt
difftool
:Dies funktioniert genauso wie
git diff --staged
, außer dass jedes Mal, wenn das Diff-Tool ausgeführt wird (dh jedes Mal, wenn eine Datei von Diff verarbeitet wird), das standardmäßige visuelle Diff-Tool gestartet wird (in meiner Umgebung ist dies kdiff3 ).Nach dem Start des Tools wird das Git Diff-Skript angehalten, bis Ihr Visual Diff-Tool geschlossen wird. Daher müssen Sie jede Datei schließen, um die nächste zu sehen.
Sie können immer
difftool
anstelle vondiff
in git-Befehlen verwendenFunktioniert für alle Ihre visuellen Diff-Anforderungen
git difftool
anstelle einesgit diff
Befehls, einschließlich aller Optionen.Fügen Sie beispielsweise die
-y
Option hinzu, um das Visual Diff-Tool zu starten, ohne zu fragen, ob es für jede Datei ausgeführt werden soll (ich denke, normalerweise möchten Sie dies !!):In diesem Fall wird jede Datei im Visual Diff-Tool einzeln aufgerufen und die nächste nach dem Schließen des Tools aufgerufen.
Oder um den Unterschied einer bestimmten Datei zu betrachten, die in der
Index
folgenden Datei bereitgestellt wird :Alle Optionen finden Sie in der Manpage:
Visual Git Tool einrichten
Verwenden Sie die folgende
-t <tool>
Option, um ein anderes visuelles Git-Tool als das Standardwerkzeug zu verwenden :In der Manpage difftool erfahren Sie, wie Sie git für die Verwendung eines anderen Standard-Visual-Diff-Tools konfigurieren.
Beispieleinträge
.gitconfig
für vscode als Diff / Merge-ToolEin Teil des Einrichtens eines Difftools besteht darin, die
.gitconfig
Datei entweder über Git-Befehle zu ändern, die sie hinter den Kulissen ändern, oder sie direkt zu bearbeiten.Sie finden Ihre
.gitconfig
in Ihrem Home-Verzeichnis (z. B.~
unter Unix oder normalerweisec:\users\<username>
unter Windows).Oder Sie können den Benutzer
.gitconfig
in Ihrem Standard-Git-Editor mit öffnengit config -e --global
.Hier sind Beispieleinträge in meinem globalen Benutzer
.gitconfig
für VS-Code als Diff-Tool und Merge-Tool:quelle
Verwenden Sie für den Vergleich Staging Area vs Repository (letztes Commit)
Der Befehl vergleicht Ihre staged (
$ git add fileName
) - Änderungen mit Ihrem letzten Commit. Wenn Sie sehen möchten, was Sie für Ihr nächstes Commit bereitgestellt haben, können Sie git diff --staged verwenden. Dieser Befehl vergleicht Ihre bereitgestellten Änderungen mit Ihrem letzten Commit.Für den Vergleich zwischen Arbeiten und Staging verwenden
Der Befehl vergleicht, was sich in Ihrem Arbeitsverzeichnis befindet, mit dem, was sich in Ihrem Staging-Bereich befindet. Es ist wichtig zu beachten, dass git diff nicht alle Änderungen anzeigt, die seit Ihrem letzten Commit vorgenommen wurden - nur Änderungen, die noch nicht bereitgestellt sind. Wenn Sie alle Ihre Änderungen vorgenommen haben (
$ git add fileName
), gibt git diff keine Ausgabe aus.Wenn Sie eine Datei (
$ git add fileName
) bereitstellen und dann bearbeiten, können Sie mit git diff die Änderungen in der Datei anzeigen, die bereitgestellt werden, und die Änderungen, die nicht bereitgestellt werden.quelle
$ git diff
" . Ich bin mir ziemlich sicher, dass es einengit diff
Vergleich zwischen Working und Staging gibt. Siehe stackoverflow.com/a/1587952Wenn Sie beabsichtigen, einen Remote-Repo-Zweig per Push-Target zu erreichen, und Ihr erster Durchgang in einem Commit-Änderungsprotokoll unvollständig war, können Sie die Commit-Anweisung korrigieren, bevor Sie wie folgt pushen.
Örtlich
... einige Änderungen vornehmen ...
... erinnern Sie sich an weitere Änderungen, die beim Festschreiben nicht erwähnt wurden ...
git diff origin / master # schau dir inszenierte aber nicht gepuschte Änderungen an
... inszenierte Commit-Erklärung ändern ...
quelle
Wenn Sie mehr als eine Datei mit abgestuften Änderungen haben, ist es möglicherweise praktischer, die gewünschten Dateien
git add -i
auszuwählen6: diff
, auszuwählen und schließlich auszuwählen.quelle
Standardmäßig wird git diff verwendet, um die Änderungen anzuzeigen, die nicht zur Liste der aktualisierten git-Dateien hinzugefügt wurden. Aber wenn Sie möchten , um die Änderungen zeigen , die hinzugefügt oder stagged dann müssen Sie zusätzliche Optionen, die git wissen lassen, dass Sie in stagged oder hinzugefügten Dateien interessiert sind diff .
Beispiel
Sobald Sie die Dateien hinzugefügt haben, können Sie die Standardeinstellung 'git diff' nicht mehr verwenden. Sie müssen Folgendes tun: -
quelle
git gui
undgit-cola
sind grafische Dienstprogramme, mit denen Sie den Index anzeigen und bearbeiten können. Beide enthalten einfache visuelle Unterschiede für bereitgestellte Dateien undgit-cola
können auch ein komplexeres visuelles Diff-Tool nebeneinander starten.Siehe meine eng verwandte Antwort unter Wie entferne ich eine Datei aus dem Index in Git? und auch dieser offizielle Katalog von Git - GUI Clients .
quelle
Denken Sie auch an das
gitk
Tool, das mit Git geliefert wird und sehr nützlich ist, um die Änderungen zu sehenquelle