Rimuovere un commit git che non è stato inviato


724

Ho fatto un git commitma non l'ho ancora spinto nel repository. Quindi, quando lo faccio git status, ottengo '# Il tuo ramo è davanti a' master 'di 1 commit.

Quindi, se voglio ripristinare il mio commit principale, posso semplicemente fare:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

dato che quando lo faccio git logottengo:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Data: mar 29 set 11:21:41 2009 -0700


commit db0c078d5286b837532ff5e276dcf91885df2296
Data: mar 22 set 10:31:37 2009 -0700

9
Questa domanda sembra essere un duplicato di un'altra delle tue domande: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell,



3
PERICOLO: reset --hardpuò comportare la perdita di lavoro, perché così facendo si ottiene la sovrascrittura dei file locali (i nuovi lavori) con quelli del web (mi è successo). Domande e risposte su git dovrebbero indicare esplicitamente cosa stanno facendo i loro comandi e quali sono i rischi per i lettori.
OrangeSherbet,

Risposte:


673

In realtà, quando si utilizza git reset, si dovrebbe fare riferimento al commit che si sta reimpostando a ; quindi vorrai il db0c078commit, probabilmente.

Una versione più semplice sarebbe quella git reset --hard HEAD^di ripristinare il commit precedente prima dell'attuale head; in questo modo non è necessario copiare gli ID di commit.

Fai attenzione quando lo fai git reset --hard, poiché potresti perdere qualsiasi modifica non confermata che hai. Potresti voler controllare git statusper assicurarti che la tua copia di lavoro sia pulita o che desideri eliminare tutte le modifiche che ci sono.

Inoltre, al posto di HEAD puoi usare origin/mastercome riferimento, come suggerito da @bdonlan nei commenti:git reset --hard origin/master


374
Oppure git reset --hard origin/master, per ripristinarlo a qualunque sia l'origine.
bdonlan,

