git: annulla tutte le modifiche alla directory di lavoro inclusi i nuovi file


1151

Come eliminare tutte le modifiche dalla directory di lavoro inclusi i nuovi file non monitorati. So che lo git checkout -ffa, ma non cancella i nuovi file non tracciati creati dall'ultimo commit.

Qualcuno ha idea di come farlo?


1
@Joel & Wayfarer: perché non provi git help resetegit help clean
SHernandez il

3
Fare un alias per questo nel tuo git config è una buona idea;)
anubina,

Risposte:


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)

Per vedere cosa verrà eliminato prima, senza effettivamente cancellarlo, usa il -nflag (questo è fondamentalmente un test-run). Quando sei pronto per eliminare effettivamente, quindi rimuovere il -nflag:

git clean -nfd


16
Nota: git reset --hard rimuove le modifiche graduali e le modifiche alla directory di lavoro. Inoltre, git clean -f -d è probabilmente un opposto migliore dell'aggiunta di un nuovo file non tracciato. Dalla domanda, il richiedente potrebbe essere abbastanza soddisfatto della sua attuale serie di file ignorati.
CB Bailey

7
Leggi la risposta successiva e fai attenzione al parametro -x. (Potrebbe anche rimuovere la tua configurazione locale come file password / db-settings. Es. Database.yml)
Boris

9
Quell'opzione -x non è necessaria e alquanto pericolosa in questo caso.
Tim Gautier,

66
git clean -fxdpuò effettivamente essere MOLTO pericoloso se non sai cosa stai facendo. Potresti finire per eliminare definitivamente alcuni file non tracciati molto importanti, come il tuo database, ecc. Fai attenzione.
Mason Stewart,

10
Si noti che git clean -f -deliminerà anche i file dalle cartelle ignorate. Quindi tutti i tuoi registri locali e cose del genere spariranno. Di solito non è un grosso problema, ma è meglio saperlo.
Cyriel,

299

Metodo più sicuro, che utilizzo frequentemente:

git clean -fd

Spiegazione della sintassi come da /docs/git-cleanpagina:

  • -f(alias:) --force. Se la variabile di configurazione Git clean.requireForce non è impostata su false, git clean rifiuterà di eliminare file o directory a meno che non sia dato -f, -n o -i. Git rifiuterà di eliminare le directory con la sottodirectory o il file .git a meno che non venga fornito un secondo -f.
  • -d. Rimuovere le directory non tracciate oltre ai file non tracciati. Se una directory non tracciata è gestita da un diverso repository Git, non viene rimossa per impostazione predefinita. Utilizzare l'opzione -f due volte se si desidera veramente rimuovere tale directory.

Come menzionato nei commenti, potrebbe essere preferibile fare una operazione git clean -ndche esegue una corsa a secco e ti dice cosa verrebbe cancellato prima di eliminarlo effettivamente.

Link alla git cleanpagina del documento: https://git-scm.com/docs/git-clean


124
git clean -nd .Prima di eliminare i file ho sempre usatogit clean -fd .
tbear

14
Perché? Puoi spiegare i dettagli per favore.
Greg B,

31
L' opzione clean -n per git è in realtà una corsa a secco che non rimuove nulla, ti mostra solo cosa verrà fatto.
RNickMcCandless

2
@tbear, puoi sempre fare uno spazio add -A+ commit -a+ revert headprima prima git clean. La revisione di ogni singola eliminazione semplicemente non si adatta agli scenari principali. Inoltre, la corsa a secco non è un proiettile d'argento: cosa succede se ti sei perso qualcosa o hai fatto un errore durante la recensione?
Pacerier,

1
Ciò rimuove i file, ma non annulla le modifiche.
donquixote

202

Per tutti i file non in scena utilizzare:

git checkout -- .

Alla .fine è importante.

È possibile sostituire .con un nome di sottodirectory per cancellare solo una sottodirectory specifica del progetto. Il problema è affrontato specificamente qui .


7
@Vincent: Il - evita errori di battitura dicendo al comando di checkout che non sono stati specificati altri parametri. Senza di loro potresti finire con un nuovo ramo invece di resettare quello attuale!
Igor Rodriguez,

2
Questa è la route più sicura, ma non rimuoverà i file non tracciati (file appena aggiunti).
TinkerTenorSoftware Acquista

5
Ciò non ripristina i file eliminati, ma non ancora impegnati.
Cerin

Cordiali saluti. Mi è mancato questo. Assicurarsi di essere nella directory in cui si desidera eliminare le modifiche non messe in scena. Ad esempio, ho avuto modifiche in 2 file diversi in posizioni diverse su un ramo, vale a dire: src/app/work/filename.jse ../app/working/test/filename.js. Basta usare git checkout -- .sul ramo solo cancellato il primo file ( senza il primo ../ ). Quindi ho dovuto cd ../accedere alla seconda directory di posizione per eliminare il secondo file usando quel comando.
Chris22,

