Er det noen som vet hvordan man enkelt kan angre en git-rebase?
Den eneste måten som kommer til å tenke på er å gå på det manuelt:
I min nåværende situasjon kommer dette til å fungere fordi jeg lett kan få øye på commits fra begge grenene (den ene var mine ting, den andre var min kollega&# 39s ting).
Tilnærmingen min slår meg imidlertid som suboptimal og feilutsatt (la oss si at jeg nettopp hadde rebaset med 2 av mine egne grener).
Noen ideer?
Avklaring: Jeg snakker om en rebase der en haug med forpliktelser ble spilt på nytt. Ikke bare én.
Den enkleste måten ville være å finne head commit for grenen slik den var umiddelbart før rebase startet i reflog ...
git reflog
og å tilbakestille den nåværende grenen til den (med de vanlige forbeholdene om å være helt sikker før du tilbakestiller med --hard
-alternativet).
Anta at den gamle overføringen var HEAD@{5}
i ref-loggen:
git reset --hard HEAD@{5}
I Windows kan det hende du må sitere referansen:
git reset --hard "HEAD@{5}"
Du kan sjekke historikken til kandidatens gamle hode ved å gjøre en git log HEAD@{5}
(Windows: git log "HEAD@{5}"
).
Hvis du ikke har deaktivert per gren reflogs, bør du bare kunne gjøre git reflog branchname@{1}
som en rebase løsner grenhodet før du kobler til det endelige hodet. Jeg vil dobbeltsjekke dette, selv om jeg ikke har bekreftet dette nylig.
Som standard er alle reflogs aktivert for ikke-bare depoter:
[core]
logAllRefUpdates = true
Å tilbakestille grenen til det dinglende commit-objektet til det gamle tipset er selvfølgelig den beste løsningen, fordi det gjenoppretter den forrige tilstanden uten å bruke noen innsats. Men hvis du tilfeldigvis har mistet disse forpliktelsene (f.eks. fordi du søppelsamlet depotet ditt i mellomtiden, eller dette er en fersk klone), kan du alltids rebasere grenen igjen. Nøkkelen til dette er --på
-bryteren.
La oss si at du hadde en emnegren fantasifullt kalt topic
, som du forgrenet av master
når spissen av master
var 0deadbeef
commit. På et tidspunkt mens du var på topic
grenen, gjorde du git rebase master
. Nå vil du angre dette. Her er hvordan:
git rebase --onto 0deadbeef master topic
Dette vil ta alle commits på topic
som ikke er på master
og spille dem på toppen av 0deadbeef
.
Med --onto
kan du omorganisere historikken din til stort sett hvilken som helst form som helst.
Ha det gøy. :-)
For flere forpliktelser, husk at enhver forpliktelse refererer til all historikken som leder opp til den forpliktelsen. Så i Charles' svar, les "den gamle forpliktelsen" som "den nyeste av de gamle forpliktelsene". Hvis du tilbakestiller til den forpliktelsen, vil all historikken som fører opp til den forpliktelsen vises igjen. Dette bør gjøre det du ønsker.