Een doorloop van de tutorial Op de verkeerde branch gecommit: hoe je een commit van main naar een feature-branch verplaatst met git branch en git reset, zonder werk te verliezen.
Dit scenario is het klassieke "ai, dat ging op main"-moment. Je hebt een feature direct op main gecommit terwijl die op een eigen branch had moeten staan. De oplossing houdt de commit intact terwijl main terug op zijn plek komt.
De situatie
Deze commit belandde op de verkeerde branch. Het doel is hem naar de juiste te verplaatsen.
main heeft twee commits: de Initial commit en Add skills section, die een skills-sectie aan index.html toevoegde. Die tweede commit was voor een feature-branch bedoeld, niet rechtstreeks voor main.
Er is niets stuk, maar main draagt nu onafgemaakt feature-werk. Het doel is die laatste commit van main te halen en op een feature-branch te zetten, zodat main weer schoon is.
Begin met git log --oneline. Zien dat Add skills section de laatste commit op main is, bevestigt precies wat je moet verplaatsen.
De oplossing, stap voor stap
git branch feature legt de commit vast op een nieuwe branch.
Bevestigen wat op main staat
git log
Het log toont Add skills section bovenop main. Dat is de commit om te verplaatsen.
De commit op een nieuwe branch opslaan
git branch feature/skills
Dit maakt een branchwijzer op de huidige commit. Het werk van Add skills section staat nu veilig vastgelegd op feature/skills, ook al ben je nog op main.
main één commit terugzetten
git reset --hard HEAD~1
Dit spoelt main terug tot vóór de skills-commit. Omdat de commit al op feature/skills is opgeslagen, gaat er niets verloren: alleen de wijzer van main beweegt.
Wisselen naar de feature-branch om door te werken
git checkout feature/skills
Nu is main schoon en leeft het skills-werk op een eigen branch, klaar om verder te ontwikkelen of een pull request te openen.
Waarom de volgorde belangrijk is
De veiligheid van deze oplossing hangt volledig af van het aanmaken van de branch voordat je reset:
git branch feature/skills slaat de commit op.
git reset --hard HEAD~1 verplaatst daarna alleen main.
Als je eerst git reset --hard uitvoert zonder de branch aan te maken, zakt main terug en staat de commit op geen enkele branch meer. Meestal is hij nog te redden met git reflog, maar eerst branchen voorkomt de schrik helemaal.
reset --hard herschrijft geschiedenis. Hier is het veilig omdat main niet is gepusht. Op een gedeelde main draai het dan terug met git revert.
Commits tussen branches verplaatsen: de gangbare recepten
cherry-pick kopieert de commit naar de doelbranch: dezelfde wijziging, een nieuwe hash.
De oplossing hangt af van waar de commit naartoe moet en of hij al is gepusht:
- Naar
main gecommit, maar je wilt hem op een nieuwe branch (alleen lokaal) — git branch feature, gevolgd door git reset --hard HEAD~1 op main. De commit staat nu op feature.
- Hem naar een bestaande branch verplaatsen —
git checkout target, git cherry-pick <commit>, verwijder hem daarna uit de bron met git reset --hard.
- Meerdere commits verplaatsen — branch eerst om ze allemaal te behouden, gevolgd door
git reset --hard HEAD~N; of cherry-pick een specifieke reeks naar de doelbranch.
- De commit was al gepusht — herschrijf geen openbare geschiedenis. Maak hem ongedaan op de gedeelde branch met
git revert en pas het werk opnieuw toe op een feature-branch.
Oefen het lokale geval hier in de terminal tot de reflex "branchen, dan resetten" vanzelf gaat; dat is degene die je het vaakst nodig hebt.