Comment afficher les modifications qui ont été mises en scène?

2141

J'ai mis en place quelques changements à engager; comment puis-je voir la différence de tous les fichiers qui sont mis en scène pour le prochain commit? Je connais l' état de git , mais j'aimerais voir les différences réelles - pas seulement les noms des fichiers qui sont mis en scène.

J'ai vu que la page de manuel git-diff (1) indique

git diff [--options] [-] […]

Ce formulaire permet de visualiser les modifications que vous avez apportées par rapport à l'index (zone de transit pour la prochaine validation). En d'autres termes, les différences sont ce que vous pourriez dire à git d'ajouter à l'index, mais ce n'est toujours pas le cas. Vous pouvez mettre en scène ces modifications en utilisant git-add (1).

Malheureusement, je ne peux pas vraiment comprendre cela. Il doit y avoir une doublure pratique pour laquelle je pourrais créer un alias, non?

Frerich Raabe
la source
76
git status -vfonctionne aussi. Voir ma réponse ci
VonC
3
@VonC Je l'utilise toujours, mais lesscomme pour: git status -v | less- morceaux gérables :)
Mr Office

Réponses:

2613

Cela devrait simplement être:

git diff --cached

--cachedsignifie montrer les changements dans le cache / index (c'est-à-dire les changements par étapes) par rapport au courant HEAD. --stagedest synonyme de --cached.

--stagedet --cachedne pointe pas HEAD, juste différence par rapport à HEAD. Si vous choisissez ce que vous souhaitez valider en utilisant git add --patch(ou git add -p), vous --stagedretournerez ce qui est mis en scène.

CB Bailey
la source
35
Si vous ne voulez que les noms de fichiers, procédez comme suit git diff --name-only --cachedpar publication sur stackoverflow.com/a/4525025/255187
Michel Hébert
4
Utilisez-le avec git difftool --stagedplutôt que git diff --stagedpour lancer l'outil de comparaison visuelle par défaut sur chaque fichier. difftoolpeut également être remplacé diffpar tout autre argument.
LightCC
Et vous pouvez utiliser git difftool --staged -dpour différencier les deux répertoires dans un outil visuel plutôt qu'un fichier à la fois.
Robert Bernstein
puisque celui-ci est marqué comme réponse et montrant d'abord qu'il doit inclure git diff en haut, puis git [[others]], juste mes 2 cents
Vitaliy Terziev
Et pour afficher les modifications dans un seul fichier git diff --cached -- <stagedfile>
intermédiaire
1606

Un graphique simple rend cela plus clair:

Différences Git simples

git diff

Affiche les changements entre le répertoire de travail et l'index. Cela montre ce qui a été modifié, mais n'est pas organisé pour une validation.

git diff --cached

Affiche les changements entre l'index et le HEAD (qui est le dernier commit sur cette branche). Cela montre ce qui a été ajouté à l'index et organisé pour une validation.

git diff HEAD

Affiche toutes les modifications entre le répertoire de travail et HEAD (qui inclut les modifications dans l'index). Cela montre toutes les modifications depuis la dernière validation, qu'elles aient été ou non mises en scène pour la validation.

Aussi :

Il y a un peu plus de détails sur 365Git.

Abizern
la source
8
C'est naïf, je le crains (comme c'est généralement le cas avec toute explication git). Si vous avez des modifications locales foo.cet n'effectuez pas git add foo.c, alors foo.cn'est pas dans l'index ; il n'est pas organisé pour la validation. Si git diff foo.cnaïvement comparé au fonctionnement foo.cde l'index, il faudrait alors montrer un diff géant entre un fichier vide / inexistant et le contenu entier de foo.c. Donc en fait, quand un fichier n'existe pas dans l'index, git diffse replie, pour ce fichier, sur l'utilisation duHEAD copie.
Kaz
9
@Kaz à proprement parler, l'index n'est pas une ardoise vierge. Il s'agit d'une copie virtuelle duHEAD sur lequel les modifications par étapes sont appliquées. N'oubliez pas que Git fonctionne en enregistrant les modifications et non en enregistrant des fichiers entiers. Lorsque vous mettez en scène un fichier, il ne stocke que les modifications apportées. Si l'index est vide comme vous le laissez entendre, il ne saura pas comment enregistrer les modifications dans l'index et devra enregistrer le fichier entier en tant que "nouvellement ajouté" - ce qui est faux.
ADTC
8
@Kaz L'index et le HEADauront la version inchangée du foo.cfichier (ce ne sont pas des copies physiques, mais juste des copies logiques pour vous et moi. Pour Git, ce sont juste le même flux de données auquel se réfère chaque commit qui a impliqué ce fichier. ). Donc, quand vous le faites git diffsur une scène entièrement non mise en scène, foo.cce n'est pas vraimentHEAD de faire le diff avec l'index (qui contient exactement la même version du fichier que le HEADfait). Le graphique est donc correct.
ADTC
2
Bonjour, je voudrais savoir ce que cela signifie " index " dans ce contexte? Merci!
Gab 是 好人
2
@TomRussell git status -vest équivalent à git diff --cached(plus git statusbien sûr)
wisbucky
54

Si vous êtes intéressé par une vue visuelle côte à côte, l' outil de diffusion visuelle diffuse peut le faire. Il affichera même trois volets si certaines modifications, mais pas toutes, sont mises en scène. En cas de conflit, il y aura même quatre volets.

Capture d'écran de diffuse avec des modifications échelonnées et non échelonnées

Invoquez-le avec

diffuse -m

dans votre copie de travail Git.

Si vous me demandez, le meilleur visuel que j'ai vu depuis une décennie. De plus, il n'est pas spécifique à Git: il interagit avec une pléthore d'autres VCS, notamment SVN, Mercurial, Bazaar, ...

Voir aussi: Afficher à la fois l'arborescence par étapes et de travail dans git diff?

krlmlr
la source
1
Merci, cela ressemble à un bel outil. Jusqu'à présent, j'ai trouvé que Meld était le meilleur outil de différenciation visuelle pour Linux, mais j'ai manqué de pouvoir différencier le texte du presse-papiers - Meld nécessite des fichiers pour la saisie. Diffuse permet cela, ainsi qu'un réalignement manuel. Je vais l'essayer pendant un moment.
Drew Noakes du
Lien brisé vers diffuse.sourceforge.net, utilisez sourceforge.net/projects/diffuse pour l'instant.
user1133275
1
brew install diffusefonctionne sur OS X. N'affiche pas 3 volets si les modifications sont non échelonnées et échelonnées - vouliez-vous dire des changements qui ne figurent pas encore dans l'index?
Brent Faust
Quelle version de diffus avez-vous? Oui - si vous ajoutez un fichier puis le modifiez localement, il devrait afficher trois volets.
krlmlr
Vous pouvez également configurer diffus comme votre outil de diffusion par défaut et utiliser ce mécanisme / outil / alias intégré pour le lancer. Voir ma réponse ici: < stackoverflow.com/a/45684512/6501141 >
LightCC
50

Notez que montre git status -v également les changements par étapes! (ce qui signifie que vous devez avoir mis en scène - git add- quelques modifications. Aucune modification par étapes, aucun diff avec git status -v.
Il le fait depuis Git 1.2.0, février 2006 )

Dans sa forme longue (par défaut), git statusa une option "verbeuse" non documentée qui affiche en fait la différence entre HEAD et index.

Et il est sur le point de devenir encore plus complet: voir " Afficher à la fois l'arborescence intermédiaire et de travail dans git diff? " (Git 2.3.4+, Q2 2015):

git status -v -v
VonC
la source
La dernière ligne devrait êtregit diff HEAD
artur
2
@artur pourquoi? Le point de la réponse est de mentionner qui git status -vvcomprend également ce qui git diff HEADfait.
VonC
Ne fonctionne pas git version 1.8.3.1. Je sais que c'est vieux, mais si possible, notez quand ce drapeau a été introduit.
onebree
2
@onebree 1.8.3.1 est juin 2013, vieux en effet. Mais il git status -vest plus ancien ( github.com/git/git/commit/… , git 1.2.0, février 2006!). Notez qu'il affiche la différence entre l' index et HEAD: si vous avez ajouté quelque chose à l'index (non git add), alors git status -vil n'affichera aucune différence. git status -v -vest plus récent (Git 2.3.4, mars 2015)
VonC
@VonC c'était mon erreur ... je l'ai fait git diff -v.
onebree
25

Vous pouvez utiliser cette commande.

git diff --cached --name-only

L' --cachedoption de git diffmoyens pour obtenir des fichiers intermédiaires, et l' --name-onlyoption signifie d'obtenir uniquement les noms des fichiers.

Yash Patadia
la source
2
Veuillez modifier avec plus d'informations. Les réponses codées uniquement et "essayez ceci" sont déconseillées, car elles ne contiennent aucun contenu consultable et n'expliquent pas pourquoi quelqu'un devrait "essayer ceci".
abarisone
2
Je ne sais pas pourquoi je voudrais cela, avec l' --name-onlyoption, je pourrais aussi bien utiliser le réguliergit status
Simon Forsberg
16

À partir de la version 1.7 et ultérieure, cela devrait être:

git diff --staged
ML13
la source
15

UTILISATION D'UN OUTIL VISUEL DIFF

La réponse par défaut (sur la ligne de commande)

Les meilleures réponses ici montrent correctement comment afficher les modifications mises en cache / par étapes dans Index:

$ git diff --cached

ou $ git diff --stagedqui est un alias.


Lancer l'outil Visual Diff à la place

La réponse par défaut crachera les changements de diff au git bash (c'est-à-dire sur la ligne de commande ou dans la console). Pour ceux qui préfèrent une représentation visuelle des différences de fichiers intermédiaires, il existe un script disponible dans git qui lance un outil de comparaison visuelle pour chaque fichier consulté plutôt que de les afficher sur la ligne de commande, appelé difftool:

$ git difftool --staged

Cela fera la même chose que git diff --staged, sauf chaque fois que l'outil de diff est exécuté (c'est-à-dire chaque fois qu'un fichier est traité par diff), il lancera l'outil de diff visuel par défaut (dans mon environnement, c'est kdiff3 ).

Après le lancement de l'outil, le script git diff s'arrêtera jusqu'à ce que votre outil de diff visuel soit fermé. Par conséquent, vous devrez fermer chaque fichier pour voir le suivant.


Vous pouvez toujours utiliser difftoolà la place dediff commandes in git

Pour tous vos besoins de diff visuels, git difftoolfonctionnera à la place de toutgit diff commande, y compris toutes les options.

Par exemple, pour lancer l'outil de diff visuel sans demander s'il faut le faire pour chaque fichier, ajoutez l' -yoption (je pense que généralement vous en aurez envie !!):

$ git difftool -y --staged

Dans ce cas, il récupérera chaque fichier dans l'outil de diff visuel, un à la fois, en faisant apparaître le suivant après la fermeture de l'outil.

Ou pour regarder la différence d'un fichier particulier qui est mis en scène dans Index:

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

Pour toutes les options, consultez la page de manuel:

$ git difftool --help


Configuration de Visual Git Tool

Pour utiliser un outil visuel git autre que celui par défaut, utilisez l' -t <tool>option:

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

Ou, consultez la page de manuel difftool pour savoir comment configurer git pour utiliser un autre outil de diff visuel par défaut.


Exemples d' .gitconfigentrées pour vscode comme outil de diff / fusion

Une partie de la configuration d'un outil difft implique de modifier le .gitconfigfichier, soit via des commandes git qui le modifient en arrière-plan, soit en le modifiant directement.

Vous pouvez le trouver .gitconfigdans votre répertoire personnel, comme sous ~Unix ou normalement c:\users\<username>sous Windows).

Ou, vous pouvez ouvrir l'utilisateur .gitconfigdans votre éditeur Git par défaut avecgit config -e --global .

Voici des exemples d'entrées dans mon utilisateur global .gitconfigpour VS Code en tant qu'outil de diff et outil de fusion:

[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
la source
14

Pour la comparaison entre la zone de transfert et le référentiel (dernière validation)

 $git diff --staged

La commande compare vos $ git add fileNamemodifications staged ( ) à votre dernier commit. Si vous voulez voir ce que vous avez mis en scène qui ira dans votre prochain commit, vous pouvez utiliser git diff --staged. Cette commande compare vos modifications par étapes à votre dernier commit.

Pour la comparaison de travail et de mise en scène, utilisez

$ git diff 

La commande compare ce qui se trouve dans votre répertoire de travail avec ce qui se trouve dans votre zone de transit. Il est important de noter que git diff en lui-même n'affiche pas toutes les modifications apportées depuis votre dernier commit - uniquement les modifications qui ne sont toujours pas mises en scène. Si vous avez mis en scène toutes vos modifications ( $ git add fileName), git diff ne vous donnera aucune sortie.

De plus, si vous mettez en scène un fichier ( $ git add fileName) puis le modifiez, vous pouvez utiliser git diff pour voir les modifications du fichier qui sont mises en scène et les modifications qui ne le sont pas.

Goyal Vicky
la source
Msgstr "Pour la comparaison entre le travail et le référentiel $ git diff" . Je suis à peu près sûr de git diffcomparer entre Working vs Staging. Voir stackoverflow.com/a/1587952
wisbucky
8

Si vous avez l'intention de cibler par push une branche de dépôt à distance et que votre première passe dans un journal des modifications de validation était incomplète, vous pouvez corriger l'instruction de validation avant de pousser comme ceci.

Localement

... apportez quelques modifications ...

git diff # look at unstaged changes

git commit -am"partial description of changes"

... rappeler plus de changements non mentionnés dans commit ...

git diff origine / master # regarde les changements par étapes mais pas poussés

... modifier la déclaration de validation par étapes ...

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

git push
Marc Condon
la source
7

Si vous avez plus d'un fichier avec des modifications par étapes, il peut être plus pratique à utiliser git add -i, puis sélectionnez 6: diffet enfin choisissez le ou les fichiers qui vous intéressent.

Fred Schoen
la source
6

Par défaut, git diff est utilisé pour afficher les modifications qui ne sont pas ajoutées à la liste des fichiers mis à jour git. Mais si vous souhaitez afficher les modifications ajoutées ou échelonnées, vous devez fournir des options supplémentaires qui permettront à git de savoir que vous êtes intéressé par les fichiers échelonnés ou ajoutés 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 

Exemple

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

Une fois que vous avez ajouté les fichiers, vous ne pouvez pas utiliser la valeur par défaut de 'git diff'. Vous devez faire comme ceci: -

$ 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
la source
2

git guiet git-colasont des utilitaires graphiques qui vous permettent de visualiser et de manipuler l'index. Les deux comprennent des différences visuelles simples pour les fichiers intermédiaires et git-colapeuvent également lancer un outil de différence visuelle côte à côte plus sophistiqué.

Voir ma réponse étroitement liée à Comment supprimer un fichier de l'index dans git? , ainsi que ce catalogue officiel de Git - GUI Clients .

nobar
la source
0

Pensez également à l' gitkoutil, fourni avec git et très utile pour voir les changements

sam
la source