142 votes

Impossible de supprimer les modifications dans Git

Après avoir vu ce qui suit sur la ligne de commande :

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

J'essaie d'annuler mes modifications en tapant la commande :

git checkout -- index.htm

mais quand je relance git status, c'est exactement la même chose. Le checkout ne semble pas fonctionner. Est-ce que je fais quelque chose de mal ? J'utilise GIT 1.6.1.2 sous Windows/cygwin.

# On branch RB_3.0.10
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   index.htm

76voto

Frank Martin Points 689

Cela me dérange depuis un certain temps, presque tous les repo que je vérifiais avaient des modifications que je ne pouvais pas supprimer. Pour faire court, j'ai essayé tout ce qui précède, mais rien n'a fonctionné. Voici ce que j'ai fait pour que les choses reviennent à la normale (sur un Mac) :

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard

44voto

Nianliang Points 574

Voici mon expérience, définissez les variables suivantes dans .git/config :

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

puis exécutez $ git checkout HEAD . et ça marche, mais $ git checkout -- . non, étrange !

* version git 1.9.3

36voto

1800 INFORMATION Points 55907

Quels sont les changements que git diff sur le dossier ? Sous Windows, j'ai vu des problèmes de fin de ligne causer des problèmes comme celui-ci. Dans ce cas, regardez quels paramètres vous avez pour git config core.autocrlf y git config core.safecrlf . Il y a quelques documentation pour ces paramètres ici .

Je dirais que, si vous utilisez git svn pour l'intégration avec subversion, alors faites en sorte que autocrlf est désactivé. D'après ce que je peux dire, cette configuration est tout simplement cassée et la plupart des outils pensent que les fichiers ont été modifiés, alors que vous avez fait un checkout pour annuler les changements.

Si vous rencontrez un problème où vous faites git checkout et ensuite git status montre que le fichier est toujours modifié, et git diff si le fichier est modifié sur chaque ligne du fichier, alors c'est le problème que vous rencontrez.

core.autocrlf

Si vrai, fait en sorte que git convertisse les CRLF à la fin des lignes dans les fichiers texte en LF. lors de la lecture depuis le système de fichiers, et convertir en inverse lors de l'écriture dans le système de fichiers. La variable peut être définie à input, auquel cas la conversion se produit uniquement lors de la lecture du système de fichiers, mais les fichiers sont écrits avec LF à la fin des lignes. Actuellement, quels sont les chemins à considérer "texte" (c'est à dire être soumis au mécanisme mécanisme autocrlf) est décidé purement purement basé sur le contenu.

core.safecrlf

Si vrai, fait en sorte que git vérifie si la conversion des CRLF comme contrôlé par core.autocrlf est réversible. Git va vérifiera si une commande modifie un fichier dans l'arbre de travail soit directement ou indirectement. Par exemple, commiter un fichier suivi d'un check out du même fichier même fichier devrait donner le fichier original dans l'arbre de travail. Si ce n'est pas le cas pour la configuration actuelle de core.autocrlf, git rejettera le fichier. La variable peut être définie à "warn", dans ce cas git ne fera que avertir d'une conversion irréversible mais continuera l'opération. ...

25voto

hasenj Points 36139

Je pense que vous devez passer -f

À partir de la page de manuel ( man git-checkout , GIT-CHECKOUT(1)) :

-f, --force
Continuez même si l'index ou l'arbre de travail diffère de HEAD.
Ceci est utilisé pour jeter les changements locaux .

Par exemple, écarter les changements sur la branche actuelle et passer à une autre branche :

git checkout -f master

14voto

Eyal Points 1106

Il peut s'agir des fins de ligne, comme le suggère @1800-information, mais une autre possibilité est que la différence (qui vous empêche de rétablir ces fichiers avec une commande checkout) est un mode de fichier. C'est ce qui m'est arrivé. Sur ma version de git, vous pouvez découvrir cela en utilisant

git diff index.htm

Et cela vous montrera les changements de mode de fichier. Cependant, il ne vous permettra toujours pas de les rétablir en utilisant checkout, même avec l'option -f. Pour cela, utilisez soit

git config core.filemode false

ou changez votre git .config dans votre éditeur de texte en ajoutant

[core]

filemode = false

Après avoir fait cela, vous pouvez utiliser

git reset HEAD index.htm

et le fichier devrait disparaître.

(J'ai tiré tout cela des réponses aux questions suivantes Comment faire pour que git ignore les changements de mode (chmod) ? y updating-file-permissions-only-in-git )

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