web-dev-qa-db-fra.com

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

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

Est-ce que quelqu'un a une idée de comment faire ça?

1079
Aler
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é au préalable, sans le supprimer réellement, utilisez l'indicateur -n (il s'agit essentiellement d'un test). Lorsque vous êtes prêt à supprimer réellement, supprimez l'indicateur -n:

git clean -nfd

1600
rdtsc

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

git clean -fd

Explication de la syntaxe selon /docs/git-clean page:

  • -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 que -f, -n ou -i ne soit indiqué. Git refusera de supprimer les répertoires contenant le sous-répertoire ou le fichier .git à moins qu'un second -f ne soit fourni.
  • -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 reprises si vous souhaitez vraiment supprimer un tel répertoire.

Comme mentionné dans les commentaires, il serait peut-être préférable de faire un git clean -nd qui effectue un essai et vous indique ce qui serait supprimé avant de le supprimer.

Lien vers la page git clean doc: https://git-scm.com/docs/git-clean

274
Heath Dutton

Pour tous fichiers non staged , utilisez:

git checkout -- .

Le . à la fin est important.

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 .

191
jfountain

Examinez la commande git clean .

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

Nettoie l’arbre de travail en supprimant de manière récursive les fichiers qui ne sont pas sous contrôle de version, à partir du répertoire en cours.

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 construction.

57
Greg Hewgill

Les oeuvres suivantes:

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

Veuillez noter que cela annulera vos modifications locales non mises en scène et par étapes. Donc, vous devriez commettre tout ce que vous voulez conserver avant d'exécuter ces commandes.

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

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

40
donquixote

Vous pouvez le faire en deux étapes:

  1. Rétablir les fichiers modifiés: git checkout -f
  2. Supprimer les fichiers non suivis: git clean -fd
38
Gerard de Visser

Je pensais que c'était ( warning: après will tout effacer )

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

La reset pour annuler les modifications. La clean supprime tous les f iles et d − répertoires non suivis.

26
skube
git reset --hard Origin/{branchName}

Il supprimera tous les fichiers non suivis.

7
santosh kumar

git clean -i vous montrera d'abord les éléments à supprimer et procédera après votre confirmation. Je trouve cela utile lorsqu'il s'agit de fichiers importants qui ne doivent pas être supprimés accidentellement.

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

4
tg_freelancer

Une autre solution consiste à valider les modifications, puis à se débarrasser de ces commits. Cela n’a pas un avantage immédiat au début, mais cela ouvre la possibilité de commettre par 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 HEAD détaché. (en supposant que vous démarriez 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 des morceaux, puis de nommer certains ou tous les commits comme suit: "DISCARD: ...". Utilisez ensuite la base interactive pour supprimer les mauvaises commises et conserver les bonnes.

_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".
_

Ceci est plus détaillé, mais cela permet de revoir exactement les modifications que vous souhaitez ignorer.

Les raccourcis git lol_ ET _git lola ont été très utiles pour ce flux de travail.

3
donquixote

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

git checkout -- FolderToClean/*
3
Glauco Neves

Si vous souhaitez ignorer 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"

Utilisation: git discard

2
Agorreca

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

  1. ouvrez un menu contextuel pour le dossier nécessaire et sélectionnez Revenir. Il affiche une fenêtre contextuelle Revenir dans laquelle vous pouvez sélectionner les fichiers modifiés pour revenir/récupérer.
  2. Si vous souhaitez également supprimer les fichiers ajoutés (qui ne sont pas encore dans git), cliquez sur commit (dans le même menu contextuel) pour afficher la fenêtre de validation et afficher les fichiers ajoutés, puis cliquez avec le bouton droit de la souris sur chacun d'entre eux et choisissez Supprimer. Mais n’appuyez pas sur Commit btn dans cette fenêtre contextuelle, car vous ne voulez pas vous engager, mais seulement voir les fichiers ajoutés et les supprimer d’ici.
0
Oleg Vorontsov