Annullamento di un rebase git



Answers

In realtà, rebase salva il punto di partenza in ORIG_HEAD quindi di solito è semplice come:

git reset --hard ORIG_HEAD

Tuttavia, il reset , rebase e merge tutti salvano il tuo puntatore HEAD originale in ORIG_HEAD , quindi, se hai eseguito uno qualsiasi di questi comandi dal rebase che stai tentando di annullare, dovrai utilizzare il reflog.

Question

Qualcuno sa come annullare facilmente un rebase git?

L'unico modo che viene in mente è quello di andare manualmente:

  • git checkout il commit genitore in entrambi i rami
  • quindi creare un ramo temporaneo da lì
  • cherry-pick tutto si commette a mano
  • sostituire il ramo in cui sono stato ribaltato dal ramo creato manualmente

Nella mia situazione attuale funzionerà perché posso facilmente individuare i commit da entrambe le branche (una era la mia roba, l'altra era roba del mio collega).

Tuttavia, il mio approccio mi sembra subottimale e soggetto a errori (diciamo che ho appena ripreso con 2 dei miei rami personali).

Qualche idea?

Chiarimento: sto parlando di un rebase durante il quale un gruppo di commit è stato ripetuto. Non solo uno.




Seguendo la soluzione di @Allan e @Zearin, vorrei poter fare semplicemente un commento, ma non ho abbastanza reputazione, quindi ho usato il seguente comando:

Invece di fare git rebase -i --abort (notare il -i ) dovevo semplicemente fare git rebase --abort ( senza il -i ).

Usando sia -i che --abort allo stesso tempo, Git mi mostra un elenco di utilizzo / opzioni.

Quindi il mio precedente e attuale stato filiale con questa soluzione è:

matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc /my/project/environment (branch-123)
$



Diciamo che rebase master al mio branch e ottengo 30 nuovi commit che rompono qualcosa. Ho scoperto che spesso è più semplice rimuovere i cattivi commit.

git rebase -i HEAD~31

Rebase interattivo per gli ultimi 31 commit (non fa male se si scelgono troppi).

Basta prendere i commit che vuoi eliminare e contrassegnarli con "d" anziché "pick". Ora i commit vengono cancellati in modo efficace annullando il rebase (se si rimuovono solo i commit che si sono appena ottenuti durante il ribasamento).




Per cancellare, puoi inserire il seguente comando:

git -c core.quotepath=false rebase --abort



Nel caso in cui non hai completato il rebase e nel mezzo di esso, i seguenti lavori:

git rebase --abort



Per più commit, ricorda che ogni commit fa riferimento a tutta la cronologia che porta a quel commit. Quindi, nella risposta di Charles, leggi "il vecchio commit" come "il più nuovo dei vecchi commit". Se si resetta a quel commit, riapparirà tutta la cronologia che porta a quel commit. Questo dovrebbe fare quello che vuoi.




Reimpostare il ramo sull'oggetto di commit penzolante del suo vecchio suggerimento è ovviamente la soluzione migliore, perché ripristina lo stato precedente senza impiegare alcuno sforzo. Ma se ti capita di aver perso tali commit (ad esempio perché hai raccolto il tuo repository nel frattempo, o si tratta di un nuovo clone), puoi sempre rebase di nuovo al ramo. La chiave per questo è l' --onto .

Supponiamo che tu abbia un argomento chiamato immaginariamente topic , che hai diramato il master quando la punta del master era il commit 0deadbeef . Ad un certo punto mentre si git rebase master sul ramo topic , hai eseguito git rebase master . Ora vuoi annullare questo. Ecco come:

git rebase --onto 0deadbeef master topic

Questo prenderà tutti i commit su topic che non sono sul master e li 0deadbeef su 0deadbeef .

Con --onto , puoi riorganizzare la tua storia praticamente in qualsiasi forma .

Divertiti. :-)




Related