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 changé?
Autrement dit, si nous savons:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
git diff 456def myfile
Affiche ensuite la dernière modification de mon fichier. Il est possible de faire de même sans les connaissances produites par le git log
; qu'est-ce qui a changé dans 123abc?
git diff HEAD^ <file_path>
HEAD^
est123abc
,HEAD^^
est456def
; et s'il y avait d'autres commits qui n'ont pas affecté ce fichier, il yHEAD^
fait référence)Réponses:
Cela existe, mais c'est en fait une caractéristique de
git log
:Notez que
-p
peut également être utilisé pour afficher la différence en ligne à partir d'un seul commit:Options utilisées:
-p
(également-u
ou--patch
) est masqué deeeeeeeep dans lagit-log
page de manuel et est en fait une option d'affichage pourgit-diff
. Lorsqu'il est utilisé aveclog
, il affiche le correctif qui serait généré pour chaque validation , ainsi que les informations de validation, et masque les validations qui ne touchent pas le spécifié<path>
. (Ce comportement est décrit dans le paragraphe sur--full-diff
, ce qui provoque l'affichage du diff complet de chaque commit.)-1
affiche uniquement la modification la plus récente du fichier spécifié (-n 1
peut être utilisé à la place de-1
); sinon, toutes les différences non nulles de ce fichier sont affichées.--follow
est requis pour voir les changements survenus avant un changement de nom.Pour autant que je sache, c'est le seul moyen de voir immédiatement le dernier ensemble de modifications apportées à un fichier sans utiliser
git log
(ou similaire) pour compter le nombre de révisions intermédiaires 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 sûr, la spécification d'une validation ou d'une balise vous ramène au problème d'origine de déterminer quelle est la bonne validation ou la bonne balise.)
Crédit lorsque le crédit est dû:
log -p
grâce à cette réponse .--follow
option.-n 1
option et atatko d'avoir mentionné la-1
variante.-p
«signifie» sémantiquement.la source
git log -p filename
-n 1
paramètre.git log -p -n 1 filename
-n 1
peut également être remplacé par-1
, cela ne change pas le résultat je préfère juste la syntaxe:git log -p -1 filename
git log -p -1 --skip=1 <path>
pour afficher le deuxième commit.L'une des façons d'utiliser git diff est:
Et une façon courante de référencer un commit du dernier commit est un chemin relatif vers le HEAD réel. Vous pouvez référencer les validations précédentes comme HEAD ^ (dans votre exemple, ce sera 123abc) ou HEAD ^^ (456def dans votre exemple), etc ...
La réponse à votre question est donc:
la source
HEAD^
, mais bien sûr, cela n'a rien produit. Je n'ai pas pensé à essayerHEAD^^
.HEAD~2
HEAD^^ myfile
fera réellement référence à l'avant-dernier commit qui a changémyfile
; il fera référence à l'avant-dernier commit global. Existe-t-il un moyen de spécifier «Je veux voir la dernière modification apportée à ce fichier» sans spécifier (une partie de) le hachage de validation ou compter le nombre de validations entre la dernière modification apportée à ce fichier et la révision actuelle?git log -p
c'est assez proche.Si vous êtes bien en utilisant un outil graphique, cela fonctionne très bien:
gitk affiche maintenant toutes les validations où le fichier a été mis à jour. Marquer un commit vous montrera le diff par rapport au commit précédent dans la liste. Cela fonctionne également pour les répertoires, mais vous pouvez également sélectionner le fichier à différencier pour le commit sélectionné. Super utile!
la source
git difftool HEAD^ file
ougit difftool -d HEAD^ path