Domanda Annullamento di un rebase git


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.


2427
2017-09-25 17:59


origine


risposte:


Il modo più semplice sarebbe quello di trovare il commit della testa del ramo com'era immediatamente prima che il rebase iniziasse nel reflog...

git reflog

e resettare il ramo corrente su di esso (con i soliti avvertimenti circa l'assoluta certezza prima di resettare con il --hard opzione).

Supponiamo che il vecchio commit sia stato HEAD@{5} nel registro di rif:

git reset --hard HEAD@{5}

In Windows, potrebbe essere necessario citare il riferimento:

git reset --hard "HEAD@{5}"

Puoi controllare la storia del candidato vecchio capo semplicemente facendo un git log HEAD@{5} (Finestre:  git log "HEAD@{5}").

Se non hai disabilitato i reflog per branch devi essere in grado di farlo semplicemente git reflog branchname@{1} come un rebase stacca la testa del ramo prima di riattaccare alla testa finale. Vorrei ricontrollare questo, anche se non l'ho verificato di recente.

Per impostazione predefinita, tutti i diagrammi vengono attivati ​​per i repository non nudi:

[core]
    logAllRefUpdates = true

3358
2017-09-25 19:56



In realtà, rebase salva il tuo punto di partenza ORIG_HEAD quindi questo è solitamente semplice come:

git reset --hard ORIG_HEAD

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


1165
2018-03-28 13:24



La risposta di Charles funziona, ma potresti voler fare questo:

git rebase --abort

pulire dopo reset.

Altrimenti, potresti ricevere il messaggio "Interactive rebase already started”.


317
2017-07-27 18:21



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 di questo è il --onto interruttore.

Supponiamo che tu abbia immaginato un ramo tematico chiamato topic, che ti sei staccato master quando la punta di master era la 0deadbeef commettere. Ad un certo punto mentre sul topic ramo, l'hai fatto 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 attivi master e riproducili sopra 0deadbeef.

Con --onto, puoi riorganizzare la tua cronologia in più o meno qualsiasi forma.

Divertiti. :-)


74
2017-09-26 02:08



Io in realtà metto un tag di backup sul ramo prima di fare qualsiasi operazione non banale (la maggior parte dei rebase è banale, ma lo farei se sembra un po 'complessa).

Quindi, ripristinare è facile come git reset --hard BACKUP.


61
2018-05-12 20:57



Nel caso avevi spinto il tuo ramo nel repository remoto (di solito è di origine) e quindi hai eseguito un rebase di successo (senza unione) (git rebase --abort dà "No rebase in progress") puoi facilmente resettare il ramo utilizzando 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

52
2017-09-28 12:43



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

git rebase --abort

48
2017-10-15 20:20



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.


13
2017-09-25 21:36