web-dev-qa-db-fra.com

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

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?

118
dr jerry

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

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), 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
75
Jakub Narębski

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

Renommer 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 activer diff.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.

Les nouveaux tests pour cette fonctionnalité sont ici .

18
VonC

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.

1
mindriot

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

1
Oli Studholme