Wat is Git? Versiebeheer helder uitgelegd

Auteur: Gepubliceerd

In het kort: Git is een gedistribueerd versiebeheersysteem: een hulpmiddel dat de geschiedenis van wijzigingen in bestanden bijhoudt. Je kunt opeenvolgende versies vergelijken, eerdere inhoud herstellen en het werk van meerdere mensen samenvoegen. Git werkt lokaal op je computer; voor de basiswerkzaamheden heb je geen GitHub of internetverbinding nodig.

Waarvoor gebruik je Git?

Zonder versiebeheer eindig je al snel met bestanden die project-definitief, project-definitief2 en project-aangepast heten. Git vervangt zulke handmatige kopieën door een overzichtelijke geschiedenis. Elke stap die je bewust vastlegt, kun je beschrijven, controleren en met een andere vergelijken.

Git is vooral handig voor broncode, configuratie, documentatie en artikelen in platte tekst, bijvoorbeeld in Markdown. Je kunt er ook foto’s of kantoordocumenten in opslaan, maar wijzigingen daarin worden meestal niet zo duidelijk weergegeven als verschillen tussen tekstregels. Bij grote binaire bestanden die vaak veranderen, moet je extra aandacht besteden aan de manier waarop je ze opslaat.

Een voorbeeld: je past een contactformulier aan en daarna werken de meldingen niet meer. Als je eerdere stappen in Git hebt vastgelegd, kun je nagaan wat er precies is veranderd en de foutieve wijziging ongedaan maken. Je hoeft de vorige versie niet uit je geheugen te reconstrueren.

Repository, commit en branch — de basisbegrippen

Een repository bevat de geschiedenis van een project en de informatie die Git nodig heeft voor het versiebeheer. Bij een doorsnee lokaal project staan deze gegevens in de verborgen map .git, naast de werkbestanden die je bewerkt.

Een commit is een vastgelegde toestand van de bestanden die Git volgt, gekoppeld aan de eerdere geschiedenis. Een commit heeft een identificatiecode, informatie over de auteur en een beschrijving. Een goede beschrijving, zoals ‘Verbeter de validatie van e-mailadressen’, legt het doel van de wijziging beter uit dan ‘Aanpassingen’. Git maakt niet automatisch een commit telkens wanneer je een bestand in je editor opslaat.

In het voorbereidingsgebied, ook wel de index of staging area genoemd, kies je welke wijzigingen in de volgende commit komen. Zo kun je meerdere bestanden bewerken, maar een bugfix en een documentatie-update afzonderlijk vastleggen. Daardoor is de geschiedenis later makkelijker te begrijpen.

Een branch, oftewel een vertakking, is een afzonderlijke ontwikkellijn in de repository. Daarop kun je een nieuwe functie ontwikkelen zonder meteen de hoofdversie van het project te veranderen. Samenvoegen, oftewel merge, combineert wijzigingen uit verschillende branches.

Gedistribueerd betekent dat je bij het normaal klonen van een repository een lokale kopie van de geschiedenis krijgt, niet alleen toegang tot bestanden op een server. Er bestaan ook klonen met een beperkte geschiedenis. Bij normaal gebruik hoef je geen verbinding met een centrale server te hebben om vastgelegde wijzigingen te bekijken of commits te maken.

Git en GitHub — wat is het verschil?

Git is een hulpmiddel voor versiebeheer. GitHub is een dienst die onder andere Git-repositories opslaat en samenwerkingsfuncties biedt, zoals wijzigingen beoordelen en bugs melden. GitLab en Bitbucket vervullen een vergelijkbare rol; je kunt een repository ook op je eigen server beheren.

Een remote repository is een tweede kopie van de repository die via een bepaald adres bereikbaar is. Het commando push stuurt je lokale commits naar die kopie. fetch haalt informatie en geschiedenis uit de remote kopie op, zonder die in je huidige branch te integreren. Het commando pull haalt wijzigingen op en integreert ze vervolgens. Hoe die integratie verloopt, hangt af van de instellingen en de gebruikte opties.

Een commit maken betekent dus niet dat je je werk op internet publiceert. Ook wijzigingen naar een hostingdienst sturen maakt ze niet noodzakelijk openbaar: de toegangsrechten van de repository bepalen wie ze kan zien.

Aan de slag: je eerste wijzigingen vastleggen

Installeer Git met behulp van de instructies voor je besturingssysteem in de officiële projectdocumentatie. In de terminal controleer je de installatie met het commando git --version. Je kunt ook een grafische interface of de Git-integratie in je editor gebruiken, maar het basisproces blijft hetzelfde.

Voer in een nieuwe testmap het volgende uit:

git init
git config user.name "Jan de Vries"
git config user.email "jan (at) example.com"

Deze auteursinstellingen gelden voor de huidige repository en dienen niet om in te loggen. Kies je e-mailadres bewust: de auteursgegevens maken deel uit van de commits en kunnen voor anderen zichtbaar worden wanneer je de geschiedenis deelt.

Maak in je editor het bestand README.md, schrijf een korte projectbeschrijving en sla het op. Voer daarna het volgende uit:

git status
git add README.md
git diff --staged
git commit -m "Voeg projectbeschrijving toe"
git log --oneline

git status toont de status van de bestanden. git add zet de geselecteerde inhoud klaar om vast te leggen, en met git diff --staged kun je die vóór de commit controleren. De laatste twee commando’s leggen deze stap in je werk vast en tonen een beknopte geschiedenis.

Samenwerken en de beperkingen van Git

Bij samenwerking kan Git veel onafhankelijke wijzigingen automatisch samenvoegen. Maar als twee mensen hetzelfde gedeelte op onverenigbare manieren aanpassen, kan een mergeconflict ontstaan. Je moet dan handmatig bepalen wat de juiste inhoud is, de bestanden waarin het conflict is opgelost markeren met git add en de bewerking afronden. Git beoordeelt niet welke versie inhoudelijk juist is.

Voeg geen wachtwoorden, toegangssleutels of andere geheimen toe aan een repository. Het bestand .gitignore bepaalt welke nog niet gevolgde bestanden Git moet negeren, maar verwijdert geen gegevens die al in de geschiedenis zijn vastgelegd. Een gelekte sleutel moet je intrekken of vervangen; alleen verwijderen uit de nieuwste versie is niet genoeg.

Git vervangt ook geen volledige back-up: het beschermt niet automatisch wijzigingen die je nog niet hebt vastgelegd of bestanden buiten de repository. Maak om te oefenen twee commits in je testmap en vergelijk ze met het commando git diff HEAD~1 HEAD. Zo zie je precies hoe Git de verschillen tussen vastgelegde stappen weergeeft.

Zie ook: Wat is AGI?

Lees ook

Lees hoe PHP-FPM PHP-verzoeken verwerkt, verschilt van een webserver en hoe je processen afstemt op verkeer en hostingcapaciteit.
Ontdek hoe BIND als open DNS-serversoftware domeinen beheert, welke rollen het vervult en wanneer zelf beheren zinvol is.
Lees wat het Poolse REGON-register en -nummer betekenen, hoe ze verschillen van NIP en KRS en hoe je bedrijfsgegevens controleert.