Versiebeheer verkennen met Git
Er zijn verschillende typen vcs (version control systems), maar over het algemeen kunnen ze worden gecategoriseerd als gecentraliseerd en gedistribueerd. In de afgelopen jaren (gedeeltelijk vanwege de groeiende populariteit van DevOps) kreeg de laatste categorie aanzienlijke populariteit, waarbij Git de feitelijke standaard werd in moderne softwareontwikkeling. Dit specifieke VCS is de meest geschikte keuze voor de organisatie in ons voorbeeldscenario, met name gezien de bedoeling om GitHub te gebruiken als het doelplatform voor de DevOps-overgang. In deze les verkent u het gebruik van Git als versiebeheer.
Gecentraliseerd versus gedistribueerd versiebeheer
Zowel gecentraliseerde versiebeheersystemen (CVCS) als gedistribueerde versiebeheersystemen (DVCS) bieden de mogelijkheid om wijzigingen in softwareontwikkelingsprojecten te beheren en bij te houden. De belangrijkste verschillen tussen hen zijn gerelateerd aan de manier waarop zij opslagplaatsen en samenwerking implementeren. In het bijzonder:
- Locatie van opslagplaats: In gecentraliseerde systemen is er één gecentraliseerd exemplaar van de opslagplaats met de volledige geschiedenis van het project. In gedistribueerde systemen zou elk teamlid doorgaans één volledig functionele lokale kopie van de hele opslagplaats hebben, mogelijk inclusief de volledige versiegeschiedenis.
- Netwerkconnectiviteit: In gecentraliseerde systemen is toegang tot het gecentraliseerde exemplaar van de opslagplaats vereist voor het uitvoeren van veel acties, waaronder het ophalen van updates en geschiedenis. In gedistribueerde systemen kunnen alle activiteiten worden uitgevoerd op basis van de lokale kopie van de opslagplaats.
- Samenwerkingsmodel: In gecentraliseerde systemen checken ontwikkelaars bestanden uit van het gecentraliseerde exemplaar van de opslagplaats terwijl ze er verbinding mee hebben via een netwerk voordat ze wijzigingen aanbrengen en de wijzigingen doorvoeren. Hiermee voorkomt u dat anderen uitgecheckte bestanden wijzigen. In gedistribueerde systemen brengen ontwikkelaars wijzigingen aan in hun lokale kopie van de opslagplaats, die op een bepaald moment worden gesynchroniseerd met andere kopieën.
- Vertakkings- en samenvoegingsmodel: In gecentraliseerde systemen vereist vertakking en samenvoegen doorgaans coördinatie met anderen. In gedistribueerde systemen kunnen vertakkingen onafhankelijk worden gemaakt in lokale kopieën en daarna worden samengevoegd.
Het is de moeite waard om te vermelden dat, terwijl het gedistribueerde model niet afhankelijk is van een centrale opslagplaats (in de traditionele zin), het gebruikelijk is om één kopie van de opslagplaats te implementeren, die wordt gehost door services zoals GitHub, GitLab of Bitbucket. Dit exemplaar fungeert als het middelpunt van samenwerking en synchronisatie.
Git-terminologie
Om goed te kunnen werken met Git, is het belangrijk om vertrouwd te raken met de terminologie. Sommige concepten zijn uniek voor Git en onderscheiden het van andere DVCS. De meest fundamentele Git-termen zijn:
- Actieve structuur: een mapstructuur die alle bestanden van het project bevat.
- Opslagplaats (ook wel opslagplaats genoemd): de map op het hoogste niveau van een actieve boomstructuur die alle bestanden van het project host, samen met de versiegeschiedenis van deze bestanden.
- Kloon: de actie van het maken van een kopie van een externe opslagplaats op een lokale computer om te werken aan een project waartoe u toegang hebt.
- Fork: de actie van het maken van een door GitHub gehoste kopie van een externe opslagplaats om te werken aan een project waartoe u geen toegang hebt. Een fork wordt meestal gebruikt als u een bijdrage wilt leveren aan het project van iemand anders of uw eigen versie van dit project wilt maken. Hoewel u geen schrijftoegang hebt tot de oorspronkelijke opslagplaats, kunt u uw fork volledig beheren.
- Doorvoeren: een momentopname van de wijzigingen die zijn aangebracht in de bestanden in een opslagplaats op een bepaald moment. Commits worden gebruikt om wijzigingen vast te leggen en op te slaan.
- Faseringsgebied een tussenliggende locatie (die geen deel uitmaakt van de opslagplaats) waar wijzigingen in bestanden in de werkstructuur worden voorbereid voordat ze worden doorgevoerd. Hiermee kunnen ontwikkelaars wijzigingen selecteren die ze willen doorvoeren.
- Vertakking: een genaamde reeks gekoppelde commits. In eenvoudige termen vertegenwoordigt een vertakking een afzonderlijke versie van een project. Dit maakt het mogelijk om tegelijkertijd aan verschillende onderdelen van een project te werken zonder dat dit van invloed is op de hoofdversie. De meest recente commit binnen een branch wordt de head genoemd. De standaardvertakking die automatisch wordt gegenereerd wanneer u een opslagplaats initialiseert, wordt hoofd - of hoofdvertakking genoemd.
- Samenvoegen: het proces van het combineren van wijzigingen van de ene vertakking (of commit) in een andere. Hiermee worden wijzigingen van de ene vertakking in een andere vertakking geïntegreerd.
- Object: een van de vier typen entiteiten die beschikbaar zijn in een opslagplaats. Deze entiteiten omvatten blobs die afzonderlijke bestanden vertegenwoordigen, een boomstructuur die een werkboom vertegenwoordigt, een commit die een specifieke versie van de werkboom vertegenwoordigt en een tag, een label dat is toegewezen aan een afzonderlijke commit.
- Hash: een automatisch gegenereerde, unieke id met een vaste lengte die de inhoud van een object vertegenwoordigt. Wanneer dat object wordt gewijzigd, wordt ook de hash gewijzigd. Hierdoor kan Git bepalen welke inhoud in een opslagplaats is bijgewerkt.
- Extern: een verwijzing naar een andere opslagplaats (anders dan de lokale opslagplaats), die meestal verwijst naar het door de service gehoste exemplaar van de opslagplaats. Dit fungeert als de standaardinstelling voor push- en pull-bewerkingen.
- Pull: de actie waarmee wijzigingen worden opgehaald uit een externe opslagplaats en deze samenvoegt in de huidige vertakking.
- Push: de actie waarmee lokale commits worden verzonden naar een remote repository, waarbij deze wordt bijgewerkt met de wijzigingen die lokaal zijn aangebracht.
- ophalen: de actie waarmee wijzigingen uit een externe opslagplaats worden opgehaald zonder ze automatisch samen te voegen. Hierdoor kan de controle plaatsvinden voordat een samenvoeging wordt toegepast.
- Pull-aanvraag: een functie in op Git gebaseerde hostingplatforms (zoals GitHub) waarmee ontwikkelaars wijzigingen kunnen voorstellen en aanvragen om ze te laten samenvoegen in een doelvertakking.
Git heeft ook een uitgebreide set opdrachten, die de mogelijkheid bieden om versiebeheer volledig te implementeren en te beheren via opdrachtshell, zoals Linux Bash of Windows-opdrachtprompt. U kunt Git ook beheren via bureaubladtoepassingen zoals GitHub Desktop. Hostingplatforms op basis van Git bieden een webinterface waarmee interactie met opslagplaatsen aan de servicezijde wordt vergemakkelijkt.
Git versus GitHub
Zoals eerder beschreven, is Git een opensource-DVCS met meerdere platforms die samenwerking mogelijk maakt met behulp van lokale opslagplaatsen, die kunnen worden gesynchroniseerd met externe opslagplaatsen. GitHub is een cloudservice die een hostingplatform biedt voor Git-opslagplaatsen. Het breidt het scala aan Git-mogelijkheden uit door ondersteuning voor:
- Externe opslagplaatsen: het faciliteren van interactie tussen gedistribueerde teams.
- Hulpmiddelen voor samenwerking: het leveren van functies zoals problemen, discussies, pull-aanvragen, meldingen, labels, acties, forks, wiki's en projecten.
- Webinterface: het minimaliseren van de noodzaak om Git-opdrachten te gebruiken
- Vertakkingsbeveiliging: voorwaarden afdwingen waaraan moet worden voldaan voordat een samenvoeging kan plaatsvinden (zoals voltooide pull-aanvraagbeoordelingen).