Come posso annullare un `git commit` localmente e su un telecomando dopo` git push`


242

Mi sono esibito git commitseguito da un git push. Come posso ripristinare quella modifica sia su repository locali che remoti?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

Risposte:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(Esempio spinta: git push -f origin bugfix/bug123)

Ciò annullerà l'ultimo commit e invierà la cronologia aggiornata al telecomando. Devi passare il -fperché stai sostituendo la cronologia a monte nel telecomando.


24
In alternativa, utilizzare git reset --hard <the-sha-you-want-to-return-to>.
Alexander Groß,

2
Il riferimento si chiama HEAD (case sensitive)
dunni il

26
Inoltre, fai attenzione: AFAIK non dovresti farlo se altre persone si sono ritirate dal repository.
Amadan,

1
@BipinVayalu Influisce sul ramo in cui ti trovi attualmente. Più precisamente, la TESTA. Il HEAD è spesso "attaccato" a un ramo (che punta al nome di un ramo invece che direttamente a un commit). Quindi, in generale, influenzerà i rami che HEAD indica. Utilizzare git log --decorate --onelineper scoprire dove punta HEAD.
Alexander Groß,

4
git reset HEAD~1se non si desidera che le modifiche vengano eliminate (modifiche non messe in scena). Cambia, git push -f [origin] [branch]
esegui il

161

Generalmente, effettua un commit "inverso", usando:

git revert 364705c

quindi inviarlo al telecomando come al solito:

git push

Questo non eliminerà il commit: effettua un commit aggiuntivo che annulla qualunque cosa abbia fatto il primo commit. Nient'altro, non molto sicuro, soprattutto quando i cambiamenti sono già stati propagati.


9
Questa è una risposta più sicura (quindi probabilmente migliore) della risposta di Alexander Groß (la risposta scelta).
Graeck,

6
@Graeck Ognuna delle soluzioni ha le sue implicazioni e meriti.
Alexander Groß,

5
Questa dovrebbe essere la risposta accettata, è buona prassi non sovrascrivere mai la storia, ancor di più se si collabora con un team. git resetè accettato solo se non hai ancora inviato le modifiche al server.
Josue Alexander Ibarra,

17
@JosueIbarra Non sono d'accordo per tutti i casi. Nella maggior parte dei casi, sì, non dovresti sovrascrivere la cronologia. Tuttavia, credo che ci siano casi legittimi in cui dovresti assolutamente farlo. Ad esempio, si commette accidentalmente e si esegue il push up del file dei segreti. Quello non dovrebbe essere nel repository git. Quindi puoi rimuoverlo rapidamente usando la risposta accettata qui.
bfcoder

11
@bfcoder se hai inserito un "segreto" in un repository remoto, non è più un segreto. E la soluzione corretta è creare un nuovo segreto, non cercare di nascondere il tuo errore.
Erbsman,

41

Prima di tutto, rilassati.

"Nulla è sotto il nostro controllo. Il nostro controllo è pura illusione.", "Errare è umano"

Ho capito che hai spinto involontariamente il tuo codice in remote-master. Questo andrà bene.

1. Inizialmente, ottenere il SHA-1valore del commit che si sta tentando di restituire, ad es. Commit sul ramo principale. esegui questo:

git log

vedrai un mucchio di 'f650a9e398ad9ca606b25513bd4af9fe ...' come stringhe insieme a ciascuna delle commit. copia quel numero dal commit che vuoi restituire .

2. Ora, digita sotto il comando:

git reset --hard your_that_copied_string_but_without_quote_mark

dovresti vedere un messaggio come "HEAD is now at". sei in chiaro. Quello che ha appena fatto è riflettere quel cambiamento a livello locale.

3. Ora, digita sotto il comando:

git push -f

dovresti vedere come

"avviso: push.default non è impostato; il suo valore implicito è cambiato in ..... ... Totale 0 (delta 0), riutilizzato 0 (delta 0) ... ... your_branch_name -> master (aggiornamento forzato) ".

Ora, siete tutti chiari. Controlla di nuovo il master con "git log", il tuo fixed_destination_commit dovrebbe essere in cima alla lista.

Prego (in anticipo;))

AGGIORNARE:

Ora, i cambiamenti che avevi fatto prima che iniziassero tutti, ora sono spariti. Se vuoi riportare di nuovo quei duri lavori, è possibile. Grazie a git reflog e ai comandi git cherry-pick .

Per questo, suggerirei di seguire questo blog o questo post .


è buona norma specificare anche il telecomando e il ramo quando si fa "git push -f", ma "git push -f" funzionerà comunque la maggior parte delle volte
Robson

8

git reset HEAD~1se non si desidera che le modifiche vengano eliminate (modifiche non messe in scena). Cambia, commetti e premi di nuovogit push -f [origin] [branch]


3

Puoi fare un rebase interattivo:

git rebase -i <commit>

Questo farà apparire l'editor predefinito. Basta eliminare la riga contenente il commit che si desidera rimuovere per eliminare quel commit.

Ovviamente, avrai bisogno di accedere al repository remoto per applicare anche questa modifica.

Vedi questa domanda: Git: rimozione dei commit selezionati dal repository


3

Prova a usare

git reset --hard <commit id> 

Nota: qui l'id di commit indica l'id del commit a cui si desidera andare ma non l'id che si desidera ripristinare. questo è stato l'unico punto in cui sono rimasto bloccato.

quindi spingere

git push -f <remote> <branch>

2

In alternativa:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Forza il ramo principale del repository remoto di origine sul padre dell'ultimo commit

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.