J'ai déplacé un fichier en utilisant 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 dois-je m'y prendre ?
J'ai déplacé un fichier en utilisant 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 dois-je m'y prendre ?
Vous devez utiliser -M pour permettre à git de détecter automatiquement le fichier déplacé lors de la comparaison. En utilisant seulement git diff
comme l'a mentionné knittl ne fonctionne pas pour moi.
Tout simplement : git diff -M
devrait le faire.
La documentation pour ce commutateur est :
-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.
Sauveur de vies ! Mes diffs git sont tellement mieux maintenant. 1) Est-il prudent de toujours utiliser cette option ? 2) Puis-je ajouter cette option en tant que comportement par défaut à mes fichiers ~/.gitconfig
?
Notez que la détection des renommages ne fonctionne que lorsque les anciens et les nouveaux fichiers apparaissent dans la collection de fichiers traités par l'application git diff
. Exécuter git diff -M
sur un seul fichier (renommé) ne rapporte pas le renommage.
Ça ne marche pas pour moi, mais git log --follow -- file_after_move.txt
fonctionne bien. Il affiche l'historique complet, y compris avant le déménagement. Avez-vous des idées ? J'exécute git version 2.11.0.windows.1
.
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), relatif au répertoire courant.
Si vous ne disposez pas de git suffisamment récent, vous devrez utiliser à la place :
git diff HEAD:path/to/oldfilename newfilename
Merci pour cela. Vous pouvez également spécifier un commit spécifique à la place de head, c'est à dire git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename
Au cas où ce ne serait pas clair, vous pouvez également spécifier des noms de branches ou toute autre référence, par exemple : git diff branch:old/filen.name newfilename
Le premier formulaire fonctionne pour moi, si vous cd
dans le répertoire et n'ajoutez pas --
avant le commit:path
paire. Git semble être très pointilleux sur la syntaxe ici.
Avec git 2.9 (juin 2016), vous n'aurez plus besoin d'ajouter -M
plus. git diff
utilise -M
par défaut.
Voir commettre 5404c11 , commettre 9501d19 , commettre a9276a6 , commettre f07fc9e , commettre 62df1e6 (25 février 2016) par Matthieu Moy ( moy
) .
(fusionné par Junio C Hamano -- gitster
-- sur commettre 5d2a30d , 03 avril 2016)
diff
: activerdiff.renames
par défautLa détection des renommages est une fonctionnalité très pratique, et les nouveaux utilisateurs ne devraient pas avoir à creuser dans la documentation pour en bénéficier. ne devraient pas avoir à fouiller dans la documentation pour en bénéficier.
Les objections potentielles à l'activation de la détection des renommages sont qu'elle parfois échouer, et qu'elle est parfois lente. Mais la détection des renommages est déjà activée par défaut dans plusieurs cas comme "
git status
" et "git merge
", donc l'activation dediff.renames
ne change pas fondamentalement la situation. Lorsque la détection du renommage échoue, elle échoue maintenant 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 bien écrits ne seront pas affectés.
git diff -M
active la détection des renommages comme d'autres l'ont dit (et comme @VonC l'a souligné, elle est activée par défaut depuis git 2.9). Mais si vous avez un grand changeset, la détection de renommage inexacte peut encore être désactivée. Git affichera un avertissement comme le suivant, qui est facile à manquer au milieu du diff que vous visualisez :
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.
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.
4 votes
Bientôt (git 2.9, juin 2016), une simple
git diff -- yourRenamedFile
sera suffisant. Voir ma réponse ci-dessous0 votes
@VonC ne devez-vous pas toujours inclure l'ancien et le nouveau nom de fichier ?
0 votes
@TTT Pas quand on fait un diff au niveau de l'arbre ou du commit (au lieu du fichier lui-même).