Wie zeige ich die inszenierten Änderungen?

2140

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?

Frerich Raabe
quelle
76
git status -vfunktioniert auch. Siehe meine Antwort unten
VonC
3
@VonC Ich benutze dies immer, aber weitergeleitet less, wie in: git status -v | less- überschaubare Stücke :)
Mr Office

Antworten:

2613

Es sollte einfach sein:

git diff --cached

--cachedbedeutet, die Änderungen im Cache / Index (dh bereitgestellte Änderungen) gegenüber dem aktuellen anzuzeigen HEAD. --stagedist ein Synonym für --cached.

--stagedund --cachedzeigt nicht auf HEAD, nur Unterschied in Bezug auf HEAD. Wenn Sie auswählen, was mit git add --patch(oder git add -p) festgeschrieben werden soll , --stagedwird zurückgegeben, was inszeniert ist.

CB Bailey
quelle
35
Wenn Sie nur die Dateinamen möchten, gehen Sie wie folgt git diff --name-only --cachedpro Beitrag unter stackoverflow.com/a/4525025/255187
Michel Hébert
4
Verwenden Sie diese Option, git difftool --stagedanstatt git diff --stageddas standardmäßige visuelle Diff-Tool für jede Datei zu starten. difftoolkann auch durch diffandere Argumente ersetzt werden.
LightCC
Außerdem können Sie git difftool --staged -ddie beiden Verzeichnisse in einem visuellen Tool und nicht in einer Datei gleichzeitig unterscheiden.
Robert Bernstein
da dieser als Antwort markiert ist und zuerst zeigt, sollte er oben Git Diff enthalten, dann Git [[andere]], nur meine 2 Cent
Vitaliy Terziev
Und um die Änderungen in einer einzelnen git diff --cached -- <stagedfile>
bereitgestellten
1605

Eine einfache Grafik macht dies klarer:

Einfache Git-Unterschiede

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 .

Abizern
quelle
8
Ich fürchte, das ist naiv (wie es normalerweise bei jeder Git-Erklärung der Fall ist). Wenn Sie lokale Änderungen vorgenommen haben foo.cund diese nicht ausführen git add foo.c, foo.cbefindet sie sich nicht im Index . Es wird nicht für das Festschreiben bereitgestellt. Wenn es git diff foo.cnaiv mit der Arbeit foo.cam Index verglichen würde, müsste es einen riesigen Unterschied zwischen einer leeren / nicht vorhandenen Datei und dem gesamten Inhalt von zeigen foo.c. Wenn also eine Datei nicht im Index vorhanden ist git diff, wird für diese Datei auf die Verwendung der HEADKopie zurückgegriffen.
Kaz
9
@ Kaz genau genommen ist der Index keine leere Tafel . Es ist eine virtuelle Kopie der, HEADauf 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.
ADTC
8
@Kaz Sowohl der Index als auch der HEADhaben die unveränderte Version der foo.cDatei (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 also git diffauf der vollständig nicht bereitgestellten Datei arbeiten foo.c, wird nicht wirklich darauf zurückgegriffen, HEADdass der Diff tatsächlich mit dem Index ausgeführt wird (der zufällig genau dieselbe Version der Datei enthält wie HEAD). Die Grafik ist also korrekt.
ADTC
2
Hallo, ich würde gerne wissen, was es in diesem Zusammenhang " Index " bedeutet . Vielen Dank!
Gab
2
@ TomRussell git status -vist gleichbedeutend mit git diff --cached(plus git statusnatürlich)
wisbucky
54

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.

Screenshot von diffus mit inszenierten und nicht inszenierten Änderungen

Rufe es mit auf

diffuse -m

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?

krlmlr
quelle
1
Danke, das sieht nach einem schönen Werkzeug aus. Ich habe festgestellt, dass Meld das beste visuelle Diff-Tool für Linux ist, aber ich habe es vermisst, Text aus der Zwischenablage zu unterscheiden - Meld benötigt Dateien für die Eingabe. Diffuse ermöglicht dies ebenso wie die manuelle Neuausrichtung. Ich werde es eine Weile ausprobieren.
Drew Noakes
Unterbrochener Link zu diffuse.sourceforge.net, verwenden Sie vorerst sourceforge.net/projects/diffuse .
user1133275
1
brew install diffusefunktioniert 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?
Brent Faust
Welche diffuse Version hast du? Ja - Wenn Sie eine Datei hinzufügen und dann lokal ändern, sollten drei Fenster angezeigt werden.
krlmlr
Sie können diffuse auch als Standard- Difftool einrichten und diesen integrierten Mechanismus / Tool / Alias ​​verwenden, um es zu starten. Siehe meine Antwort hier: < stackoverflow.com/a/45684512/6501141 >
LightCC
50

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 mit git status -v. Dies
geschieht seit Git 1.2.0, Februar 2006 )

Hat in seiner langen Form (Standard) git statuseine 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):

git status -v -v
VonC
quelle
Die letzte Zeile sollte seingit diff HEAD
Artur
2
@ Artur warum? Der Sinn der Antwort ist zu erwähnen, dass dies git status -vvauch beinhaltet, was git diff HEADtut.
VonC
Funktioniert nicht weiter git version 1.8.3.1. Ich weiß, dass es alt ist, aber wenn möglich, notieren Sie, wann diese Flagge eingeführt wurde.
Onebree
2
@onebree 1.8.3.1 ist Juni 2013, in der Tat alt. Ist aber 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 und HEAD: Wenn Sie dem Index etwas hinzugefügt haben (nein git add), git status -vwird kein Unterschied angezeigt. git status -v -vist neuer (Git 2.3.4, März 2015)
VonC
@VonC das war mein Fehler ... ich habe es getan git diff -v.
Onebree
25

