Je souhaite supprimer toutes les modifications apportées à ma copie de travail.
L'exécution git status
montre les fichiers modifiés.
Rien de ce que je fais ne semble supprimer ces modifications.
Par exemple:
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# 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: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# 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: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# 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: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# 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: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
git
revert
git-status
working-copy
rbellamy
la source
la source
git reset --hard
n'a pas fonctionné ici. Remarque: cela devrait êtregit checkout -- `git ls-files -m`
d'annuler les fichiers (--
)checkout -- <file>
cela devrait fonctionner. La détection de changement est un peu difficile dans certaines situations (entre autres si une incompatibilité CRLF est présente)git update-index --assume-unchaged
force l'état non ficelé des fichiers (même pour les fichiers modifiés!)Réponses:
Il existe plusieurs problèmes qui peuvent provoquer ce problème:
Normalisation de fin de ligne
J'ai aussi eu ce genre de problèmes. Cela revient à git convertir automatiquement crlf en lf. Cela est généralement dû à des fins de ligne mixtes dans un seul fichier. Le fichier est normalisé dans l'index, mais lorsque git le dénormalise à nouveau pour le différencier du fichier dans l'arborescence de travail, le résultat est différent.
Mais si vous souhaitez résoudre ce problème, vous devez désactiver core.autocrlf , remplacer toutes les fins de ligne par lf, puis le réactiver . Ou vous pouvez le désactiver complètement en faisant:
Au lieu de core.autocrlf , vous pouvez également envisager d'utiliser des
.gitattribute
fichiers. De cette façon, vous pouvez vous assurer que toutes les personnes utilisant le référentiel utilisent les mêmes règles de normalisation, empêchant les fins de ligne mixtes d'entrer dans le référentiel.Pensez également à définir core.safecrlf pour avertir si vous voulez que git vous avertisse lorsqu'une normalisation non réversible sera effectuée.
Les pages de manuel git disent ceci:
Systèmes de fichiers insensibles à la casse
Sur les systèmes de fichiers insensibles à la casse, lorsque le même nom de fichier avec une casse différente se trouve dans le référentiel, git essaie de retirer les deux, mais un seul se retrouve sur le système de fichiers. Lorsque git essaie de comparer le second, il le compare au mauvais fichier.
La solution serait soit de passer à un système de fichiers non sensible à la casse, mais dans la plupart des cas, cela n'est pas possible ou de renommer et de valider l'un des fichiers sur un autre système de fichiers.
la source
git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
. Pour répertorier les noms en majuscules et en minuscules de ces fichiers, exécutezgit ls-tree -r --name-only HEAD | fgrep -i -f <(git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d) | sort -i
J'avais ce problème sur Windows, mais je n'étais pas prêt à étudier les ramifications de l'utilisation.
config --global core.autocrlf false
Je n'étais pas non plus prêt à abandonner d'autres branches privées et goodies dans ma cachette et à commencer avec un nouveau clone. J'ai juste besoin de faire quelque chose. Maintenant.Cela a fonctionné pour moi, sur l'idée que vous laissiez git réécrire complètement votre répertoire de travail:
(Notez que l'exécution
git reset --hard
n'était tout simplement pas assez bonne ni une plainerm
sur les fichiers avant lereset
comme suggéré dans les commentaires de la question d'origine)la source
core.autocrlf
n'a eu aucun effet.core.autocrlf false
. Cette réponse a fonctionné quand rien d'autre ne le ferait.Une autre solution qui peut fonctionner pour les gens, car aucune des options de texte n'a fonctionné pour moi:
.gitattributes
avec une seule ligne:* binary
. Cela indique à git de traiter chaque fichier comme un fichier binaire avec lequel il ne peut rien faire.git checkout -- <files>
les restaurer dans la version du référentielgit checkout -- .gitattributes
restaurer le.gitattributes
fichier à son état initialla source
.gitattributes
à l'original réintroduirait le même problème, mais hélas mon problème est maintenant résolu. Aucune des autres suggestions n'a fonctionné dans mon cas.git status
, il constate que ce sont des fichiers différents. Lorsque vous demandezgit checkout
, il constate qu'ils ont le même contenu. Cette solution demande temporairement à git d'ignorer toute intelligence de fin de ligne possible et de s'assurer que votre copie locale est identique octet par octet à celle deHEAD
. Une fois que cela a été résolu, permettre à l'intelligence de reprendre est correct, car cela n'ajoutera pas de nouvelles erreurs.Pour les futures personnes ayant ce problème: Les modifications du mode de fichier peuvent également présenter les mêmes symptômes.
git config core.filemode false
va le réparer.la source
git checkout .
git diff
et il affichera les fichiers avec des changements de mode comme celui-ciold mode 100755 / new mode 100644
.Cela m'a rendu fou, surtout que je ne pouvais pas résoudre ce problème sans aucune des solutions trouvées en ligne. Voici comment je l'ai résolu. Je ne peux pas prendre les crédits ici car c'est le travail d'un collègue :)
Source du problème: Mon installation initiale de git s'est faite sans conversion de ligne automatique sur Windows. Cela a provoqué mon commit initial à GLFW sans la fin de ligne appropriée.
Installation: Xubuntu 12.04 Git repo avec projet glfw
Problème: impossible de réinitialiser les fichiers glfw. Ils apparaissent toujours comme modifiés, indépendamment de ce que j'ai essayé.
Résolu:
la source
J'avais un fichier .bat avec le même problème (impossible de le supprimer dans les fichiers non suivis). git checkout - n'a pas fonctionné, ni aucune des suggestions sur cette page. La seule chose qui a fonctionné pour moi a été de faire:
Et puis pour supprimer la cachette:
la source
--keep-index
c'est important.Vous avez le même problème deux fois! Les deux fois où j'ai caché des changements, j'ai fait et j'ai essayé de les faire revenir. Impossible de faire apparaître les modifications car j'ai beaucoup de fichiers qui ont été modifiés - mais ils ne le sont PAS! Ils sont exactement les mêmes.
Je pense maintenant que j'ai essayé toutes les solutions ci-dessus sans succès. Après avoir essayé le
J'ai maintenant modifié presque tous les fichiers de mon référentiel.
Lorsque vous différez le fichier, il indique que j'ai supprimé toutes les lignes, puis les ai ajoutées à nouveau.
Un peu dérangeant. Je vais maintenant éviter de planquer à l'avenir ..
La seule solution est de cloner un nouveau référentiel et de recommencer. (Fait la dernière fois)
la source
Essayez de faire un
Cela devrait effacer tous les changements dans le référentiel local de travail actuel
la source
git checkout -f <another recent branch>
retourner dans ma succursale avecgit checkout -f <branch I'm working on>
Je n'ai pu résoudre ce problème qu'en supprimant temporairement le fichier .gitattributes de mon référentiel (qui définissait
* text=auto
et*.c text
).J'ai couru
git status
après la suppression et les modifications avaient disparu. Ils ne sont pas revenus même après la remise en place de .gitattributes.la source
Avoir des fins de ligne cohérentes est une bonne chose. Par exemple, il ne déclenchera pas de fusions inutiles, bien que triviales. J'ai vu Visual Studio créer des fichiers avec des fins de ligne mixtes.
Certains programmes comme bash (sous linux) nécessitent également que les fichiers .sh soient terminés en LF.
Pour vous assurer que cela se produit, vous pouvez utiliser gitattributes. Il fonctionne au niveau du référentiel quelle que soit la valeur de autcrlf.
Par exemple, vous pouvez avoir .gitattributes comme ceci: * text = auto
Vous pouvez également être plus spécifique par type / extension de fichier si cela importait dans votre cas.
Autocrlf peut alors convertir localement les fins de ligne pour les programmes Windows.
Sur un projet mixte C # / C ++ / Java / Ruby / R, Windows / Linux, cela fonctionne bien. Aucun problème jusqu'à présent.
la source
J'ai également eu les mêmes symptômes mais a été causée par une chose différente.
Je n'étais pas capable de:
même sur
git rm --cached app.js
celui-ci signe comme supprimé et dans les fichiers non suivis, je pouvais voir app.js. Mais quand j'ai essayérm -rf app.js
et peformgit status
encore , il me montre encore le fichier dans « untracked ».Après quelques essais avec un collègue, nous avons découvert que cela avait été causé par Grunt!
Comme le
Grunt
a été activé, et parce que app.js a été généré à partir de quelques autres fichiers js, nous avons découvert qu'après chaque opération avec des fichiers js (également ce app.js) grunt recrée à nouveau app.js.la source
Ce problème peut également se produire lorsqu'un contributeur au dépôt fonctionne sur une machine Linux ou lorsque les fenêtres avec Cygwin et les autorisations de fichier sont modifiées. Git ne connaît que 755 et 644.
Exemple de ce problème et comment le vérifier:
Pour éviter cela, vous devez vous assurer de configurer correctement git en utilisant
la source
Il y a beaucoup de solutions ici et j'aurais peut-être dû essayer certaines d'entre elles avant d'en arriver à la mienne. Quoi qu'il en soit, voici un de plus ...
Notre problème était que nous n'avions aucune application pour les endlines et le référentiel avait un mélange de DOS / Unix. Le pire, c'est qu'il s'agissait en fait d'un référentiel open source dans cette position, et que nous avions bifurqué. La décision a été prise par ceux qui détiennent la propriété principale du référentiel du système d'exploitation de changer toutes les lignes de terminaison en Unix et la validation a été prise qui comprenait un
.gitattributes
pour appliquer les fins de ligne.Malheureusement, cela semblait causer des problèmes similaires à ceux décrits ici où une fois une fusion de code antérieure à DOS-2-Unix effectuée, les fichiers seraient marqués pour toujours comme modifiés et ne pourraient pas être annulés.
Au cours de mes recherches à ce sujet, je suis tombé sur - https://help.github.com/articles/dealing-with-line-endings/ - Si je fais à nouveau face à ce problème, je commencerais par essayer ceci.
Voici ce que j'ai fait:
J'avais initialement fait une fusion avant de réaliser que j'avais ce problème et que je devais l'annuler -
git reset --hard HEAD
( j'ai rencontré un conflit de fusion. Comment puis-je abandonner la fusion? )J'ai ouvert les fichiers en question dans VIM et suis passé à Unix (
:set ff=unix
). Un outil commedos2unix
pourrait être utilisé au lieu de coursengagé
fusionné
master
dans (le maître a les modifications DOS-2-Unix)git checkout old-code-branch; git merge master
Les conflits ont été résolus et les fichiers étaient à nouveau DOS, donc
:set ff=unix
je devais quand dans VIM. (Notez que j'ai installé https://github.com/itchyny/lightline.vim qui m'a permis de voir quel est le format de fichier sur la ligne d'état VIM)la source
Le problème que j'ai rencontré est que Windows ne se soucie pas de la capitalisation du nom de fichier, mais git le fait. Git a donc stocké une version inférieure et majuscule du fichier mais n'a pu en extraire qu'une.
la source
J'ai validé toutes les modifications, puis j'ai effectué et annulé la validation. Cela a fonctionné pour moi
git add.
git commit -m "Validation aléatoire"
git reset --hard HEAD ~ 1
la source
Normalement, dans GIT pour effacer toutes vos modifications et nouveaux fichiers, les 2 commandes suivantes devraient fonctionner très bien ( faites attention , cela supprimera tous vos nouveaux fichiers + dossiers que vous avez peut-être créés et restaurera tous vos fichiers modifiés à l'état de votre courant) valider ):
Peut-être qu'une meilleure option est parfois de simplement faire "git stash push" avec un message facultatif, comme ceci:
Cela effacera également tous vos fichiers nouveaux et modifiés, mais vous les aurez tous cachés au cas où vous souhaiteriez les restaurer. Stash dans GIT est transporté de branche en branche, vous pouvez donc les restaurer dans une autre branche, si vous le souhaitez.
En guise de remarque, si vous avez déjà mis en scène des fichiers récemment ajoutés et que vous souhaitez vous en débarrasser, cela devrait faire l'affaire:
Si tout ce qui précède ne fonctionne pas pour vous , lisez ci-dessous ce qui a fonctionné pour moi il y a quelque temps:
J'ai rencontré ce problème plusieurs fois auparavant. Je développe actuellement sur une machine Windows 10 fournie par mon employeur. Aujourd'hui, ce comportement git particulier a été provoqué par la création d'une nouvelle branche à partir de ma branche "develop". Pour une raison quelconque, après être revenu à la branche "développer", certains fichiers apparemment aléatoires persistaient et apparaissaient comme "modifiés" dans "git status".
De plus, à ce moment-là, je ne pouvais pas commander une autre branche, donc j'étais coincé sur ma branche "développer".
C'est ce que j'ai fait:
J'ai remarqué que la nouvelle branche que j'ai créée à partir de "develop" plus tôt dans la journée montrait dans le premier message "commit", étant référencée à la fin "HEAD -> develop, origin / develop, origin / HEAD, The-branch-i-created -plus tôt-aujourd'hui ".
Comme je n'en avais pas vraiment besoin, je l'ai supprimé:
Les fichiers modifiés apparaissaient toujours, alors j'ai fait:
Cela a résolu mon problème:
Bien sûr
$ git stash list
, les modifications seront cachées, et comme j'en avais peu et que je n'avais besoin d'aucune de mes cachettes, je l'ai fait$ git stash clear
pour SUPPRIMER TOUTES LES CACHEES.REMARQUE : je n'ai pas essayé de faire ce que quelqu'un a suggéré ici avant moi:
Cela a peut-être aussi bien fonctionné, je serai sûr de l'essayer la prochaine fois que je rencontrerai ce problème.
la source
Si vous clonez un référentiel et voyez instantanément les modifications en attente, le référentiel est dans un état incohérent. Veuillez NE PAS commenter
* text=auto
le.gitattributes
fichier. Cela a été mis spécifiquement parce que le propriétaire du référentiel veut que tous les fichiers soient stockés de manière cohérente avec les fins de ligne LF.Comme indiqué par HankCa, suivre les instructions sur https://help.github.com/articles/dealing-with-line-endings/ est la voie à suivre pour résoudre le problème. Bouton facile:
Puis fusionnez (ou extrayez la demande) la branche au propriétaire du référentiel.
la source
Rien d'autre sur cette page n'a fonctionné. Cela a finalement fonctionné pour moi. Ne montrant aucun fichier non suivi ou engagé.
la source
Pour moi, le problème était que Visual Studio a été ouvert lors de l'exécution de la commande
git checkout <file>
Après avoir fermé Visual Studio, la commande a fonctionné et j'ai finalement pu appliquer mon travail à partir de la pile. Vérifiez donc toutes les applications susceptibles d'apporter des modifications à votre code, par exemple SourceTree, SmartGit, NotePad, NotePad ++ et d'autres éditeurs.
la source
Nous étions confrontés à une situation similaire dans notre entreprise. Aucune des méthodes proposées ne nous a aidés. À la suite de la recherche, le problème a été révélé. Le fait était que dans Git, il y avait deux fichiers, dont les noms ne différaient que dans le registre des symboles. Les systèmes Unix les considéraient comme deux fichiers différents, mais Windows devenait fou. Pour résoudre le problème, nous avons supprimé l'un des fichiers sur le serveur. Après cela, dans les référentiels locaux sous Windows, les commandes suivantes ont été aidées (dans différentes séquences):
la source
Je l'ai résolu en éditant .git / config, en ajoutant:
Ensuite, je suis allé dans .git / refs / heads / name_branch et j'ai placé l'id du dernier commit
enter code here
la source
Je l'ai résolu de cette façon:
C'est ce qui a fonctionné pour moi.
la source
Une solution proposée ici n'a pas fonctionné, j'ai découvert que le fichier était en fait un lien vers des caractères spéciaux:
la source