1
Un altro puntatore utile su cui è possibile reimpostare è ORIG_HEAD o la sua generalizzazione utilizzando reflog HEAD @ {1} (l'ultima posizione di HEAD).
Jakub Narębski,

12
Lettore, prima di te il git resettuo codice. Fai un favore al tuo futuro: la differenza tra reset, reset --softe reset --hard(Cosa succede al tuo precedente git addaka "il tuo lavoro" :) Immagine: link
user18099

3
Si noti che ciò eliminerà tutto ciò che era nel commit che si desidera rimuovere (quindi a git statusnon mostrerà alcuna modifica e il commit verrà rimosso / le modifiche perse).
Bjørn Børresen,

12
NOTA: prestare attenzione quando si utilizza git reset --hard HEAD^poiché si perderanno le modifiche nei file sottoposti a commit (le modifiche verranno eliminate). Esistono due rami di questa domanda: per ripristinare un commit ma avere ancora delle modifiche sul disco, fallogit reset --soft HEAD~1
papigee

625

SE NON hai inviato le tue modifiche al telecomando

git reset HEAD~1

Controlla se la copia di lavoro è pulita da git status.

ALTRO hai inviato le tue modifiche al telecomando

git revert HEAD

Questo comando ripristinerà / rimuoverà l'ultimo commit / change e quindi puoi premere


34
Ciò risponde a "Rimuovere l'ultimo commit git che non è stato
inviato

25
Inoltre, mantiene le modifiche locali apportate nell'ultimo commit, mentre git si ripristina
Stanimir Stoyanov

1
per me, annullerà l'ultimo commit spinto e unpushed commit
CodyChan

git ripristina HEAD per me ha appena cancellato tutti i file che ero pronto a inviare. Stai attento!
Jason Bruce il

159
git reset --hard origin/master

per resettarlo a qualunque sia l'origine.

Questo è stato pubblicato da @bdonlan nei commenti . Ho aggiunto questa risposta per le persone che non leggono i commenti.


4
Questa domanda è stata posta quasi 5 anni fa, e questo è già in uno dei commenti.
Anubian Noob,

1
Cosa succede se l'attuale filiale locale differisce da master- dovrei usare origin/mybranchallora?
Pavel Vlasov,

9
Di solito non leggo i commenti quando ho fretta per una risposta ... Grazie per avermi messo una risposta (una semplice che funziona)
Leonardo Alves Machado,

Attenzione: tieni presente che questo rimuoverà tutte le modifiche al codice esistenti, a parte le git reset HEAD~quali ripristina solo il commit nel codice
Mayer Spitzer,

70

Esistono due rami di questa domanda (Il rollback di un commit non significa che voglio perdere tutte le mie modifiche locali):

1. Per ripristinare le ultime modifiche di commit ed eliminare le modifiche nel file di commit :

git reset --hard HEAD~1

2. Per ripristinare l'ultimo commit ma conservare le modifiche locali (su disco), procedere come segue:

git reset --soft HEAD~1

Questo (il comando successivo) ti porterà allo stato in cui ti saresti trovato git add.

Se si desidera annullare la messa in scena dei file, procedere come segue

git reset

Ora è possibile apportare ulteriori modifiche prima di aggiungere e quindi eseguire nuovamente il commit.


47

Digita semplicemente la console:

$ git reset HEAD~

Questo comando ignora tutti i commit locali prima di HEAD remoto


7
Puoi spiegare cosa aggiunge la tua risposta rispetto alle risposte esistenti?
nvoigt,

Questo cancella l'attuale impegno prima di spingere - senza ripristinare le modifiche apportate localmente - come le altre risposte - che potrebbe essere un grave momento di ritiro dei capelli
Concedi il

43

Credo che uno di questi soddisfi le tue esigenze

1 - Annulla il commit e mantieni tutti i file in scena: git reset --soft HEAD~;

2 - Annulla il commit e ripristina tutti i file: git reset HEAD~;

3 - Annulla il commit e rimuovi completamente tutte le modifiche: git reset --hard HEAD~;

ecco dove ho trovato la risposta


Questa risposta deve essere accettata: D
Aaron John Sabu,

30

Rimuovere l'ultimo commit prima del push

git reset --soft HEAD~1

1indica l'ultimo commit, se si desidera rimuovere due ultimi usi 2e così via *


3
Ciao Karina, la menzione di --softè un'ottima aggiunta alle possibili risposte, ma potresti anche menzionare il perché? Spiegare la tua soluzione è sempre utile. Prova anche a rimanere con l'inglese. Grazie
Vlastimil Ovčáčík,

1
--soft- ti assicura di non perdere le modifiche al file di cui stai tentando di annullare il
commit

19

Ho vissuto la stessa situazione in cui ho fatto quanto di seguito molto più facile. Passando commit-Idpuoi raggiungere il particolare impegno che vuoi andare:

git reset --hard {commit-id}

Per rimuovere l'ultimo commit, è necessario passare il punto in commit-Idcui è necessario spostare il puntatore:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Solo un avvertimento per i neofiti come me: eseguire il backup di tutti i file in cui si desidera conservare le modifiche, poiché verranno ripristinate alla versione precedente. Il mio scenario è stato quello di inserire accidentalmente un dump del database nella mia directory di repository e quindi eseguire il commit: ovviamente non volevo eseguire il commit di quei file nel repository, ma DID voleva mantenere le modifiche che avevo apportato ad altri file. Quindi ho dovuto copiare e incollare le modifiche richieste dal backup che ho fatto PRIMA di eseguire il reset di git.
user1063287

10

Questo è ciò che faccio:

Prima controlla la tua filiale (per la mia masterfiliale del caso ):

git checkout master

Quindi ripristina HEAD ^ remoto ( rimuoverà tutte le modifiche locali ), forza la pulizia e tira:

git reset HEAD^ --hard && git clean -df && git pull

1
È un'opzione molto nucleare. Suggerirei il soft reset al commit limitato.
c0der512,

3

Un modo sarebbe quello di eliminare la succursale locale e di verificare quella succursale dal server se la succursale locale è in anticipo rispetto al remoto da più commit e devi annullare il commit di tutti.


risposta brillante - permette di cliccarlo facilmente in sourcetree :)
Kamil Kiełczewski

1

Ho appena avuto lo stesso problema e ho finito per fare:

git rebase -i HEAD~N

(N è il numero di commit che git ti mostrerà)

Ciò richiede il tuo editor di testo e quindi puoi rimuovere il commit desiderato eliminando la riga ad esso associata.

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.