Introductie tot het onderwerp: een beginnersgids
Deze tutorial is een complete beginnersgids om een praktisch, veelgebruikt onderwerp grondig te leren: werken met Git en GitHub. Je leert niet alleen wat Git is, maar vooral hoe je het gebruikt in echte projecten, met echte commando’s, typische workflows, en oplossingen voor veelvoorkomende problemen. Alles is geschreven voor beginners, maar met voldoende diepgang zodat je na afloop zelfstandig kunt werken.
Inhoud
- Wat is Git (en wat is het niet)?
- Git installeren en configureren
- Je eerste repository: init, status, add, commit
- De mentale modellen: working tree, staging area, history
- Branches: waarom, wanneer en hoe
- Mergen en conflicten oplossen
- Remote repositories (GitHub): clone, fetch, pull, push
- Samenwerken: pull requests, reviews en basis-afspraken
- Handige tools en commando’s voor dagelijks gebruik
- Veelgemaakte fouten en herstelacties
- Aanbevolen workflow voor beginners
- Afsluiting en volgende stappen
Wat is Git (en wat is het niet)?
Git is een gedistribueerd versiebeheersysteem (version control system). Het helpt je om:
- wijzigingen in bestanden bij te houden (code, tekst, configuratie, enz.)
- terug te gaan naar eerdere versies
- parallel te werken via branches
- samen te werken met anderen zonder elkaars werk te overschrijven
Versiebeheer in één zin
Git bewaart een geschiedenis van snapshots van je project, zodat je kunt zien wat er veranderde, wanneer, door wie, en je kunt terugrollen of combineren.
Gedistribueerd betekent
Iedere ontwikkelaar heeft een volledige kopie van de geschiedenis op zijn eigen machine. Je bent dus niet afhankelijk van één centrale server om commits te kunnen maken of geschiedenis te raadplegen. Een remote (zoals GitHub) is vooral een gedeelde plek om samen te werken en te publiceren.
Git is niet hetzelfde als GitHub
- Git: de tool/technologie (command line, lokale repo’s).
- GitHub: een platform om Git-repositories te hosten en samenwerking te faciliteren (issues, pull requests, CI, enz.).
Git installeren en configureren
Installatie controleren
Open een terminal (macOS/Linux) of PowerShell/Git Bash (Windows) en voer uit:
git --version
Je ziet iets als git version 2.xx.x. Als dat niet werkt, installeer Git via:
- Windows: https://git-scm.com/download/win
- macOS:
brew install git(als je Homebrew gebruikt) of Xcode Command Line Tools - Linux (Debian/Ubuntu):
sudo apt-get install git
Basisconfiguratie: naam en e-mail
Git plaatst je naam/e-mail in commits. Stel dit één keer in:
git config --global user.name "Jouw Naam"
git config --global user.email "jij@example.com"
Controleer:
git config --global --list
Standaard editor instellen (optioneel maar handig)
Bijvoorbeeld VS Code:
git config --global core.editor "code --wait"
Line endings (Windows tip)
Op Windows kan dit nuttig zijn:
git config --global core.autocrlf true
Op macOS/Linux meestal:
git config --global core.autocrlf input
Je eerste repository: init, status, add, commit
We maken een klein project en zetten het onder versiebeheer.
1) Maak een map en initialiseer Git
mkdir demo-git
cd demo-git
git init
Dit maakt een verborgen map .git/ aan met alle metadata.
2) Maak een bestand
echo "# Demo Git" > README.md
3) Bekijk de status
git status
Je ziet dat README.md “untracked” is: Git ziet het bestand, maar volgt het nog niet.
4) Voeg toe aan de staging area
git add README.md
Controleer opnieuw:
git status
Nu staat het bestand “staged”: klaar om in een commit te gaan.
5) Maak een commit
git commit -m "Voeg README toe"
Je project heeft nu een eerste commit in de geschiedenis.
6) Bekijk de commitgeschiedenis
git log
Handiger (compact):
git log --oneline --decorate --graph
De mentale modellen: working tree, staging area, history
Git wordt veel makkelijker als je drie zones begrijpt:
- Working tree: jouw huidige bestanden op schijf (wat je in je editor ziet).
- Staging area (index): een “wachtruimte” waarin je precies kiest wat in de volgende commit komt.
- Repository history: de commits die al vastgelegd zijn.
Waarom staging?
Staging is handig omdat je niet verplicht bent om alles in één keer te committen. Stel je hebt twee losse veranderingen gedaan (een bugfix en een tekstupdate). Dan kun je ze scheiden:
- stage alleen de bugfix → commit “Fix bug”
- stage daarna de tekstupdate → commit “Update docs”
Dit maakt je geschiedenis leesbaar en professioneel.
Voorbeeld: meerdere wijzigingen
Maak een extra regel in README:
echo "Dit is een test." >> README.md
Check:
git diff
git diff toont het verschil tussen working tree en staging area (dus: wat je nog niet staged hebt).
Stage het bestand:
git add README.md
Nu is git diff leeg (want alles is staged). Bekijk staged diff:
git diff --staged
Commit:
git commit -m "Werk README bij"
Branches: waarom, wanneer en hoe
Een branch is een aparte ontwikkellijn. In plaats van direct op main (of master) te werken, maak je een branch voor een feature of fix. Dit voorkomt rommel op de hoofdbranch en maakt samenwerking veilig.
Branch bekijken
git branch
De ster * geeft de huidige branch aan.
Nieuwe branch maken en ernaartoe gaan
git switch -c feature/intro-tekst
(Oudere Git-versies gebruiken git checkout -b ..., maar switch is duidelijker.)
Werk doen op de branch
Voeg tekst toe:
echo "Extra introductie op feature-branch." >> README.md
git add README.md
git commit -m "Voeg extra introductie toe"
Terug naar main
git switch main
Je ziet dat die extra regel weg is in je working tree, omdat main die commit niet heeft.
Mergen en conflicten oplossen
Merge zonder conflict
Merge je feature-branch in main:
git merge feature/intro-tekst
Als alles goed gaat, worden commits gecombineerd en staat main nu op hetzelfde punt.
Conflicten: wat zijn dat?
Een merge conflict ontstaat wanneer Git niet automatisch kan bepalen hoe twee sets wijzigingen gecombineerd moeten worden. Dit gebeurt meestal wanneer:
- dezelfde regels in hetzelfde bestand in beide branches zijn aangepast
- of een bestand is verwijderd in de ene branch en aangepast in de andere
Conflict demonstreren (bewust)
Maak twee branches die dezelfde regel aanpassen.
- Start op
main:
git switch main
- Maak branch A:
git switch -c feature/a
Pas README aan (bijv. eerste regel):
printf "# Demo Git (A)\n" > README.md
git add README.md
git commit -m "Wijzig titel naar A"
- Terug naar main en branch B:
git switch main
git switch -c feature/b
Pas dezelfde regel anders aan:
printf "# Demo Git (B)\n" > README.md
git add README.md
git commit -m "Wijzig titel naar B"
- Merge A in B (of andersom) om conflict te forceren:
git merge feature/a
Je krijgt nu een conflictmelding.
Conflict oplossen
Open README.md. Je ziet markers zoals:
<<<<<<< HEAD
# Demo Git (B)
=======
# Demo Git (A)
>>>>>>> feature/a
Kies de juiste versie (of combineer), verwijder de markers, bijvoorbeeld:
# Demo Git (A + B)
Daarna:
git add README.md
git commit -m "Los merge conflict op tussen A en B"
Belangrijk: een conflict is geen “kapotte repo”, maar een signaal dat jij een keuze moet maken.
Remote repositories (GitHub): clone, fetch, pull, push
Een remote is een verwijzing naar een repository op een server (bijv. GitHub). Hiermee kun je delen, back-uppen en samenwerken.
Een repo clonen
Als er al een GitHub-repo bestaat:
git clone https://github.com/jouwnaam/jouwrepo.git
cd jouwrepo
Dit maakt een lokale kopie met remote origin.
Remote bekijken
git remote -v
Push: lokale commits naar GitHub
Als je lokaal commits hebt en de remote bestaat:
git push -u origin main
-u zet de upstream zodat je later simpel git push kunt doen.
Fetch vs pull (belangrijk verschil)
git fetch: haalt nieuwe info/commits op van remote, zonder je huidige branch te wijzigen.git pull: is meestalfetch+merge(ofrebase), en wijzigt je branch.
Voorbeeld:
git fetch origin
git log --oneline --decorate --graph --all
Daarna pas integreren:
git pull
Push van een feature-branch
git push -u origin feature/intro-tekst
Samenwerken: pull requests, reviews en basis-afspraken
Op GitHub werk je vaak met Pull Requests (PR’s):
- Je maakt een branch (bijv.
feature/login) - Je pusht die branch naar GitHub
- Je opent een PR naar
main - Teamgenoten reviewen
- Na akkoord merge je
Waarom PR’s?
- Code review: fouten en verbeteringen vroeg ontdekken
- Discussie en context: waarom is iets gedaan?
- Automatisering: tests/CI kunnen draaien vóór merge
- Traceerbaarheid: wie heeft wat gemerged en wanneer?
Basis-afspraken die veel teams gebruiken
mainis altijd “deploybaar” of stabiel- elke wijziging via een branch + PR
- kleine, gerichte commits met duidelijke messages
- schrijf in de PR-beschrijving: wat, waarom, hoe testen
Handige tools en commando’s voor dagelijks gebruik
git status (meest gebruikte commando)
Toont:
- huidige branch
- staged/untracked/modified bestanden
- hints voor volgende stappen
git status
git log met grafiek
Superhandig om branches te begrijpen:
git log --oneline --graph --decorate --all
git diff varianten
- Working tree vs staging:
git diff
- Staging vs laatste commit:
git diff --staged
- Tussen twee commits:
git diff <commit1> <commit2>
Bestanden tijdelijk negeren: .gitignore
Maak .gitignore:
printf "node_modules/\n.env\n.DS_Store\n" > .gitignore
git add .gitignore
git commit -m "Voeg .gitignore toe"
Belangrijk: .gitignore werkt vooral voor untracked bestanden. Als iets al gecommit is, moet je het eerst uit tracking halen (zonder te verwijderen):
git rm --cached -r node_modules
git stash (tijdelijk werk parkeren)
Handig als je halverwege iets zit en snel moet switchen:
git stash
git switch main
Later terugzetten:
git stash pop
Of meerdere stashes beheren:
git stash list
git stash apply stash@{0}
Veelgemaakte fouten en herstelacties
Herstellen is een groot deel van Git. Hieronder een aantal scenario’s met echte commando’s.
1) “Ik heb iets gecommit met een verkeerde message”
Als de commit nog niet gepusht is:
git commit --amend -m "Nieuwe correcte message"
Als je ook bestanden wilt toevoegen aan die laatste commit:
git add README.md
git commit --amend --no-edit
2) “Ik heb per ongeluk een bestand gestaged”
Unstage (bestand blijft wel gewijzigd):
git restore --staged README.md
Alles unstagen:
git restore --staged .
3) “Ik wil lokale wijzigingen weggooien”
Let op: dit kan werk vernietigen.
git restore README.md
Alles terug naar laatste commit:
git restore .
4) “Ik heb een commit gemaakt, maar ik wil hem ongedaan maken zonder geschiedenis te herschrijven”
Gebruik revert (veilig, vooral als al gepusht):
git revert <commit-hash>
Dit maakt een nieuwe commit die de wijzigingen terugdraait.
5) “Ik heb commits gemaakt op de verkeerde branch”
Vaak kun je dit oplossen door de commit(s) te verplaatsen met cherry-pick.
Stel: je zit op main maar had op feature/x moeten werken.
- Maak/switch naar de juiste branch:
git switch -c feature/x
- Cherry-pick de commit(s) (hashes via
git log --oneline):
git cherry-pick <commit-hash>
- Verwijder de commits van
main(alleen als nog niet gepusht; anders beterrevert): Bijvoorbeeldmainterugzetten naar remote:
git switch main
git reset --hard origin/main
6) “Mijn branch loopt achter op main”
Je kunt mergen:
git switch feature/x
git merge main
Of rebasen (nettere lineaire geschiedenis, maar wees voorzichtig als je al gedeeld hebt):
git switch feature/x
git rebase main
Als er conflicten zijn tijdens rebase:
- los conflict op in bestanden
- stage de oplossing:
git add .
git rebase --continue
Stoppen met rebase:
git rebase --abort
Aanbevolen workflow voor beginners
Hier is een eenvoudige, veilige workflow die in veel teams werkt:
- Update
mainlokaal - Maak een feature-branch
- Werk in kleine commits
- Push je branch
- Open een PR
- Merge na review
- Verwijder de branch
Stap-voor-stap met commando’s
- Zorg dat
mainup-to-date is:
git switch main
git pull
- Maak een branch:
git switch -c feature/nieuwe-functie
- Werk en commit regelmatig:
# bewerk bestanden...
git add .
git commit -m "Implementeer basis van nieuwe functie"
- Push:
git push -u origin feature/nieuwe-functie
-
Open PR op GitHub (via webinterface)
-
Na merge: sync lokaal:
git switch main
git pull
- Verwijder lokale branch (optioneel):
git branch -d feature/nieuwe-functie
Verwijder remote branch (optioneel, vaak automatisch na merge op GitHub):
git push origin --delete feature/nieuwe-functie
Afsluiting en volgende stappen
Je hebt nu een stevige basis in Git:
- je begrijpt de kernconcepten (working tree, staging, commits)
- je kunt branches maken en mergen
- je kunt met GitHub remotes werken (push/pull/fetch)
- je kunt conflicten herkennen en oplossen
- je kent herstelcommando’s voor veelvoorkomende fouten
Volgende stappen om verder te groeien
- Leer
git rebasebeter (interactief) voor het opschonen van commits:git rebase -i HEAD~5 - Verdiep je in tags en releases:
git tag v1.0.0 git push origin v1.0.0 - Gebruik
git blameom te zien wie een regel wijzigde:git blame README.md - Leer een GUI-tool (optioneel) zoals GitHub Desktop of Sourcetree, maar blijf de CLI begrijpen.
Als je wilt, kan ik ook een oefenopdrachtenset maken (met scenario’s zoals “conflict oplossen”, “per ongeluk commit op main”, “stash gebruiken”) inclusief verwachte uitkomsten en controlecommando’s.