git reset --hard HEAD laisse les fichiers non suivis derrière

584

Quand je cours git reset --hard HEAD, il est censé réinitialiser une version vierge de ce que vous avez tiré, si je comprends bien. Malheureusement, il laisse des fichiers traîner, comme le git statusmontre une grande liste de fichiers non suivis.

Comment dites-vous à git "Ramenez-le à EXACTEMENT ce qui était dans le dernier pull, rien de plus, rien de moins"?

Karl
la source
44
git reset --hardréinitialise votre index et ramène les fichiers suivis à leur état tel qu'ils sont dans HEAD. Il laisse seuls les fichiers non suivis.
fifigyuri

Réponses:

904

Vous devez utiliser git clean -f -dpour vous débarrasser des fichiers et répertoires non suivis dans votre copie de travail.

Si vous devez réinitialiser l'ensemble du référentiel pour qu'il soit maître, y compris tous les sous-modules git, exécutez ce script:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status
knittl
la source
56
Aussi, -xsi vous souhaitez supprimer vos fichiers .gitignored et revenir à un état vierge.
jtdubs
44
Ajouter -nau test serait supprimé en premier. combinez-les tous dans un seul argument:-dfn
HyBRiD
31
Ma commande commune est git clean -qfdxici. Retirez tout et faites-le en silence.
aragaer
3
-d -fpeut être détartré deux fois -dffpour -d -f -f, cela supprimera TOUS les répertoires non suivis, y compris les répertoires protégés non suivis.
ThorSummoner
3
@BKSpurgeon: oui, il supprime les fichiers. Que voulez-vous dire par «Je veux des fichiers non suivis comme avant»? Git ne sait rien des fichiers non suivis, sauf qu'ils existent. Il ne suit pas plusieurs versions de ces fichiers (car ils ne sont pas suivis ).
knittl
61

Si vous avez des fichiers que vous souhaitez conserver:

git clean -di fera un nettoyage interactif qui vous permet de supprimer uniquement les fichiers / répertoires dont vous ne voulez plus.

Sogger
la source
48
git reset --hard && git clean -dfx

ou, zsh fournit un alias 'gpristine':

alias gpristine='git reset --hard && git clean -dfx'

Ce qui est vraiment pratique.

Si vous travaillez sur un dépôt fourchu, assurez-vous de récupérer et de réinitialiser à partir du dépôt / branche correct, par exemple:

git fetch upstream && git reset --hard upstream/master && git clean -df
jjnevis
la source
8
Toutes mes excuses si ce n'est pas une commande sûre - je n'essayais pas d'être en sécurité, j'essayais de répondre à la question. Pourriez-vous nous dire si cela répond à la question?
jjnevis
3
Cela fonctionne bien et devrait être intégré à git IMHO (bien que je ne suis pas sûr d'utiliser systématiquement -x). Tant de fois, je travaille sur un projet local, pas encore synchronisé avec github, etc., et un refactor désordonné va au-delà de l'état "annuler" de l'EDI. Mon instinct est de revenir au dernier commit mais googler pour cela prend généralement des réponses pour l'avant-dernier commit, pas le dernier commit. Tout ce que je veux, c'est revenir au dernier commit. Ça fait ça. Cela devrait être un moyen plus simple. Merci Linus! ;-)
Dell Anderson
5
C'est dangereux car il supprime également les fichiers ignorés avec des fichiers-x similaires si vous venez de cloner le dépôt. Si c'est ce que vous voulez, c'est parfait. Si vous souhaitez simplement supprimer les fichiers non suivis , la suppression de l' -xoption fonctionne bien.
Emile Bergeron
2
Dieu mercigpristine
Snowcrash
2
et supprime les paramètres d'intellij;)
Kalpesh Soni
17

Approche interactive utilisateur:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i pour interactif
-f pour forcer
-d pour répertoire
-x pour les fichiers ignorés (ajouter si nécessaire)

Remarque: Ajoutez -n ou --dry-run pour vérifier simplement ce qu'il fera.

bit_cracker007
la source
4

Vous pouvez utiliser git stash. Vous devez spécifier --include-untracked, sinon vous vous retrouverez avec le problème d'origine.

git stash --include-untracked

Ensuite, déposez simplement la dernière entrée dans la cachette

git stash drop

Vous pouvez créer un alias pratique pour cela, et l'appeler git wipepar exemple:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"
Nikola Diklic
la source
2

La commande que vous recherchez est git clean

Jagriti Kumari
la source
4
La prochaine fois, veuillez ajouter un peu plus de description / d'exemples, etc. Tout ce qui aide l'utilisateur à comprendre ce qu'il fait et, dans ce cas, quels paramètres utiliser.
rugk
1

git-clean Utilisez pour supprimer les fichiers non suivis dans l'arborescence de travail. Voici quelques options (en bref) qui peuvent être utilisées avec la git cleancommande.

-dà utiliser lorsqu'aucun chemin n'est spécifié. Donc, git recurse dans des répertoires non suivis les supprime.

-f/--force Pour supprimer les fichiers imbriqués non suivis.

-i/--interactive Montrez ce qui serait fait et nettoyez les fichiers de manière interactive.

-n/--dry-run Montrez ce qui se passera sans rien supprimer.

-x ignorer les fichiers

exemple: git clean -f -d-> Supprimer tous les fichiers non suivis dans le répertoire courant des sous-répertoires.

Yuresh Karunanayake
la source
-16

Vous avez peut-être effectué une réinitialisation logicielle à un moment donné, vous pouvez résoudre ce problème en faisant

git add .
git reset --hard HEAD~100
git pull
user3780587
la source
7
Je ne pense pas que c'est ce que voulait OP. L'une ou l'autre des réponses fait bien mieux pour montrer comment résoudre ce problème.
Avery
1
Cela peut également être lent si vous avez beaucoup de fichiers à ajouter.
Devin G Rhode
4
totalement sans rapport.
Azeem Hassni
1
Ce faisant, les fichiers non suivis sont supprimés. Mais en tant que programmeurs, tout le monde devrait essayer de trouver la bonne solution aux problèmes sans utiliser de solutions de contournement et sans sourire.
Yuresh Karunanayake