2009-12-28 29 views
22

In precedenza, ho commesso un codice che al momento sembrava una buona idea, ma in effetti ha peggiorato le cose. Mi piacerebbe rimuovere la modifica dalla cronologia perché non è utile, e rebase tutti i commit da allora - dovrebbero fondersi tutti senza problemi.GIT annulla un commit che non è il più recente, rebase tutti i commit dal

Ho cercato di creare un nuovo ramo (chiamato newMaster) immediatamente prima del cattivo commit (con GitX), fuori controllo e in esecuzione:

git rebase -i master 

Quale AFAICS dovrebbe mi hanno dato una lista dei commit sul maestro e l'opzione di unirli o non unirli, ma invece dice noop e inoltra velocemente newMaster per essere uguale a master.

Qual è il modo più semplice per fare ciò di cui ho bisogno?

risposta

12

git rebase -i è il comando corretto, ma si desidera eseguirlo dal ramo con le ultime modifiche e passare la revisione che è la "base" dell'operazione rebase (la revisione immediatamente precedente al commit errato). Quindi, se è stato creato un ramo last-good-commit che punta alla ultima buona commettere, si desidera eseguire il seguente mentre sul master:

git rebase -i last-good-commit 
+3

Fornire più argomenti può renderlo anche più intuitivo - 'git rebase -i last-good-commit master' fa la stessa cosa (controlla master e rebase usando last-good-commit come base). – Cascabel

29

Il modo più semplice per eseguire ciò che si desidera è continuare (o ricontrollare) il ramo che si desidera modificare ed eseguire qualcosa di simile.

git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit> 

Ciò rebase tutto quanto il cattivo commit sulla madre di commettere male, rimuovendo in modo efficace il cattivo commiit dalla storia del ramo corrente. Ovviamente dovrai risolvere eventuali conflitti se si verificano.

+7

Uno remoto: questo ha distrutto la mia repository . – Malvolio

+1

Devi fare un 'git push --force' perché funzioni. Ma sii * molto * attento a questo. – redolent

2

Utilizzando rebase, non ero in grado di spingere le modifiche al telecomando, e il mio rebase è stato cancellato ad ogni tiro.

sono riuscito a ritornando una precisa commit (non l'ultimo) con, semplicemente:

git revert <sha-of-bad-commit> 

E poi mi è stato anche in grado di spingere il punto dati

+0

Se si esegue il rebase dopo un push, è necessario forzare il push usando 'git push -f'. Usalo con estrema cautela poiché potresti cancellare le modifiche di altre persone sulla destinazione. – rjmunro

Problemi correlati