Weet iemand hoe je gemakkelijk een git rebase ongedaan kan maken?
De enige manier die me te binnen schiet is om het handmatig te doen:
In mijn huidige situatie zal dit werken omdat ik makkelijk commits van beide branches kan vinden (de ene was mijn spul, de andere was van mijn collega's spul).
Maar mijn aanpak lijkt me suboptimaal en foutgevoelig (laten we zeggen dat ik net gerebashed had met 2 van mijn eigen branches).
Iemand een idee?
Verduidelijking: Ik'heb het over een rebase waarbij een heleboel commits zijn gereplayed. Niet slechts één.
De makkelijkste manier zou zijn om de hoofd commit van de branch te vinden zoals die was vlak voordat de rebase begon in de reflog...
git reflog
en de huidige branch daar naar terug te zetten (met de gebruikelijke waarschuwingen over absoluut zeker zijn voordat je terugzet met de --hard
optie).
Stel dat de oude commit HEAD@{5}}
was in het ref log:
git reset --hard HEAD@{5}
In Windows, moet je misschien de referentie citeren:
git reset --hard "HEAD@{5}"
Je kunt de geschiedenis van de kandidaat oude head controleren door gewoon een git log HEAD@{5}
te doen (Windows: git log "HEAD@{5}"
).
Als je niet per branch reflogs hebt uitgeschakeld zou je in staat moeten zijn om eenvoudig git reflog branchname@{1}
te doen, omdat een rebase de branch head loskoppelt voordat hij weer aan de uiteindelijke head wordt vastgemaakt. Ik zou dit echter dubbel controleren, want ik heb dit recentelijk niet geverifieerd.
Standaard zijn alle reflogs geactiveerd voor niet-bereikbare repositories:
[core]
logAllRefUpdates = true
De branch terugzetten naar het bungelende commit object van zijn oude punt is natuurlijk de beste oplossing, omdat het de vorige staat herstelt zonder enige moeite te hoeven doen. Maar als je toevallig die commits kwijt bent (bijvoorbeeld omdat je je repository in de tussentijd vuilgemaakt hebt, of dit een verse kloon is), dan kun je altijd de branch opnieuw baseren. De sleutel hiertoe is de --onto
schakeloptie.
Stel dat je een onderwerp branch had, fantasierijk genaamd topic
, die je van master
aftakelde toen de top van master
de 0deadbeef
commit was. Op een gegeven moment, terwijl je op de topic
branch was, deed je git rebase master
. Nu wil je dit ongedaan maken. Hier is hoe:
git rebase --onto 0deadbeef master topic
Dit neemt alle commits op topic
die niet op master
staan en speelt ze opnieuw af bovenop 0deadbeef
.
Met --onto
, kun je je geschiedenis in bijna elke vorm herschikken.
Veel plezier. :-)
Voor meervoudige commits, onthoud dat iedere commit alle historie die tot die commit geleid heeft, refereert. Dus in Charles' antwoord, lees "de oude commit" als "de nieuwste van de oude commits". Als je reset naar die commit, dan zal alle geschiedenis die tot die commit geleid heeft weer verschijnen. Dit zou moeten doen wat je wilt.