git annulla tutte le modifiche non confermate o non salvate


834

Sto cercando di annullare tutte le modifiche dal mio ultimo commit. Ho provato git reset --harde git reset --hard HEADdopo aver visto questo post . Ora rispondo con la testa a 18c3773 ... ma quando guardo la mia fonte locale tutti i file sono ancora lì. Cosa mi sto perdendo?


1
Questa è una grande risorsa direttamente da Github: Come annullare (quasi) qualsiasi cosa con Git
jasonleonhard

Facile da capire e semplice da leggere: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Risposte:


1620
  • Questo annullerà la messa in scena di tutti i file che potresti aver messo in scena git add:

    git reset
    
  • Questo ripristinerà tutte le modifiche locali non impegnate (dovrebbe essere eseguito in repo root):

    git checkout .
    

    Puoi anche ripristinare le modifiche non confermate solo in un determinato file o directory:

    git checkout [some_dir|file.txt]
    

    Ancora un altro modo per ripristinare tutte le modifiche non impegnate (più lunghe da digitare, ma funziona da qualsiasi sottodirectory):

    git reset --hard HEAD
    
  • Questo rimuoverà tutti i file locali non tracciati , quindi rimangono solo i file tracciati git:

    git clean -fdx
    

    ATTENZIONE: -x rimuoverà anche tutti i file ignorati, inclusi quelli specificati da .gitignore! Si consiglia di utilizzare -nper l'anteprima dei file da eliminare.


Per riassumere: eseguire i comandi di seguito equivale sostanzialmente al nuovo git clonesorgente originale (ma non scarica nuovamente nulla, quindi è molto più veloce):

git reset
git checkout .
git clean -fdx

Un utilizzo tipico di questo sarebbe negli script di compilazione, quando è necessario assicurarsi che il proprio albero sia assolutamente pulito, non abbia alcuna modifica o file di oggetti creati localmente o oggetti di compilazione e si desidera farlo funzionare molto velocemente e non clonare l'intero repository ogni volta.


@turibe è giusto. Ho dovuto iniziare il mio progetto più volte perché stava rimuovendo tutte le dipendenze scaricate e la mia cartella .idea. Hai bisogno di una soluzione migliore.
EresDev,

2
@EresDev, non è necessario eseguire git clean, annullerà le modifiche non confermate ma manterrà tutti i file non tracciati o aggiunti. Tuttavia, può influire sul risultato della compilazione perché alcuni file non tracciati potrebbero interferire. Ad esempio, se la tua directory .idea fosse corrotta?
mvp,

git resetmi dice che ho delle modifiche che devo salvare
Daniel Springer,

1
running ha git clean -fdxeliminato my node_modulese .env, great
fires3as0n il

1
@ fires3as0n Cos'altro ti aspettavi? Questo doveva succedere. C'è un avvertimento anche nella risposta.
Rishav,

148

Se desideri " annullare " tutte le modifiche non confermate, esegui semplicemente:

git stash
git stash drop

Se si dispone di file non tracciati (verificare eseguendo git status), questi possono essere rimossi eseguendo:

git clean -fdx

git stashcrea un nuovo stash che diventerà stash @ {0} . Se si desidera verificare prima, è possibile eseguire git stash listper visualizzare un elenco dei blocchi. Sarà simile a:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Ogni scorta prende il nome dal precedente messaggio di commit.


2
Una buona soluzione davvero, ma è necessario mettere in scena i cambiamenti utilizzando git add .prima git stashperché mi mostrava cambiamenti non ancora git stash
commessi


12

Sto usando l'albero dei sorgenti .... Puoi ripristinare tutte le modifiche non confermate con 2 semplici passaggi:

1) è sufficiente ripristinare lo stato del file dell'area di lavoro

inserisci qui la descrizione dell'immagine 2) selezionare tutti i file di unstage (comando + a), fare clic con il tasto destro e selezionare Rimuovi

inserisci qui la descrizione dell'immagine

È così semplice: D


Se si reimposta e quindi si modifica il ramo e si reinizializza sul ramo ripristinato, ciò danneggerà. Il ripristino è utile, ma non deve essere utilizzato per eliminare le modifiche non confermate. In caso di interruzione delle modifiche non impegnate, conservare e rilasciare la scorta.
Dinu Nicolae,

11

Quello che faccio è

git add . (adding everything)
git stash 
git stash drop

Una fodera: git add . && git stash && git stash drop


questo è il migliore
Madrugada,

7

Per coloro che sono arrivati ​​qui cercando di annullare git clean -f -d, con la cancellazione di un file creato in Eclipse ,

Puoi fare lo stesso dall'interfaccia utente usando "ripristina dalla cronologia locale" per ref: Ripristina dalla cronologia locale


3
Non ho espresso il mio voto negativo, tuttavia la tua risposta è tutt'altro che chiara sulle tue intenzioni; sarebbe di aiuto se tu dovessi riformulare la prima frase nella risposta.
Mark Schultheiss,

5

Stati che passano da un commit a nuovo commit

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Azione per la transizione di stato

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Controlla diff

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Ripristina l'ultimo commit

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Equivalente al clone git, senza scaricare di nuovo nulla

git reset && git checkout . && git clean -fdx

Non vedo come questo si collega alla domanda posta. Questa è solo una serie di strane ricette, senza alcuna vera sostanza.
mvp,
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.