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.