Git

Git Rebase-zelfstudie

Git Rebase-zelfstudie

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:

  1. Commit A: we voegen a . toe.txt-bestand in de 'master'-branch
  1. Commit B: we voegen b . toe.txt-bestand in de 'master'-tak
  1. In dit stadium maken we de 'feature' van de tak, wat betekent dat deze een.txt en b.tekst
  1. Commit C: we voegen c . toe.txt-bestand in de 'master'-branch
  1. We gaan naar de 'feature' branch
  1. Commit E: we wijzigen a.txt in de 'feature'-tak
  1. 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:

Emuleer muisklikken door te zweven met Clickless Mouse in Windows 10
Het gebruik van een muis of toetsenbord in de verkeerde houding of overmatig gebruik kan leiden tot veel gezondheidsproblemen, waaronder spanning, car...
Voeg muisbewegingen toe aan Windows 10 met deze gratis tools
In de afgelopen jaren zijn computers en besturingssystemen sterk geëvolueerd. Er was een tijd dat gebruikers opdrachten moesten gebruiken om door best...
Beheer en beheer muisbewegingen tussen meerdere monitoren in Windows 10
Muisbeheer voor twee schermen laat je muisbewegingen tussen meerdere monitoren controleren en configureren door de bewegingen nabij de grens te vertra...