git: annule toutes les modifications du répertoire de travail, y compris les nouveaux fichiers

1151

Comment supprimer toutes les modifications du répertoire de travail, y compris les nouveaux fichiers non suivis. Je sais que cela git checkout -ffait cela, mais il ne supprime pas les nouveaux fichiers non suivis créés depuis le dernier commit.

Quelqu'un a-t-il une idée de comment faire cela?

Aler
la source
1
@Joel & Wayfarer: pourquoi ne pas essayer git help resetetgit help clean
SHernandez
3
Faire un alias pour cela dans votre configuration git est une bonne idée;)
anubina

Réponses:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Pour voir ce qui sera supprimé à l'avance, sans le supprimer, utilisez l' -nindicateur (il s'agit essentiellement d'un test). Lorsque vous êtes prêt à supprimer, supprimez le -ndrapeau:

git clean -nfd

BKSpurgeon
la source
16
Remarque: git reset --hard supprime les modifications intermédiaires ainsi que les modifications du répertoire de travail. De plus, git clean -f -d est probablement un meilleur opposé que l'ajout d'un nouveau fichier non suivi. De la question, le demandeur peut être très satisfait de son ensemble actuel de fichiers ignorés.
CB Bailey
7
Lisez la réponse suivante et surveillez le commutateur -x. (Il peut également supprimer votre configuration locale, comme les fichiers de paramètres de mot de passe / db. Ex. Database.yml)
Boris
9
Ce commutateur -x est inutile et quelque peu dangereux dans ce cas.
Tim Gautier
66
git clean -fxdpeut en fait être VRAIMENT dangereux si vous ne savez pas ce que vous faites. Vous pouvez finir par supprimer définitivement certains fichiers très importants non suivis, tels que votre base de données, etc. Soyez prudent.
Mason Stewart
10
Notez que git clean -f -dcela supprimera également les fichiers des dossiers ignorés. Ainsi, tous vos journaux locaux et autres choses de ce genre auront disparu. Ce n'est généralement pas un gros problème, mais il vaut mieux le savoir.
cyriel
299

Méthode la plus sûre, que j'utilise fréquemment:

git clean -fd

Explication de la syntaxe selon la /docs/git-cleanpage:

  • -f(alias:) --force. Si la variable de configuration Git clean.requireForce n'est pas définie sur false, git clean refusera de supprimer des fichiers ou des répertoires à moins d'indiquer -f, -n ou -i. Git refusera de supprimer les répertoires avec le sous-répertoire ou fichier .git à moins qu'un second -f ne soit donné.
  • -d. Supprimez les répertoires non suivis en plus des fichiers non suivis. Si un répertoire non suivi est géré par un autre référentiel Git, il n'est pas supprimé par défaut. Utilisez l'option -f deux fois si vous voulez vraiment supprimer un tel répertoire.

Comme mentionné dans les commentaires, il pourrait être préférable de faire un git clean -ndqui fait un essai à sec et vous indique ce qui serait supprimé avant de le supprimer.

Lien vers la git cleanpage du document: https://git-scm.com/docs/git-clean

Heath Dutton
la source
124
J'ai toujours git clean -nd .avant de supprimer des fichiers en utilisantgit clean -fd .
tbear
14
Pourquoi? Pouvez-vous expliquer les détails s'il vous plaît.
Greg B
31
L' option -n par git clean est en fait un essai à sec qui ne supprime rien, elle vous montre simplement ce qui sera fait.
RNickMcCandless
2
@tbear, vous pouvez toujours faire un add -A+ commit -a+ vierge revert headavant git clean. L'examen de chaque suppression ne prend tout simplement pas en compte les scénarios principaux. De plus, le fonctionnement à sec n'est pas une solution miracle: que faire si vous avez raté quelque chose ou fait une erreur lors de l'examen?
Pacerier
1
Cela supprime les fichiers, mais n'annule pas les modifications.
donquixote
202

Pour tous les fichiers non organisés , utilisez:

git checkout -- .

La .fin est importante.

Vous pouvez remplacer .par un nom de sous-répertoire pour effacer uniquement un sous-répertoire spécifique de votre projet. Le problème est traité spécifiquement ici .

jfountain
la source
7
@Vincent: le - évite les erreurs de frappe en indiquant à la commande checkout qu'aucun autre paramètre n'est spécifié. Sans eux, vous pourriez terminer avec une nouvelle branche au lieu de réinitialiser la branche actuelle!
Igor Rodriguez
2
Il s'agit de l'itinéraire le plus sûr, mais il ne supprimera pas les fichiers non suivis (nouveaux fichiers ajoutés).
TinkerTenorSoftwareGuy
5
Cela ne restaure pas les fichiers supprimés, mais non validés.
Cerin
Juste FYI. J'ai manqué ça. Assurez-vous que vous êtes dans le répertoire dans lequel vous souhaitez supprimer les modifications non planifiées. Par exemple, j'ai eu des changements dans 2 fichiers différents à différents endroits sur une branche, à savoir: src/app/work/filename.jset ../app/working/test/filename.js. Le simple fait d'utiliser git checkout -- .sur la branche n'a supprimé que le premier fichier ( sans le début ../ ). J'ai donc dû cd ../monter dans le deuxième répertoire d'emplacement pour supprimer le deuxième fichier à l'aide de cette commande.
Chris22
57

