Rollback all'ultimo commit git


120

Ho appena fatto un file

git commit -m "blah"

poi ho aggiunto alcuni file, come faccio a ripristinare e rimuovere ciò che è nei miei file attuali che non sono ancora stati aggiunti / salvati?


15
no, questo non è ciò che sta chiedendo l'OP: è chiaro che vuole tornare all'ultimo commit, non annullare l'ultimo commit. non ha detto di aver aggiunto alcuni file e poi li ha impegnati. quindi chiaramente vuole l'ultimo commit.
Paul,

1
È troppo difficile trovare una risposta a questa domanda super comune
Sam

Risposte:


211

Caveat Emptor - Comandi distruttivi avanti.

Mitigazione : git reflog può salvarti se ne hai bisogno.


1) ANNULLA le modifiche ai file locali e MANTIENI il tuo ultimo commit

git reset --hard

2) ANNULLA le modifiche al file locale e RIMUOVI l'ultimo commit

git reset --hard HEAD^

3) MANTENERE le modifiche ai file locali e RIMUOVERE il tuo ultimo commit

git reset --soft HEAD^

20
Questo comando cancellerà il tuo commit precedente, quindi usalo con cautela! git reset --hard è più sicuro
rudivonstaden

9
WTF è la risposta corretta con 36 voti positivi. Ho appena perso un giorno di lavoro per questo ... perché ho letto la risposta non il commento. Questa non è la risposta corretta alla domanda!
Chris Nevill

1
OK, non tutto è perduto! Puoi fare git reflog che ti permetterà di vedere i commit che hai fatto prima del ripristino. È quindi possibile effettuare il checkout di tali commit
Chris Nevill

3
Per quello che vale, avevo interpretato la domanda dell'OP come "come faccio a ripristinare il commit e rimuovere i file correnti", ma era e rimane ambigua. Avrei capito diversamente se l'OP avesse semplicemente detto "come faccio a rimuovere i file correnti che non sono stati aggiunti o
salvati

2
Git è l'antitesi dell'affermazione di Alan Kays Le cose semplici dovrebbero essere semplici, le cose complesse dovrebbero essere possibili. ... soprattutto della sua prima parte. Comunque, grazie per la tua risposta. ha aiutato.
0xC0000022L

46

Se desideri rimuovere i contenuti e i file appena aggiunti che sono già messi in scena (quindi aggiunti all'indice), utilizza:

git reset --hard

Se vuoi rimuovere anche il tuo ultimo commit (è quello con il messaggio "blah") allora meglio usare:

git reset --hard HEAD^

Per rimuovere i file non tracciati (quindi i nuovi file non ancora aggiunti all'indice) e le cartelle utilizzare:

git clean --force -d

git reset --hard HEAD ^ rimuove il mio ultimo commit in modo permanente? come se non potessi tornare indietro?
user137717

sembra che "git clean --force -d" rimuova anche le cartelle .gitignored
Alexey Timokhin

15

git reset --hard forzerà la directory di lavoro a tornare all'ultimo commit ed eliminerà i file nuovi / modificati.


2
l'ho fatto, ma i file sono ancora lì. (i file non tracciati sono ancora lì)
Blankman

in questo caso potresti fare un "git stash"
jacktrade

3
votato positivamente perché questa è l'unica risposta chiara e inequivocabile alla domanda chiara e univoca del PO.
Paul,

4

È possibile annullare un commit utilizzando git revert HEAD^per ripristinare il penultimo commit. Puoi anche specificare il commit da ripristinare utilizzando l'id invece di HEAD ^


Questo non "ripristina" nel senso che stai dicendo. Questo crea un commit inverso.
Stefan Kendall

4

Se vuoi solo annullare l'ultimo commit usa questo:

git reset HEAD~

funziona come un fascino per me.


2
questa è la risposta esatta alla domanda
Deniz Kocaboğa

questa dovrebbe essere la risposta approvata
amiabl

3

Un modo semplice e infallibile per ANNULLARE le modifiche ai file locali dall'ultimo commit è inserirle in un nuovo ramo:

git branch changes
git checkout changes
git add .
git commit

Questo lascia le modifiche nel nuovo ramo. Torna al ramo originale per ritrovarlo all'ultimo commit:

git checkout master

Il nuovo ramo è un buon posto per praticare diversi modi per annullare le modifiche senza il rischio di rovinare il ramo originale.

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.