Git rebase: rebase vs merge, interactieve rebase en ongedaan maken

Git rebase-gids

Git rebase: rebase vs merge, interactieve rebase, ongedaan maken | We.Inc

Zie rebase en merge naast elkaar op een live commit-graaf, plan een interactieve rebase met pick, squash, fixup en drop, en leer hoe u afbreekt of herstelt met de reflog.

git rebase speelt de commits van uw branch opnieuw af bovenop een andere commit, wat een rechte geschiedenis geeft in plaats van een merge-commit. Draai git rebase main vanaf uw feature-branch, los eventuele conflicten op en voer daarna git rebase --continue uit. Gebruik git rebase -i om commits te squashen, te herschrijven of te verwijderen, en git rebase --abort om terug te gaan.

Rebase-commando's die u het vaakst typt

Rebase is het git-commando waar mensen het bangst voor zijn, vooral omdat het commits herschrijft. De graaf hieronder toont precies wat er verandert bij merge versus rebase, met de planner probeert u een interactieve rebase uit op voorbeeldcommits, en de laatste secties gaan over conflicten, de ene regel die teamgenoten veilig houdt, en hoe u een branch terugkrijgt nadat een rebase misging.

Veelgestelde vragen

Moet ik rebase of merge gebruiken?

Merge bewaart de echte geschiedenis en voegt een merge-commit toe, wat het veiligst is voor gedeelde branches. Rebase geeft een rechte lijn die makkelijker te lezen en te bisecten is, wat past bij uw eigen feature-branch voordat die wordt gereviewd. Veel teams rebasen privé en mergen publiek.

Hoe maak ik een rebase ongedaan?

Loopt hij nog, dan zet git rebase --abort alles terug. Is hij al klaar, draai dan git reflog, zoek de regel net voordat de rebase begon en voer git reset --hard naar die hash uit. ORIG_HEAD wijst direct na een rebase ook naar de oude tip, tenzij een ander commando hem heeft veranderd.

Wat is de gouden regel van rebasen?

Rebase geen commits waar anderen al werk op hebben gebaseerd. Rebasen maakt nieuwe commits met nieuwe hashes, dus wie de oude nog heeft, krijgt dubbele geschiedenis en verwarrende conflicten.

Wat is het verschil tussen squash en fixup?

Beide voegen een commit samen met de commit erboven. squash opent de editor zodat u beide berichten kunt combineren; fixup gooit het bericht van de samengevoegde commit weg en houdt het eerdere. fixup -C houdt juist het bericht van de samengevoegde commit.

Waarom stopt git rebase met een conflict?

Elke commit wordt opnieuw toegepast op de nieuwe basis, en een commit die dezelfde regels raakte als de basis kan niet automatisch worden toegepast. Bewerk het bestand, doe git add en draai git rebase --continue. U kunt per opnieuw afgespeelde commit één keer een conflict krijgen.

Wat rebase echt doet

Een branch herstellen met de reflog

Commando's voor interactieve rebase

git rebase -i opent een todo-lijst met één regel per commit, de oudste bovenaan. Verander het woord aan het begin van een regel, sla op, sluit de editor, en git voert de lijst van boven naar beneden uit.

Commando's in de todo-lijst van git rebase -i

Een volledige rebase, inclusief conflicten

Een feature-branch bijwerken op main

Doe eerst een fetch zodat main actueel is, rebase, los conflicten op en push daarna de herschreven branch op een veilige manier.

Een voltooide rebase ongedaan maken met de reflog

Zoek de regel net voordat de rebase begon en zet de branch daarnaar terug.

Een branch naar een andere basis verplaatsen

--onto neemt drie punten: de nieuwe basis, de oude basis en de branch. Alleen de commits na de oude basis verhuizen.

Een branch loshalen van een andere feature-branch

feature-b is gestart vanaf feature-a. Dit zet alleen de eigen commits van feature-b bovenop main.

Merge of rebase: wat er met de geschiedenis gebeurt

Kies hoe de branches worden samengevoegd

Merge

Rebase

merge-commit

Merge laat F1 en F2 ongemoeid en voegt één nieuwe commit met twee parents toe.

Rebase kopieert F1 en F2 naar M3. De kopieën (gemarkeerd met ') hebben nieuwe hashes; de originelen blijven achter.

Planner voor interactieve rebase

Kies een actie voor elke commit, de oudste eerst, en bekijk de todo-lijst en het resultaat.

Actie voor commit {n}

Todo-lijst die git opent

Geschiedenis na de rebase

De eerste regel kan geen squash of fixup zijn: er is geen commit erboven om mee samen te voegen.

Elke commit is verwijderd. De branch zou naar zijn basis wijzen.

bevat {n} samengevoegde commit(s)

bericht bewerkt

Gratis beginnen · Geen creditcard nodig

Gerelateerd: Gidsen

Product

Voor wie

Functies

Bronnen

Bedrijf

Sitemap