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.
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.
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.
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.
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.
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.
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
Doe eerst een fetch zodat main actueel is, rebase, los conflicten op en push daarna de herschreven branch op een veilige manier.
Zoek de regel net voordat de rebase begon en zet de branch daarnaar terug.
--onto neemt drie punten: de nieuwe basis, de oude basis en de branch. Alleen de commits na de oude basis verhuizen.
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