Er der nogen der ved, hvordan man nemt kan fortryde en Git Rebase?
Den eneste måde, jeg kan komme i tanke om, er at gøre det manuelt:
I min nuværende situation vil dette fungere, fordi jeg nemt kan spotte commits fra begge grene (den ene var mine ting, den anden var min kollega's ting).
Men min fremgangsmåde virker på mig som suboptimal og fejlbehæftet (lad's sige jeg lige havde rebaset med 2 af mine egne grene).
Nogen ideer?
Præcisering: I'm taler om en rebase, hvorunder en masse commits blev afspillet igen. Ikke kun én.
Den nemmeste måde ville være at finde hovedcommittet for grenen, som det var umiddelbart før rebasen startede i reflog...
git reflog
og nulstille den aktuelle gren til den (med de sædvanlige forbehold om at være helt sikker, før man nulstiller med --hard
-indstillingen).
Antag at den gamle commit var HEAD@{5}}
i ref-loggen:
git reset --hard HEAD@{5}
I Windows skal du muligvis citere referencen:
git reset --hard "HEAD@{5}"
Du kan tjekke historikken for det gamle kandidathoved ved blot at lave en git log HEAD@{5}}
(Windows: git log "HEAD@{5}"
).
Hvis du ikke har deaktiveret reflogs pr. gren, burde du kunne lave git reflog branchname@{1}
, da en rebase løsner grenhovedet, før det genhæftes til det endelige hoved. Jeg ville dog dobbelttjekke dette, da jeg ikke har verificeret dette for nylig.
Som standard er alle reflogs aktiveret for ikke-bare repositories:
[core]
logAllRefUpdates = true
At nulstille grenen til det dinglende commit-objekt i dens gamle tip er naturligvis den bedste løsning, fordi det genopretter den tidligere tilstand uden at bruge nogen anstrengelser. Men hvis du tilfældigvis har mistet disse commits (f.eks. fordi du i mellemtiden har skralde-samlet dit repository, eller fordi det er en frisk klon), kan du altid basere grenen igen. Nøglen til dette er --onto
-switchen.
Lad os sige, at du havde en topic-gren, der fantasifuldt blev kaldt topic
, som du branchede fra master
, da spidsen af master
var 0deadbeef
-kommittet. På et tidspunkt, mens du var på topic
-grenen, foretog du git rebase master
. Nu ønsker du at fortryde dette. Her er hvordan:
git rebase --onto 0deadbeef master topic
Dette vil tage alle commits på topic
, som ikke er på master
, og afspille dem igen oven på 0deadbeef
.
Med --onto
, kan du omarrangere din historik i stort set nogen form som helst.
God fornøjelse. :-)
For flere commits skal du huske, at ethvert commit refererer til al historik, der fører op til det pågældende commit. Så i Charles' svar skal du læse "den gamle commit" som "den nyeste af de gamle commits". Hvis du nulstiller til dette commit, vil al historikken op til dette commit blive vist igen. Dette burde gøre det, du ønsker.