GitHub Manual
Bron: git-scm.com / docs.github.com Auteur: Johan Beysen | Fox & Fish Cybersecurity
1. Concepten — Git vs GitHub
| Git | GitHub | |
|---|---|---|
| Wat | Versiebeheersysteem (lokaal) | Hosting platform voor Git repositories |
| Waar | Op jouw machine | In de cloud |
| Wie maakt het | Linus Torvalds (2005) | Microsoft (overgenomen 2018) |
| Zonder internet | Volledig functioneel | Niet bereikbaar |
Git is de motor. GitHub is de garage waar je hem bewaart en deelt.
2. Installatie & Eerste Configuratie
2.1 Installatie
winget install Git.Git
# Of download van https://git-scm.com
sudo apt update && sudo apt install git
brew install git
2.2 Identiteit Instellen
Dit is verplicht — elke commit draagt jouw naam en e-mail.
git config --global user.name "Johan Beysen"
git config --global user.email "johan@foxandfish.be"
# Standaard editor instellen
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
# Standaard branch naam
git config --global init.defaultBranch main
# Controleer je configuratie
git config --list
2.3 SSH Key Aanmaken (aanbevolen)
# Genereer een nieuwe SSH key
ssh-keygen -t ed25519 -C "johan@foxandfish.be"
# Start SSH agent
eval "$(ssh-agent -s)"
# Voeg key toe aan agent
ssh-add ~/.ssh/id_ed25519
# Kopieer public key (plak in GitHub → Settings → SSH Keys)
cat ~/.ssh/id_ed25519.pub
Testen:
ssh -T git@github.com
# Hi JohanBeysen! You've successfully authenticated...
SSH vs HTTPS
SSH is comfortabeler voor dagelijks gebruik — geen wachtwoord nodig bij elke push. HTTPS vereist een Personal Access Token (PAT) als wachtwoord.
3. De Basis — Lokaal Werken
3.1 Repository Aanmaken
# Nieuw project starten
mkdir mijn-project && cd mijn-project
git init
# Bestaand GitHub project lokaal binnenhalen
git clone git@github.com:JohanBeysen/mijn-repo.git
git clone https://github.com/JohanBeysen/mijn-repo.git
3.2 De Git Workflow
Working Directory → Staging Area → Repository (lokaal) → Remote (GitHub)
[bewerk] [git add] [git commit] [git push]
# Status bekijken (wat is gewijzigd?)
git status
# Specifiek bestand toevoegen aan staging
git add bestand.md
# Alles toevoegen
git add .
# Met selectie (interactief)
git add -p
# Commit aanmaken
git commit -m "Voeg nmap referentie toe"
# Add + commit in één stap (enkel voor reeds getrackte bestanden)
git commit -am "Update nmap sectie"
3.3 Geschiedenis Bekijken
# Volledige log
git log
# Compact (één lijn per commit)
git log --oneline
# Visueel met branches
git log --oneline --graph --all
# Laatste 5 commits
git log -5 --oneline
# Commits door specifieke auteur
git log --author="Johan"
# Commits die een bepaald woord bevatten
git log --grep="nmap"
# Wijzigingen in een specifiek bestand
git log --follow bestand.md
3.4 Wijzigingen Bekijken
# Wat is er gewijzigd (working directory vs staging)
git diff
# Wat staat er in staging (vs laatste commit)
git diff --staged
# Vergelijk twee commits
git diff abc123 def456
# Vergelijk twee branches
git diff main feature/nieuwe-sectie
4. Branches
Branches zijn parallelle versies van je project. De main branch is de stabiele versie — je werkt in feature branches en mergt wanneer klaar.
4.1 Branches Beheren
# Alle branches bekijken
git branch # lokaal
git branch -r # remote
git branch -a # alles
# Nieuwe branch aanmaken
git branch feature/xss-sectie
# Naar branch wisselen
git checkout feature/xss-sectie
# Aanmaken + wisselen in één stap (aanbevolen)
git checkout -b feature/xss-sectie
# Nieuwe syntax (Git 2.23+)
git switch -c feature/xss-sectie
# Branch hernoemen
git branch -m oude-naam nieuwe-naam
# Branch verwijderen (lokaal)
git branch -d feature/xss-sectie # veilig (enkel als gemerged)
git branch -D feature/xss-sectie # forceer
4.2 Mergen
# Zorg dat je op de doelbranch staat
git checkout main
# Merge de feature branch in main
git merge feature/xss-sectie
# Merge zonder fast-forward (bewaart branch history)
git merge --no-ff feature/xss-sectie
# Squash — alle commits van branch samenvoegen tot één
git merge --squash feature/xss-sectie
git commit -m "Voeg XSS sectie toe"
4.3 Rebase
Rebase herplaatst jouw commits bovenop een andere branch — resulteert in een cleane, lineaire history.
# Rebase feature branch bovenop main
git checkout feature/xss-sectie
git rebase main
# Interactieve rebase (commits herordenen, samenvoegen, editen)
git rebase -i HEAD~3 # Laatste 3 commits
Rebase vs Merge
Gebruik merge voor publieke branches die anderen ook gebruiken. Gebruik rebase voor eigen feature branches vóór je mergt — het maakt de history cleaner.
Nooit rebasen op commits die al gepushed zijn naar een gedeelde remote.
4.4 Merge Conflicts Oplossen
Een conflict ontstaat wanneer dezelfde lijn in twee branches anders gewijzigd is.
# Git markeert conflicts in het bestand:
<<<<<<< HEAD
Dit is de versie in main
=======
Dit is de versie in de feature branch
>>>>>>> feature/xss-sectie
Stappen:
- Open het bestand, kies welke versie je wil (of combineer)
- Verwijder de conflict markers (
<<<<<<<,=======,>>>>>>>) - Stage het opgeloste bestand:
git add bestand.md - Commit:
git commit
# Conflict annuleren en terug naar de situatie voor de merge
git merge --abort
git rebase --abort
5. Remote Werken — GitHub
5.1 Remote Beheren
# Welke remotes zijn geconfigureerd?
git remote -v
# Remote toevoegen
git remote add origin git@github.com:JohanBeysen/repo.git
# Remote URL wijzigen (bijv. van HTTPS naar SSH)
git remote set-url origin git@github.com:JohanBeysen/repo.git
# Remote verwijderen
git remote remove origin
5.2 Push & Pull
# Push naar remote (eerste keer: -u instelt upstream tracking)
git push -u origin main
# Daarna gewoon
git push
# Specifieke branch pushen
git push origin feature/xss-sectie
# Remote branch verwijderen
git push origin --delete feature/xss-sectie
# Pull = fetch + merge
git pull
# Alleen ophalen, nog niet mergen
git fetch origin
# Fetch + rebase (cleaner dan pull)
git pull --rebase
5.3 Pull Requests
Een Pull Request (PR) is een verzoek om jouw branch te mergen in een andere branch — standaard workflow voor samenwerking.
Workflow:
# 1. Maak branch aan
git checkout -b feature/bloodhound-sectie
# 2. Werk en commit
git add .
git commit -m "Voeg BloodHound sectie toe"
# 3. Push naar GitHub
git push -u origin feature/bloodhound-sectie
# 4. Maak PR aan op GitHub (of via CLI)
gh pr create --title "BloodHound sectie" --body "Beschrijving van wijzigingen"
# 5. Na goedkeuring: merge op GitHub
# 6. Lokaal opruimen
git checkout main
git pull
git branch -d feature/bloodhound-sectie
6. Ongedaan Maken
6.1 Overzicht
| Situatie | Commando |
|---|---|
| Bestand uit staging verwijderen | git restore --staged bestand.md |
| Wijzigingen in working dir ongedaan | git restore bestand.md |
| Laatste commit ongedaan (behoud wijzigingen) | git reset HEAD~1 |
| Laatste commit ongedaan (verwijder wijzigingen) | git reset --hard HEAD~1 |
| Commit ongedaan via nieuwe commit | git revert <commit-hash> |
| Bestand terugzetten naar specifieke commit | git checkout <hash> -- bestand.md |
6.2 Reset vs Revert
# Reset: herschrijft history (gevaarlijk op gedeelde branches!)
git reset --soft HEAD~1 # Commit weg, wijzigingen in staging
git reset --mixed HEAD~1 # Commit weg, wijzigingen in working dir (standaard)
git reset --hard HEAD~1 # Commit weg, wijzigingen weg
# Revert: maakt een nieuwe commit die de wijzigingen terugdraait
# Veilig op gedeelde branches
git revert abc123
git revert HEAD
reset --hard
git reset --hard verwijdert wijzigingen permanent. Er is geen undo. Gebruik met zorg.
6.3 Reflog — De Veiligheidsnet
Git houdt bij wat HEAD was, ook na resets. reflog is je tijdmachine.
# Bekijk alle recente HEAD-posities
git reflog
# Herstel naar een positie van vóór een reset
git reset --hard HEAD@{3}
# Of via hash uit reflog
git reset --hard abc123f
Verloren commits herstellen
Zelfs na git reset --hard zijn commits zelden echt weg — ze staan nog in de reflog zolang Git ze niet garbage-collected heeft (standaard 90 dagen).
7. Stash
Stash bewaart tijdelijk je niet-gecommitte wijzigingen zodat je van branch kan wisselen.
# Huidige wijzigingen wegstashen
git stash
# Met beschrijving
git stash push -m "WIP: nmap sectie"
# Inclusief untracked files
git stash -u
# Alle stashes bekijken
git stash list
# Stash terugzetten (en uit lijst verwijderen)
git stash pop
# Specifieke stash terugzetten
git stash pop stash@{2}
# Stash bekijken zonder toe te passen
git stash show stash@{0}
git stash show -p stash@{0} # met diff
# Stash verwijderen
git stash drop stash@{0}
git stash clear # alles
8. Tags
Tags markeren specifieke punten in de history — typisch voor releases.
# Lightweight tag
git tag v1.0
# Annotated tag (aanbevolen — bevat metadata)
git tag -a v1.0 -m "Eerste stabiele release"
# Tag op specifieke commit
git tag -a v0.9 abc123 -m "Beta release"
# Alle tags bekijken
git tag
git tag -l "v1.*" # filter
# Tag pushen naar remote
git push origin v1.0
git push origin --tags # alle tags
# Tag verwijderen
git tag -d v1.0 # lokaal
git push origin --delete v1.0 # remote
9. .gitignore
Het .gitignore bestand vertelt Git welke bestanden genegeerd moeten worden.
# Typisch .gitignore voor een Python project
__pycache__/
*.pyc
*.pyo
.env
.venv/
*.egg-info/
dist/
build/
.DS_Store
# Typisch voor een Node.js project
node_modules/
.env
dist/
*.log
# Altijd negeren
.DS_Store # macOS
Thumbs.db # Windows
*.log
*.tmp
.env # Credentials!
secrets.yml
Credentials in Git
Nooit API keys, wachtwoorden of tokens committen. Gebruik altijd .env bestanden en zet die in .gitignore. Als het toch gebeurd is, beschouw de credentials als gecompromitteerd en roteer ze direct.
# Reeds getrackt bestand alsnog negeren
git rm --cached bestand.md
# Voeg het toe aan .gitignore
# Commit
# Controleer of een bestand genegeerd wordt
git check-ignore -v bestand.md
# Alle genegeerde bestanden bekijken
git status --ignored
Globale gitignore (voor alle projecten):
git config --global core.excludesfile ~/.gitignore_global
10. Geavanceerde Commando's
10.1 Cherry-Pick
Kopieer een specifieke commit van een andere branch.
# Kopieer commit abc123 naar de huidige branch
git cherry-pick abc123
# Meerdere commits
git cherry-pick abc123 def456
# Range
git cherry-pick abc123..def456
# Zonder direct te committen (wijzigingen in staging plaatsen)
git cherry-pick --no-commit abc123
10.2 Bisect — Bug Opsporen
Bisect gebruikt binary search om de commit te vinden die een bug introduceerde.
# Start bisect
git bisect start
# Huidige versie is kapot
git bisect bad
# Vertel waar het nog werkte
git bisect good v1.0
# Git checkt nu een middelste commit uit
# Test of de bug aanwezig is, dan:
git bisect bad # of
git bisect good
# Git blijft halveren tot de schuldige commit gevonden is
# Daarna:
git bisect reset
10.3 Blame
Wie heeft welke lijn geschreven (en in welke commit)?
# Annoteer elk lijn met auteur + commit
git blame bestand.md
# Met tijdsinformatie
git blame -t bestand.md
# Specifieke regels
git blame -L 10,20 bestand.md
# Negeer whitespace-wijzigingen
git blame -w bestand.md
10.4 Submodules
Een repository insluiten binnen een andere repository.
# Submodule toevoegen
git submodule add git@github.com:user/library.git libs/library
# Bij clonen van een repo met submodules
git clone --recurse-submodules git@github.com:user/repo.git
# Of na clonen
git submodule init
git submodule update
# Submodules updaten
git submodule update --remote
10.5 Worktrees
Meerdere branches tegelijk uitchecken in aparte mappen.
# Tweede branch uitchecken in aparte map
git worktree add ../project-hotfix hotfix/kritieke-bug
# Alle worktrees bekijken
git worktree list
# Worktree verwijderen
git worktree remove ../project-hotfix
11. GitHub CLI — gh
De officiële GitHub command-line tool.
# Installeren
winget install GitHub.cli # Windows
brew install gh # macOS
sudo apt install gh # Linux
# Inloggen
gh auth login
# Repository aanmaken
gh repo create mijn-repo --public
gh repo create mijn-repo --private
# Repository klonen
gh repo clone JohanBeysen/mijn-repo
# Pull Request aanmaken
gh pr create --title "Titel" --body "Beschrijving"
# PR's bekijken
gh pr list
gh pr view 42
gh pr checkout 42
# PR mergen
gh pr merge 42 --squash
# Issues
gh issue create --title "Bug gevonden" --body "Beschrijving"
gh issue list
gh issue close 7
# GitHub Actions bekijken
gh run list
gh run view 12345678
gh run watch # live follow
# Gist aanmaken
gh gist create bestand.md --public
12. GitHub Actions — CI/CD
GitHub Actions automatiseert taken bij events (push, PR, schedule...).
12.1 Basis Workflow
# .github/workflows/deploy.yml
name: Deploy MkDocs naar Cloudflare Pages
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Python instellen
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: MkDocs installeren
run: pip install mkdocs-material
- name: Site bouwen
run: mkdocs build
- name: Deployen naar Cloudflare Pages
uses: cloudflare/pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: knowledge-base
directory: site
12.2 Secrets Beheren
# Via CLI
gh secret set CLOUDFLARE_API_TOKEN
# Bekijken (namen, niet waarden)
gh secret list
12.3 Nuttige Triggers
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 6 * * 1' # Elke maandag om 6u
workflow_dispatch: # Manueel triggeren via UI
13. Git Aliases — Snelkoppelingen
# Toevoegen aan ~/.gitconfig of via commando's:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph --all --decorate"
git config --global alias.unstage "restore --staged"
git config --global alias.last "log -1 HEAD"
git config --global alias.aliases "config --get-regexp alias"
# Gebruik:
git st
git lg
git last
14. Git Internals — Hoe het Echt Werkt
14.1 De Vier Object Types
| Type | Beschrijving |
|---|---|
| blob | Inhoud van een bestand |
| tree | Map-structuur (verwijst naar blobs en andere trees) |
| commit | Snapshot + metadata (auteur, bericht, parent commit) |
| tag | Verwijzing naar een commit met metadata |
# Bekijk het type van een object
git cat-file -t abc123
# Bekijk de inhoud
git cat-file -p abc123
# Alle objecten bekijken
find .git/objects -type f
14.2 HEAD, Index en Working Tree
Working Tree = de bestanden die je ziet en bewerkt
Index = staging area (.git/index)
HEAD = verwijzing naar de huidige commit/branch
# Waar wijst HEAD naar?
cat .git/HEAD
# Welke branch is actief?
git symbolic-ref HEAD
# Hash van de huidige commit
git rev-parse HEAD
14.3 Refs
# Branches zijn gewoon pointers naar commits
cat .git/refs/heads/main
# Tags
cat .git/refs/tags/v1.0
# Remote tracking branches
cat .git/refs/remotes/origin/main
15. Workflow Strategieën
15.1 GitHub Flow (eenvoudig)
main → feature branch → PR → review → merge naar main → deploy
Ideaal voor: kleine teams, continuous deployment.
15.2 Git Flow (complex)
main (productie)
develop (integratie)
feature/* (nieuwe features)
release/* (voorbereiding release)
hotfix/* (urgente fixes op productie)
Ideaal voor: versioned software met geplande releases.
15.3 Trunk-Based Development
main (enkel stabiele code)
feature/* (korte lived, max 1-2 dagen)
Ideaal voor: hoge deploymentfrequentie, sterke CI/CD.
16. Cheat Sheet
# === SETUP ===
git config --global user.name "Naam"
git config --global user.email "email"
git init
git clone <url>
# === DAGELIJKS ===
git status
git add .
git commit -m "bericht"
git push
git pull
# === BRANCHES ===
git checkout -b feature/naam
git merge feature/naam
git branch -d feature/naam
git push origin --delete feature/naam
# === ONGEDAAN MAKEN ===
git restore bestand.md # werkmap ongedaan
git restore --staged bestand.md # unstage
git reset HEAD~1 # laatste commit ongedaan
git revert <hash> # veilig ongedaan op remote
# === HISTORY ===
git log --oneline --graph --all
git diff
git blame bestand.md
git reflog
# === REMOTE ===
git remote -v
git fetch origin
git push -u origin main
git push origin --delete branch
# === STASH ===
git stash
git stash pop
git stash list
Fox & Fish Cybersecurity | Intern gebruik