Comment annuler les modifications non validées, y compris les fichiers et les dossiers?


1072

Existe-t-il une commande git pour annuler toutes les modifications non validées dans une arborescence et un index de travail et pour supprimer également les fichiers et dossiers nouvellement créés?



1
Eh bien, j'ai lu toutes les réponses variées et difficiles à retenir ci-dessous, avec leurs mises en garde et leurs cas de bord et "n'a pas fonctionné si vous avez xxx", et je suis resté avec la suppression de l'ensemble du dépôt, le clonant pour supprimer tous les fichiers modifiés et ajoutés . Est également seulement deux commandes. rm -r projectdir; git clone xxx. Pour moi, c'est une opération fréquente - jetez un coup d'œil à un repo, puis voulez revenir à une caisse propre afin que je puisse commencer à le modifier. Pas génial, mais fonctionne à 100%. En espérant qu'un jour ils ajouteront une commande simple pour cela.
John Little

Réponses:


1771

Vous pouvez exécuter ces deux commandes:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
bonne idée d'exécuter 'git clean -nd' pour prévisualiser les modifications avant d'exécuter git clean pour vous assurer que les fichiers ou répertoires non suivis dont vous vous souciez seront supprimés.
jpw

80
Enregistrer quelqu'un un voyage dans les documents: -f est forcé, -d est supprimer les répertoires, -n est à sec (également --dry-run; afficher la sortie sans rien faire encore)
Aaron Campbell

12
git clean -ipour un mode interactif.
galath

Il n'a pas réinitialisé mes fichiers non organisés, j'ai dû les mettre en scène d'abord.
Aron Lorincz

4
@IgorGanapolsky Vous êtes probablement au milieu d'un conflit de fusion. Essayez de courir git merge --abort.
htanata

555

Si vous souhaitez annuler les modifications uniquement dans le répertoire de travail actuel, utilisez

git checkout -- .

Et avant cela, vous pouvez lister les fichiers qui seront rétablis sans faire aucune action, juste pour vérifier ce qui va se passer, avec:

git checkout --

1
Quand j'essaye ceci j'obtiens "erreur: pathspec '.' ne correspond à aucun fichier connu de git.
Mike K

34
Quelle est la différence entre cela et git reset --hard?
Felipe Almeida

104
'git reset --hard' annulera les modifications échelonnées et non échelonnées, tandis que 'git checkout -.' annulera uniquement les modifications non mises en scène
divideByZero

Mais si vous utilisez l'extraction et que vous avez modifié des fichiers, la cmd retournera que j'ai besoin de faire la fusion, même lorsque j'ai juste besoin d'annuler ces changements
Vinicius Monteiro

7
git checkout - listera simplement les fichiers qui seront rétablis (aucune action, juste lister). c'est utile si vous voulez voir quels fichiers seront affectés avant de faire git checkout -.
Krish Srinivasan

107

Utilisez "git checkout - ..." pour annuler les modifications dans le répertoire de travail

git checkout -- app/views/posts/index.html.erb

ou

git checkout -- *

supprime toutes les modifications apportées aux fichiers non mis en scène dans l'état git, par exemple

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

5
git checkout -- *ne fonctionne pour moi que si je suis dans le répertoire où se trouvent les fichiers modifiés. Pour extraire tous les fichiers de l'ensemble du référentiel, vous devez le fairegit checkout -- :/
waldyrious

Dans git checkout -- *, l'étoile est remplacée par Shell, avec tous les fichiers et répertoires dans le répertoire courant. Il devrait donc aller dans les sous-répertoires. Ça marche pour moi. Mais merci de mettre en évidence la syntaxe ": /" qui me semble plus propre.
mcoolive

53

Une façon non triviale consiste à exécuter ces deux commandes:

  1. git stash Cela mettra vos modifications dans la cachette, vous ramenant à l'état de HEAD
  2. git stash drop Cela supprimera la dernière cachette créée dans la dernière commande.

3
Cela ne fonctionne pas pour les modifications non validées, uniquement pour les modifications validées.
b0xxed1n

4
Je l'ai utilisé pour des modifications non validées et cela fonctionne.
Paul D. Eden

