Impossible de supprimer les modifications dans Git

125

Après avoir vu ce qui suit à partir de 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'essaye d'annuler mes modifications en tapant la commande:

git checkout -- index.htm

mais quand je réexécute git status, il a exactement la même apparence. La caisse ne semble pas fonctionner. Est-ce que je fais quelque chose de mal? J'utilise GIT 1.6.1.2 sur 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
Eyal
la source
4
Est-ce que git checkout HEAD -- index.htm(extraire à partir du dernier état validé, au lieu de récupérer à partir de l'index) fonctionne?
Jakub Narębski
3
git checkout HEAD -- index.htmtravaillé pour moi!
Ben Tideswell

Réponses:

52

Cela me dérange depuis un certain temps, presque tous les dépôts que j'ai vérifiés avaient des modifications que je ne pouvais pas annuler. Pour faire court, j'ai essayé tout ce qui précède, 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
Frank Martin
la source
7
Après avoir tout essayé ci-dessus, c'est la seule chose qui a fonctionné pour moi (sous Windows)
Anders
Je vous remercie! Comme Anders l'a dit, cette solution fonctionne aussi pour moi. J'ai remplacé autocrlf par # autocrlf
David
37

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 cela fonctionne. mais$ git checkout -- . non, étrange!

* git version 1.9.3

Nianliang
la source
35

Quels changements git diffapparaissent sur le fichier? Sur Windows, j'ai vu des problèmes avec les fins de ligne provoquant des problèmes comme celui-ci. Dans ce cas, regardez les paramètres dont vous disposez pour git config core.autocrlfet git config core.safecrlf. Il y a de la documentation pour ces paramètres ici .

Je dirais que si vous utilisez git svnpour l'intégration avec subversion, assurez-vous qu'il autocrlfest désactivé. D'après ce que je peux dire, il est juste cassé dans cette configuration et cela fait penser à la plupart des outils que les fichiers ont été modifiés, lorsque vous avez fait uncheckout pour annuler les modifications.

Si vous rencontrez un problème là où vous le faites git checkout, puis git statusaffichez que le fichier est toujours modifié et git diffaffichez que le fichier est modifié sur chaque ligne du fichier, c'est le problème que vous rencontrez.

core.autocrlf

Si true, rend git convertit CRLF à la fin des lignes dans les fichiers texte en LF lors de la lecture à partir du système de fichiers, et convertit en sens inverse lors de l'écriture dans le système de fichiers. La variable peut être définie sur input, auquel cas la conversion se produit uniquement lors de la lecture à partir du système de fichiers mais les fichiers sont écrits avec LF à la fin des lignes. Actuellement, les chemins à considérer comme "texte" (c'est-à-dire soumis au mécanisme autocrlf) sont décidés uniquement en fonction du contenu.

core.safecrlf

Si c'est vrai, git vérifie si la conversion de CRLF contrôlée par core.autocrlf est réversible. Git vérifiera si une commande modifie un fichier dans l'arborescence de travail directement ou indirectement. Par exemple, la validation d'un fichier suivie de l'extraction du même fichier doit produire le fichier d'origine dans l'arborescence de travail. Si ce n'est pas le cas pour le paramètre actuel de core.autocrlf, git rejettera le fichier. La variable peut être définie sur "warn", auquel cas git avertira uniquement d'une conversion irréversible mais continuera l'opération. ...

1800 INFORMATIONS
la source
core.autocrlf = true core.safecrlf n'a pas été défini. Doit-il être défini sur true pour Windows? Quelle est la différence entre les deux?
Je dirais, laissez-les tous les deux désactivés SI vous utilisez git svn. J'ai ajouté quelques détails supplémentaires.
1800 INFORMATION
4
Je suppose qu'il veut le faire pivoter d'au moins 90 degrés
vijrox
2
Lorsque j'ai défini à la fois core.autocrlf et core.safecrlf sur true, j'ai pu ignorer les modifications détectées dans les fichiers incriminés en exécutant 'git reset --hard HEAD'.
Aleksey
19

Je pense que tu dois passer -f

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

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

Par exemple, annulez les modifications sur la branche actuelle et passez à une autre branche:

git checkout -f master
hasen
la source
7
Passer -f à quoi? Ce serait bien de rendre la réponse complète
PandaWood
@Matt mon intention n'était pas de commander une autre branche. La réponse est de 2009 , donc je ne pense que je me souviens pas vraiment mais à en juger par la question, je voulais passer -fà la caisse - <nom du fichier> commegit checkout -f -- filename
Hasen
@hasen Les trois commentaires que vous aviez demandaient des éclaircissements, c'est pourquoi j'ai ajouté le "par exemple". L'exemple n'exclut pas d'autres utilisations de-f
Matt H
A travaillé pour moi. git checkout -f masterjeté "Déjà sur 'maître'" mais les changements ont disparu.
Christian
12

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

git diff index.htm

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

git config core.filemode false

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

[coeur]

filemode = false

Après avoir fait cela, vous pouvez utiliser

git reset HEAD index.htm

et le fichier devrait disparaître.