57

Dai un'occhiata al git cleancomando.

git-clean - Rimuove i file non tracciati dall'albero di lavoro

Pulisce l'albero di lavoro rimuovendo in modo ricorsivo i file che non sono sotto il controllo della versione, a partire dalla directory corrente.

Normalmente, vengono rimossi solo i file sconosciuti a Git, ma se viene specificata l'opzione -x, vengono rimossi anche i file ignorati. Questo può, ad esempio, essere utile per rimuovere tutti i prodotti di compilazione.


Ho provato git clean -ie scelto "pulito" dal menu - questo finalmente rimosso nuovi file.
Sany

43

Le seguenti opere:

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

Si noti che ciò eliminerà le modifiche locali non messe in scena e messe in scena. Quindi dovresti impegnare tutto ciò che vuoi conservare, prima di eseguire questi comandi.

Un caso d'uso tipico: hai spostato molti file o directory in giro e poi vuoi tornare allo stato originale.

Crediti: https://stackoverflow.com/a/52719/246724


1
Perché fai riferimento a stash @ {0} anziché a solo git stash drop?
maikel,

Onestamente, non ricordo :)
donquixote

Questo ha funzionato. Come nota, assicurati di essere nella home directory ( git add -A .). Ho perso 30m perché non c'era corrispondenza tra i file. Grazie!
user9869932

Usavo questo approccio e ha dei meriti. Tuttavia, da allora ho trovato le soluzioni proposte da jfountain e Heath Dutton più adatte al problema originale, IMHO.
HeyZiko,

2
git stash drop stash @ {0} elimina l'ultimo stash se lo facessi gash stash
eliminerebbe

42

Puoi farlo in due passaggi:

  1. Ripristina file modificati: git checkout -f
  2. Rimuovi file non tracciati: git clean -fd

3
+1 perché semplice. Anche perché funziona e fa esattamente ciò che OP vuole senza spaventarli con omg questo cancellerà tutto.
Geekzster,

30

Ho pensato che fosse ( Attenzione: in seguito sarà spazzare via tutto )

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

Le resetmodifiche da annullare. Il cleandi cancellare qualunque non tracciata f iles e d irectories.


Questo non funziona, ricevo ancora un avviso di conflitto quando lo faccio git pulldopo: l' CONFLICT (content): Merge conflict in...ho risolto solo con ungit pull --strategy=ours
rubo77

7
git reset --hard origin/{branchName}

Elimina tutti i file non tracciati.


4

git clean -iti mostrerà prima gli elementi da eliminare e procederà dopo la tua conferma. Lo trovo utile quando si tratta di file importanti che non devono essere eliminati accidentalmente.

Vedere git help cleanper ulteriori informazioni, tra cui alcune altre opzioni utili.


4

Se si desidera annullare tutte le modifiche, è possibile utilizzare una delle opzioni valide in un alias in .gitconfig. Per esempio:

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

Uso: git discard


1
Questo alias mi piace moltissimo
flag

3

Una soluzione alternativa è quella di eseguire il commit delle modifiche e quindi eliminare tali commit. Questo non ha inizialmente un vantaggio immediato, ma apre la possibilità di impegnarsi in blocchi e di creare un tag git per il backup.

Puoi farlo sul ramo corrente, in questo modo:

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^^

Oppure puoi farlo su HEAD distaccato. (supponendo che inizi sul ramo 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

Tuttavia, ciò che di solito faccio è impegnarmi in blocchi, quindi nominare alcuni o tutti i commit come "DISCARD: ...". Quindi utilizzare il rebase interattivo per rimuovere i commit errati e mantenere quelli buoni.

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

Questo è più dettagliato, ma consente di rivedere esattamente quali modifiche si desidera annullare.

Le scorciatoie git lolegit lola sono state molto utili con questo flusso di lavoro.


3

Per una cartella specifica ho usato:

git checkout -- FolderToClean/*

3
Ciò non elimina i file non tracciati, come afferma OP.
vonbrand,

0

Questa è probabilmente una risposta noob, ma: io uso TortoiseGit per Windows e ha una bella funzione chiamata REVERT. Quindi, ciò che fai per ripristinare le modifiche locali non messe in scena non caricate è:

  1. visualizza un menu di scelta rapida per la cartella necessaria e seleziona Ripristina, mostra un popup di ripristino in cui è possibile selezionare i file modificati da ripristinare / ripristinare.
  2. Se vuoi anche eliminare i file aggiunti (che non sono ancora in git) fai clic su commit (dallo stesso menu contestuale) fa apparire il popup Commit e ti mostra i file aggiunti, quindi fai clic con il tasto destro su ciascuno di essi e scegli Elimina. Ma non premere Commit btn in questo popup, poiché non si desidera eseguire il commit, ma vedere solo i file aggiunti ed eliminarli da qui.
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.