Een succesvolle Git branching model

Een succesvolle Git branching model fuseren terugEen succesvolle Git branching model

Het richt zich rond Git als instrument voor de versioning van al onze broncode. (By the way, als je geïnteresseerd bent in Git bent, ons bedrijf GitPrime biedt een aantal geweldige realtime data analytics op software engineering prestaties.)

Waarom git? ¶

Voor een grondige discussie over de voors en tegens van Git in vergelijking met gecentraliseerde source code control systemen, zie het web. Er zijn tal van flame wars daar gebeurt. Als ontwikkelaar, geef ik de voorkeur Git boven alle andere instrumenten rond vandaag. Git echt veranderd de manier waarop ontwikkelaars denken van het samenvoegen en vertakking. Van de klassieke CVS / Subversion wereld kwam ik uit, het samenvoegen / vertakking is altijd beschouwd als een beetje eng ( “pas op merge conflicten, ze bijten je! ‘) En iets wat je alleen doen elke keer in een tijdje.


Maar met Git, deze acties zijn zeer goedkoop en eenvoudig, en ze worden beschouwd als een van de belangrijkste onderdelen van uw dagelijkse workflow, echt waar. Bijvoorbeeld, in CVS / Subversion boeken. vertakking en samenvoeging wordt eerst besproken in de latere hoofdstukken (voor gevorderde gebruikers), terwijl in ieder Git boek. het is al behandeld in hoofdstuk 3 (basics).

Als gevolg van de eenvoud en repetitief vertakking en samenvoeging niet langer iets bang voor te zijn. Versie controle-instrumenten worden verondersteld om te helpen bij vertakking / samenvoegen van meer dan iets anders.

Gedecentraliseerd maar gecentraliseerd ¶

De repository setup die we gebruiken en dat werkt goed met deze vertakkende model, is dat met een centrale “waarheid” repo. Merk op dat deze repo alleen wordt beschouwd als de centrale een zijn (omdat Git is een DVCS, is er niet zoiets als een centrale repo op technisch niveau). Wij zullen verwijzen naar deze repo als oorsprong. omdat deze naam is bekend bij alle Git gebruikers.

Elke ontwikkelaar trekt en duwt de oorsprong. Maar naast de centrale push-pull relaties, elke ontwikkelaar kan ook veranderingen ten opzichte van andere collega’s te trekken naar sub teams te vormen. Bijvoorbeeld, kan dit nuttig zijn om samen te werken met twee of meer ontwikkelaars op een grote nieuwe functie, voor het indrukken van de lopende werkzaamheden van de oorsprong te vroeg zijn. In de figuur hierboven, zijn er subteams van Alice en Bob, Alice en David en Claire en David.

Technisch gezien betekent dit niets meer dan dat Alice een Git remote, genaamd bob heeft gedefinieerd. wijzend naar repository Bob’s, en vice versa.

De hoofdtakken ¶

De master branch bij de oorsprong moet vertrouwd om elk Git gebruiker. Parallel aan de master branch, een andere tak bestaat genaamd ontwikkelen.

Wij beschouwen origin / master aan de belangrijkste tak, waar de broncode van HEAD weerspiegelt altijd een productie-klaar staat.

Wanneer de source code in de ontwikkeling van branche een stabiel punt bereikt en is klaar om te worden vrijgegeven, moet alle wijzigingen weer worden samengevoegd in een of andere manier meester en dan gelabeld met een versienummer. Hoe dit gebeurt in detail verder worden besproken.

Daarom is elke keer wanneer er wijzigingen weer worden samengevoegd in meester. dit is een nieuwe productie release van definitie. We hebben de neiging om heel streng op dit te zijn, zodat in theorie, konden we een Git hook script gebruiken om automatisch te bouwen en roll-out van onze software om onze productie servers elke keer was er een commit op de master.

Ondersteunende takken ¶

De verschillende soorten branches die wij kunnen gebruiken zijn:

  • feature takken
  • Vrijgeven takken
  • hotfix takken

Elk van deze takken hebben een specifiek doel en zijn gebonden aan strikte regels over welke filialen kunnen hun oorsprong tak en die takken moeten hun merge targets zijn. We wandelen door hen in een minuut.

In geen geval zijn deze takken “speciale” vanuit een technisch perspectief. De types tak worden gecategoriseerd door de manier waarop we ze gebruiken. Ze zijn natuurlijk duidelijke oude Git takken.

Feature takken ¶

Kunnen aftakken van: ontwikkelen Moet terug in samen te voegen: ontwikkelen Branch naamgeving: alles behalve meester. ontwikkelen. vrijlating-*. of hotfix- *

