143 votes

Comment faire un git diff sur un fichier déplacé/renommé ?

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 ?

4 votes

Bientôt (git 2.9, juin 2016), une simple git diff -- yourRenamedFile sera suffisant. Voir ma réponse ci-dessous

0 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).

151voto

Zitrax Points 3443

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.

7 votes

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 ?

7 votes

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.

1 votes

Ç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 .

103voto

Jakub Narębski Points 87537

En plus de ce que knittl a écrit vous pouvez toujours utiliser :

git diff HEAD:./oldfilename newfilename

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

10 votes

Merci pour cela. Vous pouvez également spécifier un commit spécifique à la place de head, c'est à dire git diff 39fa7c77e85c51d43ea0cf30d33aec8721812e9e:./oldfilename newfilename

10 votes

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

0 votes

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.

21voto

VonC Points 414372

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 : activer diff.renames par défaut

La 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 de diff.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.

Les nouveaux tests pour cette fonctionnalité sont ici .

4voto

Boblet Points 1148

Pour une raison quelconque, utiliser HEAD:./oldfilename (ou chemin absolu) n'a pas fonctionné pour moi, mais HEAD:oldfilename a fait (merci cmn) :

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

HTH

0 votes

Peut-être que votre git est trop vieux pour comprendre HEAD:./oldfilename ?

1 votes

Il s'agit de la réponse la plus générale disponible ici. -M ne semble pas fonctionner si le fichier a été trop modifié.

1voto

mindriot Points 41

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.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