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?

MEM
la source
1
Copie
vusan
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
htanata
la source
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 --
Ramashish Baranwal
la source
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
Zarne Dravitzki
la source
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.
glumgold
la source
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).

Fr0sT
la source
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

Josnidhin
la source
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.

Rob
la source
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
kgandroid
la source
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'

TheKojuEffect
la source
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
Haritsinh Gohil
la source
-2

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

mv fold/file /tmp
git checkout fold/file
pense
la source
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
Jason Lemay
la source
-3

Utilisation:

git reset HEAD filepath

Par exemple:

git reset HEAD om211/src/META-INF/persistence.xml
Aniket
la source