Feature takken bestaan ​​meestal in ontwikkelaar repo’s, niet in de oorsprong.

Het creëren van een functie tak ¶

Bij aanvang van de werkzaamheden op een nieuwe functie, aftakken van de ontwikkeling tak.

Het inbouwen van een afgewerkt functie op het ontwikkelen van ¶

Afgewerkt functies kunnen worden samengevoegd in de te ontwikkelen afslag naar hen zeker toe te voegen aan de aankomende release:

De –no-ff vlag zorgt ervoor dat de fusie altijd een nieuw commit object te maken, zelfs als de samenvoeging kan worden uitgevoerd met een fast-forward. Dit voorkomt het verlies van informatie over de historische bestaan ​​van een functie tak en groepeert alle commits die samen de functie toegevoegd. Vergelijken:

In het laatste geval is het onmogelijk om te zien vanaf de Git geschiedenis die van de objecten te plegen samen een functie-je zou moeten alle logboekberichten de hand te lezen hebben geïmplementeerd. Terugdraaien van een hele functie (dat wil zeggen een groep van commits), is een echte hoofdpijn in het laatste geval, terwijl het gemakkelijk wordt gedaan als de –no-ff vlag werd gebruikt.

Ja, zal het creëren van een paar (lege) objecten te plegen, maar de winst is veel groter dan de kosten.

Vrijgeven takken ¶

Kunnen aftakken van: ontwikkelen Moet terug in samen te voegen: ontwikkelen en meester Branch naamgeving: release- *

Vrijgeven takken ondersteunen voorbereiding van een nieuwe productie-release. Zij zorgen voor last-minute puntjes op i’s en de overschrijding t’s. Bovendien, ze zorgen voor kleine bug fixes en het voorbereiden van meta-gegevens voor een versie (versie nummer, op te bouwen data, etc.). Door al dit werk te doen op een vrijval tak, is het ontwikkelen van tak ontruimd om functies te ontvangen voor de volgende grote release.

Het belangrijkste moment om aftakken een nieuwe release tak uit te ontwikkelen is wanneer het ontwikkelen van (bijna) geeft de gewenste toestand van de nieuwe release. Ten minste alle functies die zijn gericht op de introductie te worden gebouwd moeten worden samengevoegd ontwikkeling op dit moment. Alle functies die gericht zijn op toekomstige versies mogelijk niet-ze moeten wachten tot na de release tak afgetakt.

Juist bij het begin van een releasetak dat de aankomende release een eerdere versie wordt toegekend nummer niet. Tot dat moment is de ontwikkeling van tak tot uiting veranderingen voor de “next release”, maar het is onduidelijk of dat ‘next release “zal uiteindelijk 0,3 of 1,0, tot de release tak wordt gestart. Dat besluit is genomen over de start van de release tak en wordt uitgevoerd door de regels van het project op versienummer stoten uitgevoerd.

Het creëren van een releasetak ¶

Vrijgeven takken worden gemaakt op basis van de ontwikkeling tak. Stel bijvoorbeeld dat versie 1.1.5 is de huidige productie vrijlating en we hebben een grote versie komen. De toestand van de ontwikkeling is klaar voor de “volgende release” en we hebben besloten dat deze versie 1.2 (in plaats van 1.1.6 of 2.0) zal worden. Dus vertakken we uit en geven de release tak een naam als gevolg van de nieuwe versie nummer:

Na het aanmaken van een nieuwe tak en over te schakelen naar het, stoten we het versienummer. Hier, bump-version.sh is een fictieve shell script dat een aantal bestanden in de werkkopie wijzigingen in de nieuwe versie weer te geven. (Dit kan natuurlijk handmatig wijzigen-het punt is dat sommige bestanden veranderen.) Vervolgens wordt het gestoten versienummer gepleegd.

Deze nieuwe vestiging kan er bestaan ​​voor een tijdje, totdat de release uit zeker kan worden uitgerold. Gedurende die tijd kan bug correcties worden toegepast in deze tak (in plaats van op het ontwikkelen branch). Het toevoegen van grote nieuwe features hier is ten strengste verboden. Ze moeten worden samengevoegd tot ontwikkelen. en daarom wachten op de volgende grote release.

Afwerking een releasetak ¶