Jetez un oeil à la git cleancommande.

git-clean - Supprime les fichiers non suivis de l'arborescence de travail

Nettoie l'arborescence de travail en supprimant récursivement les fichiers qui ne sont pas sous contrôle de version, à partir du répertoire actuel.

Normalement, seuls les fichiers inconnus de git sont supprimés, mais si l'option -x est spécifiée, les fichiers ignorés sont également supprimés. Cela peut, par exemple, être utile pour supprimer tous les produits de build.

Greg Hewgill
la source
J'ai essayé git clean -iet choisi "nettoyer" dans le menu - cela a finalement supprimé de nouveaux fichiers.
Sany
43

Les oeuvres suivantes:

git add -A .
git stash
git stash drop stash@{0}

Veuillez noter que cela supprimera à la fois vos modifications locales non mises en scène et mises en scène. Vous devez donc valider tout ce que vous souhaitez conserver avant d'exécuter ces commandes.

Un cas d'utilisation typique: vous avez déplacé un grand nombre de fichiers ou de répertoires, puis souhaitez revenir à l'état d'origine.

Crédits: https://stackoverflow.com/a/52719/246724

don Quichotte
la source
1
Pourquoi faites-vous référence à stash @ {0} au lieu de simplement git stash drop?
maikel
Honnêtement, je ne me souviens pas :)
donquixote
Celui-ci a fonctionné. Notez que vous êtes dans le répertoire personnel ( git add -A .). J'ai perdu 30m car il n'y avait pas de correspondance de fichier. Merci!
user9869932
J'avais l'habitude d'utiliser cette approche, et elle a du mérite. Cependant, j'ai depuis trouvé les solutions proposées par jfountain et Heath Dutton plus adaptées au problème d'origine, à mon humble avis.
HeyZiko
2
git stash drop stash @ {0} drops last stash if you did git stash it would drop all stashes you
done
42

Vous pouvez le faire en deux étapes:

  1. Rétablir les fichiers modifiés: git checkout -f
  2. Supprimez les fichiers non suivis: git clean -fd
Gerard de Visser
la source
3
+1 parce que simple. Aussi parce que cela fonctionne et fait exactement ce que OP veut sans les effrayer avec omg, cela supprimera tout.
geekzster
30

Je pensais qu'il était ( avertissement: suivant va effacer tout )

$ git reset --hard HEAD
$ git clean -fd

L' resetannulation des modifications. Le cleanpour éliminer tout untracked f iles et d irectories.

skube
la source
Cela ne fonctionne pas, je reçois toujours un avertissement de conflit lorsque je fais un git pullaprès: CONFLICT (content): Merge conflict in...je n'ai résolu cela que pargit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Il supprimera tous les fichiers non suivis.

santosh kumar
la source
4

git clean -ivous montrera d'abord les éléments à supprimer et procédera après votre confirmation. Je trouve cela utile lorsque vous traitez des fichiers importants qui ne devraient pas être supprimés accidentellement.

Voir git help cleanpour plus d'informations, y compris d'autres options utiles.

Taïga
la source
4

Si vous souhaitez annuler toutes les modifications, vous pouvez utiliser l'une des options valides d'un alias dans .gitconfig. Par exemple:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Usage: git discard

Agorreca
la source
1
Cet alias me plaît beaucoup
drapeaux
3

Une autre solution consiste à valider les modifications, puis à supprimer ces validations. Cela n'a pas un avantage immédiat au début, mais cela ouvre la possibilité de valider en morceaux et de créer une balise git pour la sauvegarde.

Vous pouvez le faire sur la branche actuelle, comme ceci:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Ou vous pouvez le faire sur la tête détachée. (en supposant que vous commenciez sur la branche BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Cependant, ce que je fais habituellement, c'est de commettre par morceaux, puis de nommer certains ou tous les commits comme "DISCARD: ...". Utilisez ensuite un rebase interactif pour supprimer les mauvais commits et conserver les bons.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

C'est plus détaillé, mais cela permet de revoir exactement les changements que vous souhaitez supprimer.

Les raccourcis git loletgit lola ont été très utiles avec ce flux de travail.

don Quichotte
la source
3

Pour un dossier spécifique que j'ai utilisé:

git checkout -- FolderToClean/*
Glauco Neves
la source
3
Cela ne supprime pas les fichiers non suivis, comme l'indique OP.
vonbrand
0

C'est probablement une réponse noob, mais: j'utilise TortoiseGit pour Windows et il a une belle fonctionnalité appelée REVERT. Donc, ce que vous faites pour annuler vos modifications locales non mises en scène non poussées est:

  1. faire apparaître un menu contextuel pour le dossier nécessaire et sélectionnez revenir, il affiche une fenêtre contextuelle de retour où vous pouvez sélectionner les fichiers modifiés à restaurer / récupérer.
  2. Si vous souhaitez également supprimer les fichiers ajoutés (qui ne sont pas encore dans git), cliquez sur valider (dans le même menu contextuel), la fenêtre contextuelle Valider s'affiche et vous montre les fichiers ajoutés, puis faites un clic droit sur chacun d'eux et choisissez supprimer. Mais n'appuyez pas sur Commit btn dans cette fenêtre, car vous ne voulez pas vous engager, mais ne voyez que les fichiers ajoutés et supprimez-les d'ici.
Oleg Vorontsov
la source