Vraag Een git rebase ongedaan maken


Weet iemand hoe eenvoudig een git rebase ongedaan te maken?

De enige manier die in je opkomt, is om het handmatig te doen:

  • git check de commit parent naar beide vestigingen
  • maak dan een tijdelijke branch vanaf daar
  • Kers-pluk alle commits met de hand
  • vervang de tak waarin ik gerebased heb door de handmatig gecreëerde tak

In mijn huidige situatie zal dit werken omdat ik gemakkelijk commits van beide takken kan herkennen (één was mijn spullen, de andere was het spul van mijn collega).

Mijn aanpak lijkt me echter suboptimaal en foutgevoelig (laten we zeggen dat ik net met 2 van mijn eigen filialen ben herbascht).

Om het even welke ideeën?

Verduidelijking: ik heb het over een rebase waarin een aantal commits werden herhaald. Niet alleen een.


2428
2017-09-25 17:59


oorsprong


antwoorden:


De makkelijkste manier zou zijn om de head commit van de branch te vinden zoals het was net voordat de rebase begon in de reflog...

git reflog

en om de huidige vertakking opnieuw in te stellen (met de gebruikelijke waarschuwingen over absoluut zeker zijn voordat u de reset uitvoert met de --hard keuze).

Stel dat de oude verbintenis was HEAD@{5} in het ref-logboek:

git reset --hard HEAD@{5}

In Windows moet u mogelijk de referentie vermelden:

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

Je kunt de geschiedenis van het oude hoofd van de kandidaat bekijken door gewoon een git log HEAD@{5} (Ramen:  git log "HEAD@{5}").

Als je per branche reflogs niet hebt uitgeschakeld, zou je dat eenvoudig moeten kunnen doen git reflog branchname@{1} als een rebase de vertakkingskop losmaakt voordat deze weer aan de uiteindelijke kop wordt bevestigd. Ik zou dit dubbel controleren, maar ik heb dit onlangs niet geverifieerd.

Standaard zijn alle reflogs geactiveerd voor niet-bare repositories:

[core]
    logAllRefUpdates = true

3360
2017-09-25 19:56



In feite slaat rebase je startpunt op ORIG_HEAD dus dit is meestal zo simpel als:

git reset --hard ORIG_HEAD

echter, de reset, rebase en merge alle bewaar je origineel HEAD aanwijzer in ORIG_HEAD dus, als je een van deze commando's hebt gedaan sinds de rebase die je probeert ongedaan te maken, moet je de reflog gebruiken.


1166
2018-03-28 13:24



Charles's antwoord werkt, maar misschien wil je dit doen:

git rebase --abort

opruimen na de reset.

Anders krijg je misschien het bericht "Interactive rebase already started”.


317
2017-07-27 18:21



Het resetten van de tak naar het bungelende commit-object van zijn oude punt is natuurlijk de beste oplossing, omdat het de vorige toestand herstelt zonder enige moeite te doen. Maar als je die commits toevallig bent kwijtgeraakt (bijvoorbeeld omdat je in de tussentijd je repository hebt opgehaald - of dit is een nieuwe kloon), kun je de branch altijd opnieuw rebasen. De sleutel hiervoor is de --onto schakelaar.

Laten we zeggen dat je een onderwerpstak fantasieloos had genoemd topic, dat je vertakt master wanneer het uiteinde van master was de 0deadbeef plegen. Op een gegeven moment terwijl je op de topic tak, dat deed je git rebase master. Nu wil je dit ongedaan maken. Hier is hoe:

git rebase --onto 0deadbeef master topic

Dit zal alle commits op doen topic die zijn niet aan master en speel ze opnieuw af 0deadbeef.

Met --onto, je kunt je geschiedenis behoorlijk herschikken welke vorm dan ook.

Veel plezier. :-)


74
2017-09-26 02:08



Ik heb eigenlijk een back-uptag op de branch gezet voordat ik een niet-triviale bewerking uitvoer (de meeste rebases zijn triviaal, maar ik zou dat doen als het er complex uitziet).

Herstellen is dan net zo eenvoudig als git reset --hard BACKUP.


61
2018-05-12 20:57



In geval dat je had je branch naar remote repository geduwd (meestal de oorsprong) en dan heb je een succesvolle rebase gedaan (zonder samenvoegen) (git rebase --abort geeft "Geen rebase in uitvoering") die u gemakkelijk kunt uitvoeren reset tak gebruik makend van opdracht:

git reset --hard oorsprong / {branchName}

Voorbeeld:

$ ~/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



In het geval dat je de rebase niet hebt voltooid en er middenin zit, werkt het volgende:

git rebase --abort

48
2017-10-15 20:20