413 votes

Comment faire la différence entre un fichier et une version arbitraire dans Git ?

Comment puis-je différencier un fichier, par exemple pom.xml de la branche principale à une ancienne version arbitraire dans Git ?

441voto

Mark Longair Points 93104

Vous pouvez le faire :

git diff master~20:pom.xml pom.xml

... pour comparer votre pom.xml à celui de master Il y a 20 révisions par le premier parent. Vous pouvez remplacer master~20 bien sûr, avec le nom de l'objet (SHA1sum) d'un commit ou de n'importe quel autre commit. de nombreuses autres façons de spécifier une révision .

Notez qu'il s'agit en fait de comparer l'ancien pom.xml à la version de votre arbre de travail, et non pas à la version validée dans la base de données de l'UE. master . Si vous voulez cela, vous pouvez faire ce qui suit à la place :

git diff master~20:pom.xml master:pom.xml

22 votes

Notez que cela ne fonctionne pas seulement pour les fichiers, mais aussi pour les (sous-)répertoires, par exemple git diff <revision>:foo/ HEAD:foo/ .

2 votes

Notez également que sous Windows, vous devez utiliser des slashs avant pour les répertoires si vous utilisez un spécificateur de révision ou git vous donnera une erreur sur le fichier/répertoire qui n'existe pas dans cette révision.

1 votes

@DylanNissley ou il ne vous donnera aucune erreur et aucune différence. C'est ce que je vois. Quoi qu'il en soit, je vous remercie pour l'astuce consistant à utiliser des barres obliques avant au lieu de barres obliques arrière.

185voto

Benjamin Pollack Points 10458
git diff <revision> <path>

Par exemple :

git diff b0d14a4 foobar.txt

0 votes

ne fonctionne pas pour la version 1.7.11 si le fichier n'est pas dans le répertoire courant. Exemple : 'git diff f76d078 test/Config' donne "error : Impossible d'accéder à 'test/f76d078'".

2 votes

@user1663987 passez simplement un chemin complet relatif à la racine du projet : git diff <revision> root/path/file .

1 votes

test/Config est relatif à la racine (comme dans test est un sous-répertoire de la racine). Mais votre exemple Root/path/file semble INCLURE la racine ?

58voto

Gerardo Points 959

Si vous voulez voir la différence entre le dernier commit d'un seul fichier, vous pouvez le faire :

git log -p -1 filename

Cela vous donnera le diff du fichier dans git, n'est pas la comparaison de votre fichier local.

2 votes

cela ne renvoie rien

0 votes

@AndreiCristianProdan Alors vous n'avez aucun changement à faire. Vous pouvez incrémenter le -1 étape par étape jusqu'à ce que vous obteniez les changements.

0 votes

C'est très bien. J'ai créé une fonction bash qui pourrait être utile : gitlog () { git log -${3:-p} -${2:-1} $1; } Utilisé comme : gitlog Rakefile ou gitlog Rakefile 5 et gitlog Rakefile 10 s . La première montre une différence ; la deuxième montre cinq différences ; la troisième montre dix différences. --no-patch .

47voto

Juampy Points 767

Pour voir ce qui a été modifié dans un fichier lors du dernier commit :

git diff HEAD~1 path/to/file

Vous pouvez changer le numéro (~1) pour le n-ième commit avec lequel vous voulez faire la différence.

0 votes

Cette réponse n'est en fait qu'un cas spécifique de cette réponse plus généraleHEAD~1 est substitué à <revision> ce qui fait de cette réponse un doublon.

2 votes

Cela ne fonctionne pas ! fatal : argument ambigu 'HEAD~1' : révision inconnue ou chemin ne se trouvant pas dans l'arbre de travail. Utilisez '--' pour séparer les chemins des révisions.

0 votes

Cette réponse est simple et fonctionnelle pour moi.

10voto

user2481778 Points 1

git diff -w HEAD origin/master path/to/file

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