web-dev-qa-db-fra.com

Fichier git diff contre son dernier changement

Est-il possible d’obtenir que git produise un diff entre un fichier spécifique tel qu’il existe maintenant et tel qu’il existait avant le dernier commit qui l’a modifié?

Autrement dit, si nous savons:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

Ensuite, git diff 456def myfile affiche la dernière modification apportée à mon fichier. Est-il possible de faire la même chose sans la connaissance produite par le git log; Qu'est-ce qui a changé dans 123abc?

212
Chowlett

Cela existe, mais c'est en fait une fonctionnalité de git log:

git log -p [--follow] [-1] <path>

Notez que -p peut également être utilisé pour afficher le diff en ligne à partir d'un seul commit:

git log -p -1 <commit>

Options utilisées:

  • -p (également -u ou --patch) est masqué deeeeeeeep dans la page de manuel git-log et constitue en fait une option d'affichage pour git-diff. Utilisé avec log, il affiche le patch qui serait généré pour chaque commit , ainsi que les informations de commit - et masque les validations qui ne touchent pas le <path> spécifié. (Ce comportement est décrit dans le paragraphe relatif à --full-diff, ce qui entraîne l'affichage du diff complet de chaque validation.)
  • -1 affiche seulement la dernière modification apportée au fichier spécifié (-n 1 peut être utilisé à la place de -1); sinon, tous les diffs de zéro de ce fichier sont affichés.
  • --follow est requis pour voir les modifications survenues avant un changement de nom.

Autant que je sache, c’est le seul moyen de voir immédiatement les dernières modifications apportées à un fichier sans utiliser git log (ou similaire) pour compter le nombre de révisions intervenues ou déterminer le hachage du commit. .

Pour voir les modifications de révisions plus anciennes, faites simplement défiler le journal ou spécifiez une validation ou une balise à partir de laquelle démarrer le journal. (Bien entendu, la spécification d'une validation ou d'une balise vous ramène au problème initial consistant à déterminer quelle est la bonne validation ou balise.)

Crédit lorsque le crédit est dû:

  • J'ai découvert log -p grâce à cette réponse .
  • Merci à FranciscoPuga et cette réponse pour m'avoir montré l'option --follow.
  • Nous remercions ChrisBetti d'avoir mentionné l'option -n 1 et atatko d'avoir mentionné la variante -1.
  • Merci à sweaver2112 de m'avoir fait lire la documentation et déterminer ce que -p "signifie" sémantiquement.
185
Kyle Strand

Une des manières d’utiliser git diff est:

git diff <commit> <path>

Et une manière courante de faire référence à un commit du dernier commit est d'utiliser un chemin relatif vers le HEAD réel. Vous pouvez référencer les commits précédents en tant que HEAD ^ (dans votre exemple, il s'agira de 123abc) ou HEAD ^^ (456def dans votre exemple), etc ...

Donc, la réponse à votre question est la suivante:

git diff HEAD^^ myfile
209
Francisco Puga

Si vous utilisez un outil graphique, cela fonctionne très bien:

gitk <file>

gitk affiche maintenant tous les commits où le fichier a été mis à jour. Marquer un commit vous montrera le diff par rapport au commit précédent de la liste. Cela fonctionne également pour les répertoires, mais vous devez également sélectionner le fichier à comparer pour le commit sélectionné. Super utile!

6
Martin G