Sie können diesen Befehl verwenden.

git diff --cached --name-only

Die --cachedOption git diffbedeutet, bereitgestellte Dateien abzurufen, und die --name-onlyOption bedeutet, nur Namen der Dateien abzurufen.

Yash Patadia
quelle
2
Bitte bearbeiten Sie mit weiteren Informationen. Nur-Code- und "Versuch dies" -Antworten werden nicht empfohlen, da sie keinen durchsuchbaren Inhalt enthalten und nicht erklären, warum jemand "dies versuchen" sollte.
Abarisone
2
Ich bin mir nicht sicher, warum ich das möchte, mit der --name-onlyOption, dass ich genauso gut den regulärengit status
Simon Forsberg
16

Ab Version 1.7 sollte es sein:

git diff --staged
ML13
quelle
15

VERWENDUNG EINES VISUAL DIFF TOOL

Die Standardantwort (in der Befehlszeile)

Die Top-Antworten hier zeigen korrekt, wie die zwischengespeicherten / bereitgestellten Änderungen in den Indexfolgenden Bereichen angezeigt werden :

$ git diff --cached

oder $ git diff --stagedwas 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:

$ git difftool --staged

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 difftoolanstelle von diffin git-Befehlen verwenden

Funktioniert für alle Ihre visuellen Diff-Anforderungen git difftoolanstelle eines git diffBefehls, einschließlich aller Optionen.

Fügen Sie beispielsweise die -yOption 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 !!):

$ git difftool -y --staged

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 Indexfolgenden Datei bereitgestellt wird :

$ git difftool -y --staged <<relative path/filename>>

Alle Optionen finden Sie in der Manpage:

$ git difftool --help


Visual Git Tool einrichten

Verwenden Sie die folgende -t <tool>Option, um ein anderes visuelles Git-Tool als das Standardwerkzeug zu verwenden :

$ git difftool -t <tool> <<other args>>

In der Manpage difftool erfahren Sie, wie Sie git für die Verwendung eines anderen Standard-Visual-Diff-Tools konfigurieren.


Beispieleinträge .gitconfigfür vscode als Diff / Merge-Tool

Ein Teil des Einrichtens eines Difftools besteht darin, die .gitconfigDatei entweder über Git-Befehle zu ändern, die sie hinter den Kulissen ändern, oder sie direkt zu bearbeiten.

Sie finden Ihre .gitconfigin Ihrem Home-Verzeichnis (z. B. ~unter Unix oder normalerweise c:\users\<username>unter Windows).

Oder Sie können den Benutzer .gitconfigin Ihrem Standard-Git-Editor mit öffnen git config -e --global.

Hier sind Beispieleinträge in meinem globalen Benutzer .gitconfigfür VS-Code als Diff-Tool und Merge-Tool:

[diff]
    tool = vscode
    guitool = vscode
[merge]
    tool = vscode
    guitool = vscode
[mergetool]
    prompt = true
[difftool "vscode"]
    cmd = code --wait --diff \"$LOCAL\" \"$REMOTE\"
    path = c:/apps/vscode/code.exe
[mergetool "vscode"]
    cmd = code --wait \"$MERGED\"
    path = c:/apps/vscode/code.exe
LightCC
quelle
14

Verwenden Sie für den Vergleich Staging Area vs Repository (letztes Commit)

 $git diff --staged

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

$ git diff 

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.

Goyal Vicky
quelle
"Für den Vergleich zwischen Arbeiten und Repository verwenden $ git diff" . Ich bin mir ziemlich sicher, dass es einen git diffVergleich zwischen Working und Staging gibt. Siehe stackoverflow.com/a/1587952
wisbucky
8

Wenn 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 ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... 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 ...

git commit --amend -m"i missed mentioning these changes ...."

git push
Marc Condon
quelle
7

Wenn Sie mehr als eine Datei mit abgestuften Änderungen haben, ist es möglicherweise praktischer, die gewünschten Dateien git add -iauszuwählen 6: diff, auszuwählen und schließlich auszuwählen.

Fred Schoen
quelle
6

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 .

$ git diff          # Default Use
$ git diff --cached # Can be used to show difference after adding the files 
$ git diff --staged # Same as 'git diff --cached' mostly used with latest version of git 

Beispiel

$ git diff 
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
--- a/x/y/z.js 
+++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

-        if (a)
+        if (typeof a !== 'undefined')
             res = 1;
         else
             res = 2;

$ git add x/y/z.js
$ git diff
$

Sobald Sie die Dateien hinzugefügt haben, können Sie die Standardeinstellung 'git diff' nicht mehr verwenden. Sie müssen Folgendes tun: -

$ git diff --cached
diff --git a/x/y/z.js  b/x/y/z.js index 98fc22b..0359d84 100644
    --- a/x/y/z.js 
    +++ b/x/y/z.js @@ -43,7 +43,7 @@ var a = function (tooltip) {

    -        if (a)
    +        if (typeof a !== 'undefined')
                 res = 1;
             else
                 res = 2;
Deepak Dixit
quelle
2

git guiund git-colasind grafische Dienstprogramme, mit denen Sie den Index anzeigen und bearbeiten können. Beide enthalten einfache visuelle Unterschiede für bereitgestellte Dateien und git-colakö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 .

kein Balken
quelle
0

Denken Sie auch an das gitkTool, das mit Git geliefert wird und sehr nützlich ist, um die Änderungen zu sehen

Sam
quelle