J'ai déplacé un fichier à l'aide de git mv
. Maintenant, je voudrais faire un diff sur le nouveau fichier pour le comparer avec l'ancien fichier (avec l'ancien nom, maintenant inexistant).
Comment puis-je faire cela?
Vous devez utiliser -M pour permettre à git de détecter automatiquement le fichier déplacé lorsque vous différez. Utiliser simplement git diff
comme l'a mentionné knittl ne fonctionne pas pour moi.
Donc simplement: git diff -M
devrait le faire.
La documentation de ce commutateur est la suivante:
-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
En plus de ce que knittl a écrit , vous pouvez toujours utiliser:
git diff HEAD:./oldfilename newfilename
où HEAD:./oldfilename
signifie oldfilename dans le dernier commit (dans HEAD), par rapport au répertoire courant.
Si vous n'avez pas assez de git, vous devrez utiliser à la place:
git diff HEAD:path/to/oldfilename newfilename
Avec git 2.9 (juin 2016), vous n'aurez pas à ajouter -M
plus. git diff
utilise -M
par défaut.
Voir commit 5404c11 , commit 9501d19 , commit a9276a6 , commit f07fc9e , commit 62df1e6 (25 février 2016) par Matthieu Moy (moy
) .
(Fusionné par Junio C Hamano - gitster
- in commit 5d2a30d , 03 avril 2016)
diff
: activerdiff.renames
par défautRenommer la détection est une fonctionnalité très pratique, et les nouveaux utilisateurs ne devraient pas avoir à fouiller dans la documentation pour en bénéficier.
Les objections potentielles à l'activation de la détection de renommage sont qu'elle échoue parfois et qu'elle est parfois lente. Mais la détection de renommage est déjà activée par défaut dans plusieurs cas comme "
git status
" et "git merge
", donc activerdiff.renames
ne change pas fondamentalement la situation. Lorsque la détection de renommage échoue, elle échoue désormais de manière cohérente entre "git diff
" et "git status
".Ce paramètre n'affecte pas les commandes de plomberie, par conséquent les scripts bien écrits ne seront pas affectés.
git diff -M
active la détection de renommage comme d'autres l'ont dit (et comme l'a souligné @VonC, il est activé par défaut depuis git 2.9). Mais si vous avez un grand ensemble de modifications, la détection de renommage inexacte peut toujours être désactivée. Git affichera un avertissement comme celui-ci, qui est facile à manquer au milieu du diff que vous consultez:
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.
Dans ce cas, définissez l'option de configuration comme suggéré par git, par exemple
git config diff.renamelimit 450
et réexécutez votre commande diff.
Pour une raison quelconque, en utilisant HEAD:./oldfilename
(ou chemin absolu) ne fonctionnait pas pour moi, mais HEAD:oldfilename
did (merci cmn):
git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename
HTH