Wanneer de toestand van de release tak is klaar om een ​​echte versie te worden, moet een aantal acties worden uitgevoerd. Eerst wordt de release tak samengevoegd in master (omdat elke commit op de master is een nieuwe release per definitie. Onthouden). Volgende, die commit op de master moet worden gelabeld voor gemakkelijke toekomstige verwijzing naar deze historische versie. Tot slot, de wijzigingen die zijn aangebracht op de release tak moeten terug in de ontwikkeling worden samengevoegd. zodat toekomstige releases bevatten ook deze bug fixes.

De eerste twee stappen in Git:

De release is nu klaar, en gelabeld voor toekomstig gebruik.

Bewerk: Je kan net zo goed willen de -s of -u gebruiken lt; keygt; vlaggen te ondertekenen je tag cryptografisch.

Om de wijzigingen in de release tak te houden, moeten we terug naar de ontwikkeling samen te voegen die. though. In Git:

Deze stap kan ook leiden tot een merge conflict (waarschijnlijk zelfs, omdat we het versienummer zijn veranderd). Als dat zo is, te repareren en te plegen.

Nu zijn we echt klaar en de release tak kunnen worden verwijderd, omdat we niet meer nodig:

Hotfix takken ¶

Kunnen aftakken van: meester Moet terug in samen te voegen: ontwikkelen en meester Branch naamgeving: hotfix- *

Hotfix takken zijn heel graag takken release in dat ze ook bedoeld zijn om voor te bereiden op een nieuwe productie-release, zij het ongeplande. Ze ontstaan ​​uit de noodzaak om onmiddellijk te reageren op een ongewenste toestand van een levend productieversie. Wanneer een kritieke bug in een productieversie onmiddellijk moet worden opgelost, kan een reparatie branch worden afgetakt van de overeenkomstige tag op de master branch dat de productieversie markeert.

De essentie is dat het werk van de teamleden (op de ontwikkeling tak) kunnen blijven, terwijl een andere persoon werkt aan een snelle productie fix.

Het creëren van de hotfix tak ¶

Hotfix takken worden gemaakt op basis van de master branch. Stel bijvoorbeeld dat versie 1.2 is de huidige productie-versie loopt leven en het veroorzaken van problemen als gevolg van een ernstige bug. Maar veranderingen in de ontwikkeling nog instabiel. We kunnen dan aftakken een hotfix tak en beginnen met de vaststelling van het probleem:

Vergeet niet het versienummer bump na afsplitsing!

Dan bevestig de bug en plegen de moeilijke situatie in één of meer afzonderlijke commits.

Afwerken van een reparatie branch

Wanneer u klaar bent, de bugfix nodig heeft om weer in meester worden samengevoegd. maar moet ook terug in de ontwikkeling worden samengevoegd. Dit om te garanderen dat de bugfix is ​​opgenomen in de volgende ontgrendeling. Dit is volkomen vergelijkbaar met hoe afgifte takken zijn afgewerkt.

Ten eerste, werken meester en tag de release.

Bewerk: Je kan net zo goed willen de -s of -u gebruiken lt; keygt; vlaggen te ondertekenen je tag cryptografisch.

Vervolgens zijn de bugfix in te ontwikkelen. te:

De enige uitzondering op de regel is dat, wanneer een vrijlating tak momenteel bestaat, moet de hotfix wijzigingen worden samengevoegd in die release tak, in plaats van het te ontwikkelen. Back-samenvoegen van de bugfix in de release tak zal uiteindelijk resulteren in de bugfix wordt samengevoegd tot te ontwikkelen, wanneer de release tak is voltooid. (Als het werk onmiddellijk te ontwikkelen deze bugfix vereist en kan niet wachten op de release tak af te werken, kunt u veilig samenvoegen van de bugfix in ontwikkeling nu al als goed.)

Ten slotte wordt de tijdelijke vestiging:

Overzicht ¶

Hoewel er niets echt schokkend nieuw op deze vertakking model, de “big picture” figuur die deze post is begonnen met bleek enorm nuttig zijn in onze projecten. Het vormt een elegante mentaal model dat is gemakkelijk te begrijpen en laat teamleden om een ​​gemeenschappelijk inzicht in de vertakking en het vrijgeven van processen te ontwikkelen.

Een hoge kwaliteit PDF-versie van de figuur is hier voorzien. Ga je gang en hang het aan de muur voor een snelle verwijzing op elk gewenst moment.

Bijwerken: En voor iedereen die het verzoek: hier is de gitflow-model.src.key de hoofdafbeelding diagram (Apple Keynote) van.

Wilt u in contact te komen, ik ben @nvie op Twitter.

Vincent Driessen is een onafhankelijke Python software engineer en consultant uit Nederland. U kunt hem in te huren.

Bron: nvie.com

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

negentien − vijf =