-
1. Aan de slag
- 1.1 Over versiebeheer
- 1.2 Een kort historisch overzicht van Git
- 1.3 Wat is Git?
- 1.4 De commando-regel
- 1.5 Git installeren
- 1.6 Git klaarmaken voor eerste gebruik
- 1.7 Hulp krijgen
- 1.8 Samenvatting
-
2. Git Basics
-
3. Branchen in Git
- 3.1 Branches in vogelvlucht
- 3.2 Eenvoudig branchen en mergen
- 3.3 Branch-beheer
- 3.4 Branch workflows
- 3.5 Branches op afstand (Remote branches)
- 3.6 Rebasen
- 3.7 Samenvatting
-
4. Git op de server
- 4.1 De protocollen
- 4.2 Git op een server krijgen
- 4.3 Je publieke SSH sleutel genereren
- 4.4 De server opzetten
- 4.5 Git Daemon
- 4.6 Slimme HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Hosting oplossingen van derden
- 4.10 Samenvatting
-
5. Gedistribueerd Git
-
6. GitHub
-
7. Git Tools
- 7.1 Revisie Selectie
- 7.2 Interactief stagen
- 7.3 Stashen en opschonen
- 7.4 Je werk tekenen
- 7.5 Zoeken
- 7.6 Geschiedenis herschrijven
- 7.7 Reset ontrafeld
- 7.8 Mergen voor gevorderden
- 7.9 Rerere
- 7.10 Debuggen met Git
- 7.11 Submodules
- 7.12 Bundelen
- 7.13 Vervangen
- 7.14 Het opslaan van inloggegevens
- 7.15 Samenvatting
-
8. Git aanpassen
- 8.1 Git configuratie
- 8.2 Git attributen
- 8.3 Git Hooks
- 8.4 Een voorbeeld van Git-afgedwongen beleid
- 8.5 Samenvatting
-
9. Git en andere systemen
- 9.1 Git als een client
- 9.2 Migreren naar Git
- 9.3 Samenvatting
-
10. Git Binnenwerk
- 10.1 Binnenwerk en koetswerk (plumbing and porcelain)
- 10.2 Git objecten
- 10.3 Git Referenties
- 10.4 Packfiles
- 10.5 De Refspec
- 10.6 Uitwisseling protocollen
- 10.7 Onderhoud en gegevensherstel
- 10.8 Omgevingsvariabelen
- 10.9 Samenvatting
-
A1. Bijlage A: Git in andere omgevingen
- A1.1 Grafische interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in Eclipse
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Samenvatting
-
A2. Bijlage B: Git in je applicaties inbouwen
- A2.1 Commando-regel Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Bijlage C: Git Commando’s
- A3.1 Setup en configuratie
- A3.2 Projecten ophalen en maken
- A3.3 Basic Snapshotten
- A3.4 Branchen en mergen
- A3.5 Projecten delen en bijwerken
- A3.6 Inspectie en vergelijking
- A3.7 Debuggen
- A3.8 Patchen
- A3.9 Email
- A3.10 Externe systemen
- A3.11 Beheer
- A3.12 Binnenwerk commando’s (plumbing commando’s)
5.1 Gedistribueerd Git - Gedistribueerde workflows
Nu je een remote Git repository hebt ingesteld als een plaats waar alle ontwikkelaars hun code kunnen delen, en je bekend bent met fundamentele Git commando’s in een lokale workflow, zul je hier zien hoe je enkele van de gedistribueerde workflows kunt gebruiken waar Git je toe in staat stelt.
In dit hoofdstuk zul je zien hoe je met Git kunt werken in een gedistribueerde omgeving als een bijdrager (contributor) en als een integrator. Dat wil zeggen, je zult leren hoe je succesvol code kunt bijdragen aan een project en hoe je het zo makkelijk mogelijk maakt voor jou en de beheerder van het project, en ook hoe je een project succesvol kunt onderhouden waar een aantal ontwikkelaars aan bijdragen.
Gedistribueerde workflows
In tegenstelling tot gecentraliseerde versiebeheersystemen (CVCSen), stelt de gedistribueerde aard van Git je in staat om veel flexibeler te zijn in de manier waarop ontwikkelaars samenwerken in projecten. Bij gecentraliseerde systemen is iedere ontwikkelaar een knooppunt dat min of meer gelijkwaardig werkt op een centraal punt. In Git echter is iedere ontwikkelaar zowel een knooppunt als een spil — dat wil zeggen, iedere ontwikkelaar kan zowel code bijdragen aan andere repositories, als ook een publiek repository beheren waarop andere ontwikkelaars hun werk baseren en waaraan zij kunnen bijdragen. Dit stelt je project en/of je team in staat om een enorm aantal workflows er op na te houden, dus ik zal een aantal veel voorkomende manieren behandelen die gebruik maken van deze flexibiliteit. We zullen de sterke en mogelijke zwakke punten van ieder ontwerp behandelen; je kunt er een kiezen om te gebruiken, of je kunt van iedere wijze een paar eigenschappen overnemen en mengen.
Gecentraliseerde workflow
In gecentraliseerde systemen is er over het algemeen een enkel samenwerkingsmodel — de gecentraliseerde workflow. Eén centraal punt, of repository, kan code aanvaarden en iedereen synchroniseert zijn werk daarmee. Een aantal ontwikkelaars zijn knopen — gebruikers van dat centrale punt - en synchroniseren met die ene plaats.
Dit houdt in dat als twee ontwikkelaars klonen van het gecentraliseerde punt en beiden wijzigingen doen, de eerste ontwikkelaar zijn wijzigingen zonder problemen kan pushen. De tweede ontwikkelaar zal het werk van de eerste in het zijne moeten mergen voordat hij het zijne kan pushen, om zo niet het werk van de eerste te overschrijven. Dit concept werkt in Git zoals het ook werkt in Subversion (of ieder ander CVCS), en dit model werkt prima in Git.
Als je al vertrouwd bent met een gecentraliseerde workflow in je bedrijf of team, dan kun je eenvoudigweg doorgaan met het gebruiken van die workflow met Git. Stel eenvoudigweg een enkele repository in, en geef iedereen in je team push-toegang; Git zal gebruikers niet toestaan om elkaars wijzigingen te overschrijven.
Stel dat John en Jessica beiden tegelijkertijd beginnen te werken. John is klaar met zijn wijziging en pusht deze naar de server. Vervolgens probeert Jessica haar wijzigingen te pushen, maar de server weigert deze. Haar wordt verteld dat ze non-fast-forward wijzigingen probeert te pushen, en dat ze niet kan committen totdat ze gefetcht en gemerged heeft. Deze workflow spreekt veel mensen aan omdat het een werkwijze is waarmee veel mensen bekend zijn en zich hierbij op hun gemak voelen.
Deze workflow is echter niet beperkt tot alleen kleine teams. Met het branching model van Git is het mogelijk om honderden ontwikkelaars tegelijktijdig succesvol te laten werken op een enkel project middels tientallen branches.
Integratie-manager workflow
Omdat Git je toestaat om meerdere remote repositories te hebben, is het mogelijk om een workflow te hebben waarbij iedere ontwikkelaar schrijftoegang heeft tot zijn eigen publieke repository en leestoegang op die van de anderen. In dit scenario is er vaak een gezagdragend (canonical) repository dat het “officiële” project vertegenwoordigt. Om bij te kunnen dragen tot dat project, maak je je eigen publieke kloon van het project en pusht je wijzigingen daarin terug. Daarna stuur je een verzoek naar de eigenaar van het hoofdproject om jouw wijzigingen binnen te halen. Hij kan je repository toevoegen als een remote, je wijzigingen lokaal testen, ze in zijn branch mergen, en dan naar zijn repository pushen. Het proces werkt als volgt (zie Integratie-manager workflow.):
-
De projecteigenaar pusht naar de publieke repository.
-
Een bijdrager kloont die repository en maakt wijzigingen.
-
De bijdrager pusht naar zijn eigen publieke kopie.
-
De bijdrager stuurt de eigenaar een e-mail met de vraag om de wijzigingen binnen te halen.
-
De eigenaar voegt de repo van de bijdrager toe als een remote en merget lokaal.
-
De eigenaar pusht de gemergde wijzigingen terug in de hoofdrepository.
Dit is een veel voorkomende workflow bij websites zoals GitHub of GitLab, waarbij het eenvoudig is om een project af te splitsen (fork) en je wijzigingen te pushen in jouw afgesplitste project waar iedereen ze kan zien. Een van de grote voordelen van deze aanpak is dat je door kunt gaan met werken, en de eigenaar van de hoofdrepository jouw wijzigingen op ieder moment kan binnenhalen. Bijdragers hoeven niet te wachten tot het project hun bijdragen invoegt — iedere partij kan in zijn eigen tempo werken.
Dictator en luitenanten workflow
Dit is een variant op de multi-repository workflow. Het wordt over het algemeen gebruikt bij enorme grote projecten met honderden bijdragers; een bekend voorbeeld is de Linux-kernel. Een aantal integrators hebben de leiding over bepaalde delen van de repository, zij worden luitenanten genoemd. Alle luitenanten hebben één integrator die bekend staat als de welwillende dictator (benevolent dictator). De repository van de welwillende dictator dient als het referentie-repository vanwaar alle bijdragers dienen te pullen. Het proces werkt als volgt (zie Benevolent dictator workflow.):
-
Reguliere ontwikkelaars werken op hun eigen onderwerp (topic) branch en rebasen hun werk op de
master
. Demaster
-branch is die van de referentie-repository waar de dictator naar toe pusht. -
Luitenanten mergen de topic branches van de ontwikkelaars in hun
master
-branch. -
De dictator merged de
master
-branches van de luitenanten in demaster
-branch van de dictator. -
De dictator pusht zijn
master
-branch ten slotte terug naar het referentie-repository zodat de andere ontwikkelaars op deze kunnen rebasen.
Deze manier van werken is niet gewoon, maar kan handig zijn in hele grote projecten of in zeer hiërarchische omgevingen Het stelt de projectleider (de dictator) in staat het meeste werk te delegeren en grote subsets van code te verzamelen op meerdere punten alvorens ze te integreren.
Workflows samenvatting
Dit zijn een aantal veel voorkomende workflows die mogelijk zijn met een gedistribueerd systeem als Git, maar je kunt zien dat er veel variaties mogelijk zijn om ze te laten passen bij jouw specifieke workflow. Nu dat je (naar we hopen) in staat bent om te bepalen welke combinatie van workflows voor jou werkt, zullen we wat specifiekere voorbeelden behandelen hoe je de belangrijkste rollen kunt vervullen die in de verschillende workflows voorkomen. In de volgende paragraaf zal je kennis maken met een aantal reguliere patronen voor het bijdragen aan een project.