Beginners van Git worden gewaarschuwd voor het rebase-commando. En terecht. Met alle nieuwe dingen om te leren, kunnen beginners waarschijnlijk beter de basisconcepten beheersen voordat ze zich verdiepen in de fijne kneepjes van rebasen. Als je echter de basisprincipes van het samenvoegen van branches begrijpt, kan het weten hoe je moet rebasen je helpen bij het oplossen van een aantal gecompliceerde ontwikkelingspuzzels wanneer het juiste moment komt.
Git-rebase: definities
Volgens de git-documentatie zal het rebase-commando commits opnieuw toepassen bovenop een andere basistip. Deze definitie is misschien een beetje ontmoedigend. Het is gemakkelijker om rebase uit te leggen als een procedure die de wijzigingen van de huidige branch toevoegt aan de staart van een andere branch. Laten we een voorbeeld doornemen om een beter idee te krijgen van wat er gebeurt.
Git Rebasing Voorbeeldbas
In dit voorbeeld zullen we eerst een testcase maken met 'master' en 'feature' branch. Dan doen we een standaard merge. Vervolgens zullen we de testcase opnieuw maken en rebase en merge uitvoeren.
1. Hoofd- en kenmerktakken maken
Dit is het scenario dat we zullen maken:
A - B - C (master) \ E - F (functie)
In het bovenstaande voorbeeld nemen we het volgende pad:
- Commit A: we voegen a . toe.txt-bestand in de 'master'-branch
- Commit B: we voegen b . toe.txt-bestand in de 'master'-tak
- In dit stadium maken we de 'feature' van de tak, wat betekent dat deze een.txt en b.tekst
- Commit C: we voegen c . toe.txt-bestand in de 'master'-branch
- We gaan naar de 'feature' branch
- Commit E: we wijzigen a.txt in de 'feature'-tak
- Commit F: we wijzigen b.txt in de 'feature'-tak
U kunt een map maken en de volgende code in de map uitvoeren om de bovenstaande situatie te creëren:
git init touch a.txt git add -A git commit -m "Commit A: toegevoegd a.txt" tik op b.txt git add -A git commit -m "Commit B: toegevoegd b.txt" git branch feature touch c.txt git add -A git commit -m "Commit C: c . toegevoegd.txt" git status git checkout feature echo aaa > a.txt git add -A git commit -m "Commit E: gewijzigd a.txt" echo bbb > b.txt git add -A git commit -m "Commit F: gewijzigd b.tekst"
2. Eenvoudig samenvoegen
Laten we het log commando gebruiken om beide branches te controleren.
Resultaten voor 'meester':
$ git checkout master Overgeschakeld naar branch 'master' $ git log --oneline 2bbde47 Commit C: c toegevoegd.txt b430ab5 Commit B: toegevoegd b.txt 6f30e95 Commit A: toegevoegd a.txt $ ls a.txt b.txt c.tekst
Resultaten voor 'functie':
$ git checkout feature Overgeschakeld naar branch 'feature' $ git log --oneline 0286690 Commit F: gewijzigd b.txt 7c5c85e Commit E: gewijzigd a.txt b430ab5 Commit B: toegevoegd b.txt 6f30e95 Commit A: toegevoegd a.txt $ ls a.txt b.tekst
Merk op hoe de feature branch geen Commit C . heeft
Laten we nu de merge 'feature' branch met 'master' branch uitvoeren. U wordt gevraagd om een opmerking in te voeren. Voeg in de opmerking aan het begin "Commit G:" toe om het volgen gemakkelijker te maken.
$ git checkout master Overgeschakeld naar branch 'master' $ git merge feature Samenvoegen gemaakt door de 'recursieve' strategie. een.txt | 1 + b.txt | 1 + 2 bestanden gewijzigd, 2 invoegingen (+)
Resultaten voor 'meester':
$ git checkout master Al op 'master' $ git log --oneline d086ff9 Commit G: Branch 'feature' samenvoegen 0286690 Commit F: gewijzigd b.txt 7c5c85e Commit E: gewijzigd a.txt 2bbde47 Commit C: c . toegevoegd.txt b430ab5 Commit B: toegevoegd b.txt 6f30e95 Commit A: toegevoegd a.txt $ ls a.txt b.txt c.tekst
Resultaten voor 'functie':
$ git checkout feature Overgeschakeld naar branch 'feature' $ git log --oneline 0286690 Commit F: gewijzigd b.txt 7c5c85e Commit E: gewijzigd a.txt b430ab5 Commit B: toegevoegd b.txt 6f30e95 Commit A: toegevoegd a.txt $ ls a.txt b.tekst
In de 'master'-branch zul je merken dat er een nieuwe commit G is die de wijzigingen van de 'feature'-branch heeft samengevoegd. In principe heeft de volgende actie plaatsgevonden:
A - B - C - G (master) \ / E - F (functie)
In de Commit G zijn alle wijzigingen van de 'feature'-branch in de master-branch gebracht. Maar de 'feature'-branch zelf is onaangeroerd gebleven vanwege het samenvoegproces. Let op de hash van elke commit. Na de merge hebben E (7c5c85e) en F (0286690) commit dezelfde hash op de 'feature' en 'master' branch.
3. Samenvoegen met rebasen
Laten we stap 1 herhalen om de 'master' en 'feature' branches opnieuw te maken.
Resultaten voor 'meester':
$ git checkout master Overgeschakeld naar branch 'master' $ git log --oneline 7f573d8 Commit C: c toegevoegd.txt 795da3c Commit B: toegevoegd b.txt 0f4ed5b Commit A: toegevoegd a.txt $ ls a.txt b.txt c.tekst
Resultaten voor 'functie':
$ git checkout feature Overgeschakeld naar branch 'feature' $ git log --oneline 8ed0c4e Commit F: gewijzigd b.txt 6e12b57 Commit E: gewijzigd a.txt 795da3c Commit B: toegevoegd b.txt 0f4ed5b Commit A: toegevoegd a.txt $ ls a.txt b.tekst
Laten we rebasen van de 'feature'-tak.
$ git checkout-functie Overgeschakeld naar branch 'feature' $ git rebase master Eerst hoofd terugspoelen om je werk er bovenop af te spelen... Toepassen: Commit E: gewijzigd a.txt Van toepassing: Commit F: gewijzigd b.tekst
Voeg vervolgens 'feature' samen in 'master'.
$ git checkout master Overgeschakeld naar branch 'master' $ git merge feature Updaten 7f573d8… 9efa1a3 Fast-forward a.txt | 1 + b.txt | 1 + 2 bestanden gewijzigd, 2 invoegingen (+)
Resultaten voor 'master' branch:
$ git checkout master Al op 'master' $ git log --oneline 9efa1a3 Commit F: gewijzigd b.txt 8710174 Commit E: gewijzigd a.txt 7f573d8 Commit C: c . toegevoegd.txt 795da3c Commit B: toegevoegd b.txt 0f4ed5b Commit A: toegevoegd a.txt $ ls a.txt b.txt c.tekst
Resultaten voor branche 'feature':
$ git checkout feature Overgeschakeld naar branch 'feature' $ git log --oneline 9efa1a3 Commit F: gewijzigd b.txt 8710174 Commit E: gewijzigd a.txt 7f573d8 Commit C: c . toegevoegd.txt 795da3c Commit B: toegevoegd b.txt 0f4ed5b Commit A: toegevoegd a.txt $ ls a.txt b.txt c.tekst
Merk op dat na de rebase en merge beide branches hetzelfde zijn. Ook zijn de hashes voor E en F in beide branches veranderd. Kortom, in het rebase-scenario is dit wat er gebeurde:
A - B - C \ E' - F' (functie, master)
Daarom is er geen nieuwe commit. De E- en F-commits zijn opnieuw berekend en vergrendeld aan het einde van de 'master'-tak.
Rebasen is een handig hulpmiddel als u de geschiedenis van uw werk wilt opschonen. Er is echter een gevaar dat de gouden regel heeft doen ontstaan.
Gouden regel van rebasen
De gouden regel van rebasen is:
Rebase nooit een publieke branch.
Zoals je kunt zien in het bovenstaande voorbeeld, herberekent rebasen de commits. Wanneer meerdere mensen vertakken vanuit een openbare repository, kan rebasen situaties creëren waarin ontwikkelaars die nieuwe vertakkingen hebben gemaakt, in zeer gecompliceerde samenvoegsituaties terechtkomen. Het is dus een goed idee om openbare branches die worden gedeeld nooit te rebasen.
Tot slot:
Rebasen is een uniek kenmerk van Git. Maar gebruik het met de nodige voorzichtigheid.
Meer informatie:
Hier zijn enkele links voor verder onderzoek:
Git Rebase-documentatie
Atlassian samenvoegen versus rebasen
Referenties:
- https://www.atlassian.com/git/tutorials/merging-vs-rebasing
- Versiebeheer met Git - 07 - Rebase [https://www.youtube.com/watch?v=cSf8cO0WB4o]
- https://git-scm.com/docs/git-rebase
- Wat is Git-rebase?? [https://www.youtube.com/watch?v=TymF3DpidJ8]
- https://medium.freecodecamp.org/git-rebase-and-the-golden-rule-explained-70715eccc372