git-rebase undo abort - Annullamento di un rebase git





7 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.

rollback example vs

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.




Reimpostare il ramo sull'oggetto di impegno pendente del suo vecchio suggerimento è ovviamente la soluzione migliore, poiché 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. :-)




Nel caso in cui avessi spinto il tuo ramo nel repository remoto (di solito è di origine) e poi hai eseguito un rebase di successo (senza unione) ( git rebase --abort dà "No rebase in progress") puoi facilmente resettare il ramo usando il comando:

git reset --hard source / {branchName}

Esempio:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean



Sono sorpreso che nessuno abbia menzionato questo qui ancora. Rebase lascia il vecchio stato come ORIG_HEAD , quindi puoi ripristinare l'ultimo rebase eseguendo:

git reset --hard ORIG_HEAD



L'uso di reflog non ha funzionato per me.

Ciò che ha funzionato per me è stato simile a quello descritto here . Apri il file in .git / logs / refs chiamato dopo il ramo che è stato ridefinito e trova la riga che contiene "rebase finsihed", qualcosa come:

5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

Controlla il secondo commit elencato sulla linea.

git checkout 88552c8f

Una volta confermato ciò conteneva i miei cambiamenti persi, mi sono ramificato e ho tirato un sospiro di sollievo.

git log
git checkout -b lost_changes



Se riesci a rebasare con successo contro il ramo remoto e non riesci a git rebase --abort puoi ancora fare qualche trucco per salvare il tuo lavoro e non avere spinte forzate. Supponiamo che il tuo ramo corrente che è stato ributtato per errore sia chiamato your-branch e stia seguendo l' origin/your-branch

  • git branch -m your-branch-rebased # git branch -m your-branch-rebased ramo attuale
  • git checkout origin/your-branch # checkout allo stato più recente che è noto per origine
  • git checkout -b your-branch
  • controlla git log your-branch-rebased , confronta git log your-branch e definisci commit che mancano dal your-branch
  • git cherry-pick COMMIT_HASH per ogni commit nel your-branch-rebased
  • spingere le tue modifiche. Tieni presente che due filiali locali sono associate a remote/your-branch e che devi solo inviare il your-branch



Se si incasina qualcosa all'interno di un rebase git, ad es. git rebase --abort , mentre si hanno file non salvati, questi andranno persi e git reflog non aiuterà. Questo è successo a me e tu dovrai pensare fuori dagli schemi qui. Se sei fortunato come me e utilizzi IntelliJ Webstorm, puoi fare right-click->local history e ripristinare uno stato precedente dei tuoi file / cartelle, indipendentemente dagli errori che hai commesso con il software di controllo delle versioni. È sempre bene avere un altro funzionamento in sicurezza.




Related