git reset --hard HEAD lascia i file non tracciati dietro


584

Quando corro git reset --hard HEAD, dovrebbe ripristinare una versione incontaminata di ciò che hai estratto, a quanto ho capito. Sfortunatamente, lascia i file in giro, come git statusmostra un grande elenco di file non tracciati.

Come si dice a Git "Basta riportarlo ESATTAMENTE a quello che era nell'ultima attrazione, niente di più, niente di meno"?


44
git reset --hardreimposta il tuo indice e ripristina i file monitorati allo stato in cui si trovano in HEAD. Lascia solo i file non tracciati.
fifigyuri,

Risposte:


904

Devi usare git clean -f -dper sbarazzarti di file e directory non tracciati nella tua copia di lavoro.

Se è necessario reimpostare l'intero repository su master, inclusi tutti i sottomoduli git, eseguire questo 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

56
Inoltre, -xse desideri rimuovere i tuoi file .gitignored e tornare a uno stato originale.
jtdubs,

44
Aggiungi -nal test verrebbe rimosso per primo. -dfn
combinali

31
Il mio comando comune è git clean -qfdxqui. Rimuovi tutto e fallo silenziosamente.
Aragaer,

3
-d -fpuò essere decalizzato due volte -dffper -d -f -f, questo eliminerà TUTTE le directory non tracciate, comprese le directory non tracciate protette.
ThorSummoner,

3
@BKSpurgeon: sì, elimina i file. Che cosa intendi con »Voglio file non tracciati come erano prima«? Git non sa nulla dei file non tracciati, tranne che esistono. Non tiene traccia di più versioni di questi file (poiché non sono tracciati ).
Knittl,

61

Se hai dei file che vuoi ancora conservare:

git clean -di eseguirà un clean interattivo che ti consentirà di eliminare solo i file / le directory che non desideri più.


48
git reset --hard && git clean -dfx

oppure, zsh fornisce un alias 'gpristine':

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

È davvero utile.

Se si lavora su un repository con fork, assicurarsi di recuperare e ripristinare dal repository / branch corretto, ad esempio:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
Mi scuso se questo non è un comando sicuro - non stavo cercando di essere sicuro, stavo cercando di rispondere alla domanda. Potresti commentare se questo risponde alla domanda?
jjnevis,

3
Funziona bene e dovrebbe essere integrato in git IMHO (anche se non sono sicuro che userei regolarmente -x). Tante volte sto lavorando a un progetto locale, non ancora sincronizzato con github ecc., E un refactor disordinato va in tilt oltre lo stato "annulla" dell'IDE. Il mio istinto è di tornare all'ultimo commit, ma cercare su Google di solito ciò richiede risposte per il penultimo commit, non per l'ultimo commit. Tutto quello che voglio è tornare al commit più recente. Questo fa quello. Dovrebbe essere un modo più semplice però. Grazie Linus! ;-)
Dell Anderson,

5
È pericoloso perché cancella anche i file ignorati con -xsimili se avessi appena clonato il repository. Se è quello che vuoi, è perfetto. Se desideri solo eliminare i file non tracciati , la rimozione -xdell'opzione funziona bene.
Emile Bergeron,

2
Grazie a Dio pergpristine
Snowcrash,

2
ed elimina le impostazioni di Intellij;)
Kalpesh Soni,

17

Approccio interattivo dell'utente:

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 per interattivo
-f per forzare
-d per directory
-x per file ignorati (aggiungere se necessario)

Nota: aggiungere -n o --dry-run per controllare semplicemente cosa farà.


4

È possibile utilizzare git stash. Devi specificare --include-untracked, altrimenti finirai con il problema originale.

git stash --include-untracked

Quindi rilasciare l'ultima voce nello stash

git stash drop

Puoi creare un alias dandy a portata di mano e chiamarlo git wipeper esempio:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

Il comando che stai cercando è git clean


4
La prossima volta aggiungi qualche altra descrizione / esempio, ecc. Qualunque cosa aiuti l'utente a capire cosa fa e, in questo caso, quali parametri usare.
rugk,

1

git-clean Utilizzare per rimuovere i file non tracciati nell'albero di lavoro. Di seguito sono riportate alcune opzioni (in breve) che è possibile utilizzare con il git cleancomando.

-dutilizzare quando non viene specificato alcun percorso. Quindi git recurse in directory non tracciate rimuoverli.

-f/--force Per rimuovere file non tracciati nidificati.

-i/--interactive Mostra cosa verrebbe fatto e pulisci i file in modo interattivo.

-n/--dry-run Mostra cosa accadrà senza rimuovere nulla.

-x ignora i file

esempio: git clean -f -d-> Rimuovi tutti i file non tracciati nella directory corrente eventuali sottodirectory.


-16

Potresti aver effettuato un ripristino software a un certo punto, puoi risolvere questo problema facendo

git add .
git reset --hard HEAD~100
git pull

7
Non credo sia questo ciò che voleva OP. Entrambe le altre risposte fanno un lavoro molto migliore nel mostrare effettivamente come risolvere questo problema.
Avery,

1
Questo può anche essere lento se hai molti file da aggiungere.
Devin G Rhode,

4
totalmente indipendente.
Azeem Hassni,

1
In questo modo, i file non tracciati vengono rimossi. Ma come programmatori, tutti dovrebbero cercare di trovare la soluzione corretta ai problemi senza usare soluzioni alternative e sorridere.
Yuresh Karunanayake,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.