266 votes

'git status' montre les fichiers modifiés, mais 'git diff' ne les montre pas.

J'ai examiné toutes les questions similaires. Cependant, j'ai revérifié et quelque chose d'étrange se passe définitivement.

Sur un serveur (Solaris avec Git 1.8.1), j'ai cloné le dépôt Git puis j'ai copié le dossier .git dans mes fichiers en direct existants. Cela a parfaitement fonctionné, je pouvais exécuter

git status

puis

git diff [nom du fichier]

pour vérifier les fichiers qui étaient différents.

Sur un autre serveur (Solaris avec Git 1.7.6), je fais exactement la même chose cependant

git diff [nom du fichier]

ne montre rien, même si le contenu du fichier est définitivement différent. J'ai également testé en ajoutant un nouveau fichier, en le validant, puis en l'éditant. Le même problème, git status montre que le fichier a été modifié, mais git diff n'affiche rien. Si je télécharge le fichier modifié et que j'exécute un diff localement, j'obtiens une sortie diff.

15 votes

Est-il dans votre index? Si oui, vous pouvez voir la différence avec git diff --cached.

4 votes

git diff --cached me donne également une sortie vide.

0 votes

git log ne donne également aucun résultat.

133voto

Frozen Spider Points 2369

Pour moi, cela avait quelque chose à voir avec les autorisations de fichier. Quelqu'un avec Mac/Linux sur mon projet semble commettre des fichiers avec des autorisations non par défaut que mon client Git Windows n'a pas pu reproduire.

La solution pour moi a été de dire à Git d'ignorer les autorisations de fichier :

git config core.fileMode false

Autre information : Comment puis-je faire en sorte que Git ignore les changements de mode de fichier (chmod) ?

1 votes

Cela a résolu un problème que j'avais avec un tas de fichiers, bien que je pense que c'était avec l'heure de création/modification du fichier.

0 votes

Cela a résolu le problème pour moi. La valeur fileMode semble être par défaut true sur les volumes Mac/Linux et false sur les volumes Windows. J'ai déplacé un projet de Mac à Windows et il a fallu le passer à false.

2 votes

Cela a également été utile si vous utilisez VSCode à l'aide d'un conteneur Docker qui monte votre répertoire sur Windows 10. À l'extérieur du conteneur, la vérification du statut git montre correctement que vous n'avez pas modifié de fichiers. Mais si vous vérifiez le statut git à l'intérieur du conteneur, il montre que les fichiers ont été modifiés. Exécuter la commande ci-dessus à l'intérieur du conteneur a résolu mon problème.

108voto

Adrian Mann Points 2393

J'ai ajouté le fichier à l'index:

git add nom_fichier

Ensuite, j'ai exécuté :

git diff --cached nom_fichier

Vous pouvez consulter la description de git diff ici.

Si vous avez besoin d'annuler votre git add, veuillez consulter ici: Comment annuler 'git add' avant le commit?

1 votes

Peut-être que git diff se souvient du contenu précédent même si vous avez modifié ce fichier et git add le rafraîchira.

0 votes

Cela a fonctionné pour moi, mais je ne suis toujours pas sûr de ce que fait --cached en lisant ce document.

76voto

cmccabe Points 718

Il existe plusieurs raisons pour lesquelles git status peut montrer une différence mais git diff ne le fait pas.

  • Le mode (bits de permission) du fichier a changé - par exemple, de 777 à 700.

  • Le style de saut de ligne a changé de CRLF (DOS) à LF (UNIX)

La manière la plus simple de découvrir ce qu'il s'est passé est d'exécuter git format-patch HEAD^ et voir ce que le patch généré indique.

14 votes

Si des changements de permissions de fichiers sont appliqués : git config core.filemode false pour ignorer les permissions des fichiers

0 votes

Comment avez-vous découvert que le changement de saut de ligne de CRLF à LF est l'une des situations où git status affichera une différence et git diff non?

1 votes

Avoir des collègues qui utilisent Windows vous aidera à découvrir toutes sortes de choses amusantes sur les fins de ligne. Je pense qu'il pourrait y avoir des cas où "git diff" montre le changement de CRLF à LF, cependant - cela dépend probablement de votre configuration. Je n'ai pas travaillé avec Windows depuis un moment, donc je ne sais pas à quoi ressemblent les valeurs par défaut maintenant.

55voto

Jaakko Points 1355

J'ai eu un problème où des centaines de fins de ligne ont été modifiées par un programme et git diff a listé tous les fichiers source comme modifiés. Après avoir corrigé les fins de ligne, git status indiquait toujours que les fichiers étaient modifiés.

J'ai pu résoudre ce problème en ajoutant tous les fichiers à l'index puis en réinitialisant l'index.

git add -A
git reset

core.filemode était défini sur false.

1 votes

Merci! Ça a fonctionné à merveille!

6 votes

J'ai résolu avec git add --renormalize ., voir ma réponse ci-dessous.

0 votes

J'ajoute git restore . pour ne pas polluer l'index.

40voto

Stefano M Points 850

Comme déjà noté dans une réponse précédente, cette situation peut survenir en raison de problèmes de fins de ligne (CR/LF vs. LF). J'ai résolu ce problème (sous Git version 2.22.0) avec cette commande :

git add --renormalize .

Conformément au manuel :

       --renormalize
           Applique le processus de "nettoyage" à nouveau à tous les fichiers suivis pour les ajouter de force de nouveau à l'index. C'est utile après avoir modifié la configuration core.autocrlf ou l'attribut de texte afin de corriger les fichiers ajoutés avec des fins de ligne CRLF/LF incorrectes. Cette option implique -u.

4 votes

C'est la nouvelle meilleure réponse.

0 votes

Aucune réinitialisation nécessaire pensez.

0 votes

@Timo oui, ces commandes devraient fonctionner sans avoir besoin d'un git reset par la suite.

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