97 votes

Quelle est la différence entre git diff HEAD et git diff --staged ?

Quelle est la différence entre git diff HEAD y git diff --staged ? J'ai essayé les deux mais les deux donnent le même résultat.

136voto

Carlos Campderrós Points 6055

Supposons que cette sortie pour 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
#

Comme vous le voyez, un fichier a été modifié mais n'est pas prêt à être livré, et un nouveau fichier a été ajouté et est prêt à être livré.

git diff --staged ne montrera que les changements apportés aux fichiers dans la zone "staged".

git diff HEAD montrera toutes les modifications apportées aux fichiers suivis. Si vous avez tous les changements mis en scène pour la livraison, alors les deux commandes auront le même résultat.

77voto

premraj Points 120
  • git diff Voir la différence entre Stage et Working Directory
  • git diff --staged Voir la différence entre HEAD et Stage
  • git diff HEAD Voir la différence entre HEAD et Working Directory

enter image description here
src img

  • HEAD est une référence au dernier commit de la branche actuellement extraite.
  • La zone de transit, la scène et l'index ont tous la même signification.
  • Les changements non structurés existent dans notre Répertoire de travail mais Git ne les a pas encore enregistrés dans son historique de versions.
  • Les changements staged ressemblent beaucoup aux changements unstaged, sauf qu'ils ont été marqués pour être livrés la prochaine fois que vous exécuterez git commit.

9voto

VonC Points 414372

Vous pourrez voir plus facilement la différence entre les deux différences avec la prochaine version (Git 2.3.4+, Q2 2015). git status -v -v

Véase commettre 4055500 de Michael J Gruber mjg il explique bien la différence entre git diff HEAD y git diff --staged :

commit / status : afficher la différence entre l'arbre de travail et l'index avec -v -v

git commit y git status en format long, montrer la différence entre HEAD et l'index lorsqu'il est donné -v . Cela permet prévisualisation d'un commit à faire .

Ils listent également les fichiers suivis avec des changements non indexés, mais sans diff.

Introduire ' -v -v qui montre la différence entre l'index et l'arbre de travail. arbre de travail en outre au HEAD indice diff. Cela permet à un examen des changements non indexés qui pourraient être manquants dans la livraison. .

Dans le cas de ' -v -v ', lignes d'en-tête supplémentaires

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

sont insérés avant les diffs, qui sont égaux à ceux de la partie statut ; ces derniers sont précédés de 50*". - "pour le faire ressortir davantage.

2voto

dave_k_smith Points 108

Une autre différence de cas limite : Dans un repo git nouvellement créé, où seulement git init a été exécuté jusqu'à présent, git diff HEAD entraînera une erreur fatale (argument ambigu 'HEAD') alors que git diff --staged ne produira aucun résultat.

1voto

Bimme Points 127

Vous pouvez également obtenir des résultats différents des deux commandes diff si vous les exécutez sur une fusion non réussie, c'est-à-dire sur des chemins non fusionnés.

Je n'ai pas réussi à trouver la raison pour laquelle il se comporte ainsi, mais vous pouvez en lire plus à ce sujet aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X