7
@ b0xxed1n Le stockage est une question de changements non validés, et cela fonctionne évidemment pour eux.
TJ

git stash a été créé pour enregistrer les modifications non validées afin que vous puissiez .. les enregistrer sans vous engager.
Rob

git stash entraîne l'erreur suivante:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

n'a pas aidé, de nouveaux fichiers sont restés. Ce que j'ai fait, c'est de supprimer totalement tout l'arbre de travail, puis

git reset --hard

Voir " Comment effacer mon répertoire de travail local dans git? " Pour obtenir des conseils sur l'ajout de l' -xoption de nettoyage:

git clean -fdx

L' -x indicateur de note supprimera tous les fichiers ignorés par Git, alors soyez prudent (voir la discussion dans la réponse à laquelle je fais référence).


qu'est-ce que -fdx? "force, répertoire et x est?
Adi Prasetyo

L'indicateur @AdiPrasetyo -x supprime également tous les fichiers ignorés; cela pourrait être un effet indésirable, j'ai donc mis à jour ma réponse.
Fr0sT

Je ne peux toujours pas rebaser. J'obtiens l'erreur: erreur: impossible de fusionner les modifications. Le patch a échoué à 0003 Créer un rappel à La copie du patch qui a échoué se trouve dans:
IgorGanapolsky

13

Je pense que vous pouvez utiliser la commande suivante: git reset --hard


hhmm ... je l'ai fait mais mes fichiers sont toujours là. Dois-je faire quelque chose après?
MEM

1
git reset annule uniquement les modifications non validées dans l'arborescence de travail. Il ne supprimera pas les nouveaux fichiers et dossiers. Je ne sais pas comment faire ça avec git
Josnidhin

1
Donc, si nous changeons un répertoire système en ajoutant de nouveaux fichiers et dossiers, puis que nous voulons rétablir ce répertoire à un état précédent (sans ces fichiers et dossiers), nous ne pouvons pas le faire avec git? Donc, le mieux que nous puissions faire est de rétablir les états des fichiers? Mais une fois que nous avons créé un fichier, nous ne pouvons pas le supprimer à moins de le faire manuellement?
MEM

6

Veuillez noter qu'il peut toujours y avoir des fichiers qui ne semblent pas disparaître - ils peuvent ne pas être édités, mais git peut les avoir marqués comme étant modifiés en raison de modifications CRLF / LF. Vérifiez si vous avez apporté des modifications .gitattributesrécemment.

Dans mon cas, j'ai ajouté des paramètres CRLF dans le .gitattributesfichier et tous les fichiers sont restés dans la liste des "fichiers modifiés" à cause de cela. La modification des paramètres .gitattributes les a fait disparaître.


6

Si vous souhaitez apporter une modification non validée (uniquement dans votre copie de travail) à la copie dans votre dernier commit, procédez comme suit:

git checkout filename

J'essaie ceci après un engagement git rm filename, et cela ne fonctionne pas. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

La solution pour annuler git rmestgit checkout master -- filename
falsePockets

3

Git 2.23 a introduit la git restorecommande pour restaurer les fichiers d'arborescence de travail.

https://git-scm.com/docs/git-restore

Pour restaurer tous les fichiers du répertoire actuel

git restore.

Si vous souhaitez restaurer tous les fichiers source C pour correspondre à la version de l'index, vous pouvez le faire

git restaurer '* .c'


1
c'est git 2.23 , pas 2.13
phuclv

2

Vous pouvez simplement utiliser la commande git suivante qui peut revenir en arrière toutes les modifications non validées apportées dans votre référentiel:

git checkout .

Exemple:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

J'utilise généralement cette méthode qui fonctionne bien:

mv fold/file /tmp
git checkout fold/file

C'est exactement la même chose que le gars avec 357 "likes" a proposé. Seulement, vous créez même une sauvegarde du nouveau fichier extrait.
Matthias

-3

Un chemin sûr et long:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

-3

Utilisation:

git reset HEAD filepath

Par exemple:

git reset HEAD om211/src/META-INF/persistence.xml
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.