(J'ai obtenu tout cela dans les réponses à Comment faire pour faire ignorer les changements de mode git (chmod)? Et mettre à jour les autorisations de fichier uniquement dans git )

Eyal
la source
Merci beaucoup! Aucune des autres suggestions n'a fonctionné pour moi pour me débarrasser des changements de mode de fichier.
Thorkil Værge
6

Êtes-vous sur OSX ou Windows? Si tel est le cas, le problème est probablement d'avoir deux fichiers du même nom, avec une casse différente. par exemple. index.htm et Index.htm

Windows, et par défaut OSX, utilise un système de fichiers insensible à la casse, qui entre en conflit avec le git sensible à la casse.

Fil
la source
2

J'ai eu ce problème et après avoir essayé tout ce qui précède, rien n'a fonctionné.

Ce qui a fonctionné pour moi, c'est de supprimer le répertoire dans lequel se trouvait le fichier, puis de faire git statuset de s'assurer que tous les fichiers de ce répertoire sont désormais marqués comme supprimés. Après cela, je l'ai simplement fait git checkout -fet tout était revenu à la normale.

Eldar
la source
1

Je travaillais sur un libGDXprojet Android Studioet je voulais abandonner tous les changements que j'ai faits, et rien ne fonctionnait pour moi, la solution que j'ai trouvée était de valider tous les changements dans une nouvelle branche

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

puis vous pouvez supprimer la TRASHbranche si vous le souhaitez.

Waqleh
la source
1

J'ai eu le même problème, rien des commentaires ci-dessus n'a fonctionné. Il s'est avéré que mon système de fichiers n'est pas sensible à la casse (osx par défaut, mais Windows se comporte probablement de la même manière) et qu'un fichier était présent avec des majuscules et des minuscules dans le même répertoire, avec un contenu différent. Puisque sur mon ordinateur les deux noms pointaient vers le même fichier, l'état de git montrait toujours une modification, quoi que je fasse. Pour résoudre le problème:

  • J'ai dû supprimer l'un des fichiers d'un autre ordinateur et le pousser vers le repo

  • supprimer complètement la version locale entière

  • faire git cloner à partir de zéro

Joe
la source
0

J'ai eu un problème similaire, où cela ne me permettrait pas de supprimer des fichiers qui n'existent pas ou qui ont été modifiés. J'utilise Visual Studio au travail et j'ai constaté que cela se produit lors du changement de branche pendant que l'application est en cours d'exécution.

git checkoutet essayer de se débarrasser n'a pas aidé. Cela ne marcherait pas ou cela me dirait simplement que je n'ai pas la permission.

Solution qui a fonctionné:

  1. Passez en mode sans échec
  2. Supprimer les fichiers

Redémarrer est une douleur, mais cela a fonctionné plus rapidement que d'essayer 100 choses.

Gene Parcellano
la source
0

Il existe une solution simple. Si cela se produit (normalement à cause d'un arrêt inattendu de Windows ou d'un vidage de la mémoire) et que vous ne pouvez pas annuler vos modifications et même basculer entre les branches (Git dit que vous n'avez pas assez d'autorisations); dans l' Windowsenvironnement à show all hidden files and folderspartir des options de dossier. Accédez à votre répertoire GIT (devrait commencer par .git) et supprimez le "index.lock"fichier. Ensuite, Git devrait vous laisser faire ce que vous voulez.

Mahib
la source
0

J'ai fini par faire un git stashsuivi d'un git stash cleanpour m'en débarrasser. Je n'ai vu aucune configuration auto cr / lf dans .git / ou ~ / .git.

Matt H
la source
0

Dans mon cas, je ne pouvais pas annuler les modifications liées à un répertoire. par exemple, quand j'exécutais un git diff, je verrais ceci: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

J'ai donc appelé ce répertoire et y ai exécuté un statut git. Il était dans un état HEAD détaché. Et puis j'ai juste couru un git checkout masterlà-dedans. Cela a arrangé les choses pour moi. Mais cela n'est pas utile pour le scénario exact demandé ici.

Sheetal Kaul
la source
0

C'est une vieille question, mais qui était toujours d'actualité pour moi. Je n'ai pas trouvé ma réponse avant de poser des questions dans le bureau et j'ai découvert que le problème venait des sous-modules. Lorsqu'ils sont mis à jour et que votre propre référentiel ne reflète pas ces changements, il apparaît comme présentant des différences, la réinitialisation de la tête n'aide pas. Si tel est le cas, exécutez:

git status update

Cela devrait aider à résoudre les problèmes (dans ce cas particulier)

Bradley Robinson
la source
0

J'ai eu un problème d'autorisations dans Windows et j'ai dû le faire icacls containingFolder /reset /t /l /c, puis double-cliquer sur le dossier pour récupérer mes autorisations.

Noumène
la source
0

J'avais .gitattributes avec le contenu suivant:

* text=auto eol=lf

Pour résoudre le problème, modifiez .gitattributespour supprimer cette ligne qui assouplit les fins de ligne. Puis git reset --hard HEADrétabli les fichiers et le .gitattributesfichier.

James Jithin
la source
0

Pour moi, ce problème est venu avec une combinaison de téléchargement d'une image Git-LFS qui a été téléchargée via Netlify CMS et servie différemment par leur gestionnaire Netlify Large Media.

Ma solution était de commenter / supprimer ces lignes de mon ~/.gitconfigpour qu'elles ressemblent à celles ci-dessous, puis de vérifier à git statusnouveau.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

OU vous pouvez probablement ajouter un filtre plus local via un .gitconfigdans la racine du dépôt et écraser d'une manière ou d'une autre les règles de filtrage pour lfs.

J'espère que cela aidera un autre.

Knogobert
la source
-1

J'ai également rencontré un problème quelque peu similaire et les étapes suivantes m'ont aidé:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

J'espère que cela aide aussi d'autres personnes.

Atin Agarwal
la source