Skip to content

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:

  1. Open het bestand, kies welke versie je wil (of combineer)
  2. Verwijder de conflict markers (<<<<<<<, =======, >>>>>>>)
  3. Stage het opgeloste bestand: git add bestand.md
  4. 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