# Git basics

Versiebeheer: wat het is, waarom je het vanaf vandaag altijd gebruikt, en hoe je je eerste repository online zet.

Multimedia & Creatieve Technologie · 2.1 Programming principles · Les 1 · Git basics · versie 1.2.2 · 2026-09-30

Tags: git, github, terminal

Slides: <https://slides.mctantwerp.be/nl/programming-principles/02-git-basics>

Speaker notes: <https://slides.mctantwerp.be/nl/programming-principles/02-git-basics.notes.md>

<!-- slide 2 -->

## Agenda

1. Waarom versiebeheer: final_v2_ECHT_final.psd
2. Hoe Git werkt: Repository, remote, commit
3. GitHub en installatie: Account, git --version
4. De terminal: pwd, ls, cd, cat
5. Je eerste repository: Aanmaken, clonen, add, commit, push
6. Samenwerken: Pull, merge commits en Vim
7. Tools en opdrachten: CLI, GUI, GitHub Classroom

<!-- slide 3 -->

## 1. Waarom versiebeheer

*Hoe je het nu doet, en waarom dat pijn doet zodra er een bug of een tweede persoon opduikt.*

<!-- slide 4 -->

**Hoe werk je nu op je code en bestanden?**

En wat als je met twee aan hetzelfde project werkt? Hoe krijg je elkaars wijzigingen?

<!-- slide 5 -->

### Herkenbaar

*Hoe de meeste mensen versies bijhouden*

**logo.psd**: Eerste versie. Ziet er goed uit.

**logo_final.psd**: Klant wou de kleur anders.

**logo_final2.psd**: Toch de oude kleur.

**logo_final_ECHT.psd**: Welke was nu de goede?

- Je werkt op je computer en spamt `Ctrl+S`. Elke save overschrijft de vorige versie.
- Om iets te bewaren maak je een kopie met een andere naam. Na drie weken weet niemand nog welke de juiste is.
- Online zetten is een map uploaden via FTP. Wat er op de server staat, klopt misschien niet met wat op je laptop staat.

<!-- slide 6 -->

**En als er een bug in sluipt?**

Je hebt gisteren drie uur gewerkt, vandaag werkt de site niet meer. Welke van je 200 saves was de boosdoener? Ctrl+Z telt niet, dat is weg zodra je de editor sluit.

<!-- slide 7 -->

**En met twee developers op één project?**

Dezelfde file, twee laptops, twee versies. Wie zijn kopie wint? Meestal: wie het laatst uploadt. De ander zijn werk is weg.

<!-- slide 8 -->

### Git to the rescue

*Wat een versiebeheersysteem voor je doet*

- Elke **wijziging** wordt bijgehouden: wat, wanneer, door wie en waarom
- Je kan terug naar elke vorige versie, van elke file, van elk moment
- Meerdere mensen werken tegelijk aan dezelfde code zonder elkaar te overschrijven
- De geschiedenis staat online, dus je laptop mag kapot

<!-- slide 9 -->

> Git is een gratis en open source gedistribueerd versiebeheersysteem, ontworpen om alles van kleine tot heel grote projecten snel en efficiënt aan te kunnen.
>
> git-scm.com, *de officiële omschrijving, vertaald*

<!-- slide 10 -->

### Dit is geen optie

*Vanaf nu elk project in Git*

- De standaard in de hele digitale sector. Elke vacature voor een developer vraagt Git.
- Elk project in deze opleiding vanaf nu: in Git. Ook je portfolio-projecten.
- Niet alleen voor developers. Designers gebruiken hetzelfde idee: Figma branching, Abstract.
- Wie Git niet kent, kan niet mee in een team.

<!-- slide 11 -->

## 2. Hoe Git werkt

*Wat er gebeurt tussen jouw laptop en GitHub.*

<!-- slide 12 -->

### Vier begrippen

**Repository (repo)**: Een project onder versiebeheer. Je files plus de volledige geschiedenis ervan.

**Remote, alias origin**: De online versie van de repo, bijvoorbeeld op GitHub. De plek waar iedereen naar synct.

**Local repository**: Jouw kopie op je laptop. Volledig, met geschiedenis. Werkt ook zonder internet.

**Commit**: Een bewaard pakketje wijzigingen met een boodschap. De bouwsteen van de geschiedenis.

<!-- slide 13 -->

### Git in actie

*Eén remote, twee developers*

<!-- slide 14 -->

### Sandbox

*Wat ziet origin?*

<!-- slide 15 -->

### Git is niet GitHub

#### Git

- Een programma op je computer
- Gratis en open source, sinds 2005 (Linus Torvalds, voor Linux)
- Doet al het werk: commits, geschiedenis, branches
- Werkt volledig offline

#### GitHub

- Een website die Git-repositories host (van Microsoft)
- Jouw origin, plus samenwerken, issues, pull requests
- Alternatieven: GitLab, Bitbucket, Codeberg
- Zonder Git op je laptop kan je niets met GitHub

<!-- slide 16 -->

## 3. GitHub en installatie

*Account aanmaken, Git installeren, jezelf voorstellen aan Git.*

<!-- slide 17 -->

### Opdracht: Maak je GitHub-account

*5 minuten, Individueel*

Dit account gebruik je de hele opleiding en daarna in je job. Kies dus verstandig.

1. Ga naar [github.com/signup](https://github.com/signup)
2. Met je KdG e-mailadres, later kan je een tweede adres toevoegen
3. Username: `voornaamachternaam`, bijvoorbeeld samserrien
4. Je echte voornaam en achternaam in je profiel, zodat ik weet wie je bent

<!-- slide 18 -->

### Git installeren

*Git is een programma. GitHub installeert niets voor jou.*

- **macOS**

  Open Terminal en typ:

  xcode-select --install

  Of via Homebrew: `brew install git`
- **Windows**

  Download op [git-scm.com](https://git-scm.com/) en installeer met de standaardinstellingen.

  Je krijgt er Git Bash bij: een terminal die dezelfde commando's begrijpt als op Mac en Linux. Gebruik die.

```console
$ git --version
git version 2.51.0
```

<!-- slide 19 -->

### Jezelf voorstellen aan Git

*Elke commit draagt je naam. Git moet die dus kennen.*

```console
$ git config --global user.name "Sam Serrien"
$ git config --global user.email "sam.serrien@kdg.be"
$ git config --global init.defaultBranch main
$ git config --global pull.rebase false
$ git config --global --list
user.name=Sam Serrien
user.email=sam.serrien@kdg.be
init.defaultBranch=main
pull.rebase=false
```

> [!TIP]
> Gebruik hetzelfde e-mailadres als op GitHub. Zo koppelt GitHub je commits aan je profiel en krijg je die groene vakjes.

<!-- slide 20 -->

### Opdracht: Installeer Git

*10 minuten, Individueel*

Zorg dat de drie commando's werken voor we verdergaan.

1. `git --version` toont een versienummer
2. `git config --global user.name` en `user.email` ingesteld
3. `git config --global --list` toont beide

<!-- slide 21 -->

## 4. De terminal

*Git heeft geen knoppen. Voor we clonen, leren we rondwandelen in je mappen.*

<!-- slide 22 -->

### Waar staat dat venster

*Je hebt het net al opengehad voor git --version*

#### macOS

- Programma **Terminal**, staat in Programma's onder Hulpprogramma's
- Sneller: <kbd>⌘</kbd> <kbd>spatie</kbd> en typ terminal
- De shell heet zsh. Die van je klasgenoot met een Mac doet exact hetzelfde.

#### Windows

- **Git Bash**, geïnstalleerd samen met Git
- Rechtermuisknop in een map, Open Git Bash here
- Gebruik Git Bash en niet cmd of PowerShell, dan kloppen alle commando’s uit deze les.

<!-- slide 23 -->

### Waar ben ik en wat staat hier

*pwd en ls*

```console
% pwd
/Users/student
% ls
Documents  Downloads  Projects
% ls Projects
my-first-repo
```

**pwd**: Print working directory. In welke map sta ik nu?

**ls**: List. Wat staat er in deze map?

**ls Projects**: Hetzelfde, maar dan van een andere map, zonder er zelf naartoe te gaan.

<!-- slide 24 -->

### Meer zien

*Met -l krijg je rechten, grootte en datum. Met -a zie je ook alles wat met een punt begint, zoals .git.*

```console
% ls -l
total 24
-rw-r--r--   1 student  staff     96  12 sep 14:20  README.md
drwxr-xr-x   3 student  staff    128  12 sep 14:22  css
-rw-r--r--   1 student  staff    312  12 sep 14:22  index.html
% ls -la
total 24
drwxr-xr-x   6 student  staff    192  12 sep 14:22  .
drwxr-xr-x   3 student  staff     96  12 sep 14:20  ..
drwxr-xr-x  12 student  staff    384  12 sep 14:20  .git
-rw-r--r--   1 student  staff     96  12 sep 14:20  README.md
drwxr-xr-x   3 student  staff    128  12 sep 14:22  css
-rw-r--r--   1 student  staff    312  12 sep 14:22  index.html
```

<!-- slide 25 -->

### Wandelen

*cd, en terug met cd ..*

```console
% cd Projects
% cd my-first-repo
% pwd
/Users/student/Projects/my-first-repo
% cd ..
% pwd
/Users/student/Projects
% cd ~
% pwd
/Users/student
```

**cd map**: Change directory. Ga één map naar binnen.

**cd ..**: Ga één map naar buiten. Twee punten, met een spatie ervoor.

**cd ~**: Terug naar je home. Werkt altijd, waar je ook zit.

> [!TIP]
> Typ de eerste letters en druk op <kbd>Tab</kbd>. De terminal vult de rest aan.

<!-- slide 26 -->

### In een bestand kijken

*cat*

```console
% cat README.md
# my-first-repo

Mijn eerste repository.
% cat css/style.css
body {
  font-family: system-ui;
}
% cat css
cat: css: Is a directory
```

> [!NOTE]
> `cat` kiepert de inhoud van een bestand in je venster. Handig om snel te checken of je in de juiste map zit, niet om in te werken.

<!-- slide 27 -->

### Zelf proberen

*Een echte shell, een verzonnen computer*

<!-- slide 28 -->

### Terminal Velocity

*Oefenen tot het in je vingers zit*

Een spelletje van onze eigen opleiding waarin je je een weg door mappen navigeert met precies deze commando's. Tien minuten spelen en je hoeft nooit meer na te denken over `cd ..`.

- Werkt in je browser, niets te installeren.
- Zelfde commando’s als hierboven, in oplopende moeilijkheid.
- Zet je tijd in je portfolio, samen met wat je eruit geleerd hebt.

[mctantwerp.github.io/codeplay/spel/terminal-velocity](https://mctantwerp.github.io/codeplay/spel/terminal-velocity)

<!-- slide 29 -->

## 5. Je eerste repository

*Aanmaken op GitHub, clonen naar je laptop, en dan de flow die je duizend keer gaat herhalen.*

<!-- slide 30 -->

### Repository aanmaken op GitHub

*[github.com/new](https://github.com/new)*

<!-- slide 31 -->

### Clonen

*De remote kopiëren naar je laptop, geschiedenis inbegrepen*

Op GitHub: knop Code, tab HTTPS

> [!WARNING]
> **De map .git**
>
> Dat is de database van je repository, met de hele geschiedenis. Verwijder die nooit.

```console
$ git clone https://github.com/samserrien/my-first-repo.git
Cloning into 'my-first-repo'...
remote: Enumerating objects: 3, done.
Receiving objects: 100% (3/3), done.
$ cd my-first-repo
$ ls -a
.  ..  .git  README.md
```

<!-- slide 32 -->

### HTTPS of SSH

*Twee manieren waarop je laptop met GitHub praat*

#### HTTPS

- Hetzelfde protocol als surfen
- Inloggen met je GitHub-account (via de browser of een token)
- Werkt meteen, overal
- Vandaag gebruiken we dit

#### SSH

- Werkt met een sleutelpaar: private key blijft op je laptop, public key geef je aan GitHub
- Nooit meer wachtwoorden
- Dé manier zodra je dagelijks pusht
- Komt in Git advanced, volgende week

<!-- slide 33 -->

### Waar leeft een wijziging

*Vier plekken, drie commando's*

<!-- slide 34 -->

### Stagen

*Rood is nog niet gestaged, groen wel*

```console
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files:
 (use "git add <file>..." to include in what will be committed)
       index.html
$ git add index.html
$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
 (use "git restore --staged <file>..." to unstage)
       new file:   index.html
```

<!-- slide 35 -->

### Committen en pushen

*Na de commit loopt je lokale repo één commit voor op origin*

```console
$ git commit -m "Add index.html"
[main 50c57c1] Add index.html
 1 file changed, 12 insertions(+)
 create mode 100644 index.html
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
 (use "git push" to publish your local commits)

nothing to commit, working tree clean
$ git push
Writing objects: 100% (3/3), 412 bytes | 412.00 KiB/s, done.
To https://github.com/samserrien/my-first-repo.git
   20cfa4a..50c57c1  main -> main
```

<!-- slide 36 -->

### En op GitHub

*Tab Commits, of klik op het aantal commits bovenaan de repo*

Hetzelfde overzicht in je terminal: `git log --oneline`

<!-- slide 37 -->

### De flow

*Van je editor naar GitHub*

1. **Aanpassen**: Werk gewoon aan je files, zoals altijd.
2. **git add**: Kies wat in de volgende commit gaat. Meestal: alles, met een punt.
3. **git commit -m "..."**: Bewaar het pakketje met een duidelijke boodschap.
4. **git push**: Stuur je commits naar origin. Nu is het veilig en zichtbaar.

> **Wanneer commit je?**
>
> Elke keer je iets afgewerkt hebt dat je kan omschrijven in één zin. Niet op het einde van de dag, niet na elke letter. Klein en vaak.

<!-- slide 38 -->

### Commit messages

*De boodschap is voor je collega en voor jezelf over drie maanden*

#### Zo niet

- "Upload"
- "wip"
- "fix"
- "aaaaaah"
- Eén commit met een hele feature van drie dagen

#### Zo wel

- "Fix typo in about page"
- "Add contact link to navigation"
- "Move footer styles to footer.css"
- Begin met een werkwoord, beschrijf wat er verandert
- Engels of Nederlands, maar kies er één per project

<!-- slide 39 -->

### Een map die er al staat

*Van gewone map naar repository met git init*

`git init` maakt van je map een repository. Met `git remote add` weet hij waar origin staat.

> [!WARNING]
> **Leeg is echt leeg**
>
> Geen README of .gitignore aanvinken. Anders heeft origin al een commit die jij niet hebt en wordt je push geweigerd.

Voor een nieuw project blijft de repo eerst op GitHub maken en clonen de kortste weg.

```console
$ git init
Initialized empty Git repository in /Users/sam/Projects/portfolio/.git/
$ git add .
$ git commit -m "Initial commit"
[main (root-commit) 8f3a2c1] Initial commit
 3 files changed, 64 insertions(+)
$ git remote add origin https://github.com/samserrien/portfolio.git
$ git push -u origin main
To https://github.com/samserrien/portfolio.git
 * [new branch]      main -> main
```

<!-- slide 40 -->

### Je hebt index.html aangepast en git commit gedaan. Staat de wijziging nu op GitHub?

- A. Ja, commit bewaart online
- B. Nee, je moet eerst git add doen
- C. Nee, je moet nog pushen
- D. Alleen als je internet hebt

**Antwoord:** C. Nee, je moet nog pushen

Commit bewaart in je lokale repository. Pas na git push staat het op origin. Zonder git add had de commit trouwens niets bevat.

<!-- slide 41 -->

**Git vergeet niets.**

Een bestand dat je ooit commit, zit voor altijd in de geschiedenis. Ook als je het een commit later weer verwijdert.

<!-- slide 42 -->

### Die showreel van 2 GB

*Verwijderen is gewoon een nieuwe commit. De commit met de video blijft staan, en .git groeit mee.*

```console
$ git add showreel.mp4
$ git commit -m "Add showreel"
[main 4e1a9c2] Add showreel
 create mode 100644 showreel.mp4
$ git rm showreel.mp4
rm 'showreel.mp4'
$ git commit -m "Remove showreel, too big"
[main 8b03f7d] Remove showreel, too big
 delete mode 100644 showreel.mp4
$ du -sh .git
1.9G    .git
```

<!-- slide 43 -->

### En dan pushen

*GitHub weigert elk bestand boven 100 MB. Ook als het in een oudere commit zit.*

```console
$ git push
remote: error: File showreel.mp4 is 1942.37 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File
Storage - https://git-lfs.github.com.
To https://github.com/samserrien/portfolio.git
! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/samserrien/portfolio.git'
```

> [!WARNING]
> **Hetzelfde geldt voor een wachtwoord**
>
> Een API key of een .env die ooit gepusht is, is publiek. Hem nadien verwijderen helpt niet. Trek de key in en maak een nieuwe.

<!-- slide 44 -->

### Voorkomen en oplossen

#### Voor je commit

- Een `.gitignore` in je repo somt op wat Git moet negeren: `node_modules`, renders, exports, `.env`
- Lees `git status` voor je `git add .` typt
- Grote media horen op een drive, of in Git LFS als ze echt in de repo moeten

#### Al gecommit, nog niet gepusht

- Zit het in je laatste commit: `git reset HEAD~1` maakt die commit ongedaan, je files blijven staan
- Zet het bestand in `.gitignore` en commit opnieuw
- Zit het dieper of staat het al op GitHub, dan moet de geschiedenis herschreven worden met `git filter-repo`. Vraag hulp, dat is geen werk voor les 1

<!-- slide 45 -->

### Opdracht: Je eerste repo

*25 minuten, Individueel*

Van nul tot drie commits op GitHub. Hou git status bij de hand.

1. Maak op GitHub de repository my-first-repo, public, met README
2. Cloon hem naar een map Projects op je laptop
3. Maak index.html met wat HTML, dan add, commit, push
4. Herhaal dat nog twee keer met andere wijzigingen. Check de commits op GitHub.

<!-- slide 47 -->

## 6. Samenwerken

*Twee mensen, één origin. Wat er gebeurt als je vergeet te pullen, en hoe je dat oplost.*

<!-- slide 48 -->

### Origin loopt voor

*Alex heeft gepusht terwijl Sam aan het werken was*

<!-- slide 49 -->

### Zo ziet dat er echt uit

*Lees de foutmelding. Git zegt letterlijk wat je moet doen: eerst pullen, dan pushen.*

```console
$ git push
To https://github.com/samserrien/my-first-repo.git
! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/samserrien/my-first-repo.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
$ git pull
remote: Enumerating objects: 4, done.
From https://github.com/samserrien/my-first-repo
   20cfa4a..c6c26b4  main       -> origin/main
Merge made by the 'ort' strategy.
 contact.html | 9 +++++++++
 1 file changed, 9 insertions(+)
$ git push
To https://github.com/samserrien/my-first-repo.git
   c6c26b4..91d4e7b  main -> main
```

<!-- slide 50 -->

### Push is geen sync

*De denkfout achter bijna elke geweigerde push*

#### Wat veel mensen denken

- Push maakt origin gelijk aan mijn map.
- Wat bij mij weg is, verdwijnt ook op origin.
- Ik push het laatst, dus mijn versie wint.

#### Wat Git doet

- Push plakt jouw nieuwe commits achter wat er al staat.
- Origin gaat alleen vooruit. Nooit achteruit.
- Staat er iets dat jij nog niet hebt, dan weigert Git. Pull eerst.

<!-- slide 51 -->

### git pull

*Twee dingen in één commando*

- **01 Ophalen**: Git haalt de commits van origin die jij nog niet hebt. Dat heet fetchen.
- **02 Samenvoegen**: Die commits worden in jouw lokale geschiedenis gemerged. Hebben jullie aan verschillende files gewerkt, dan gaat dat vanzelf.

> [!WARNING]
> **En als jullie dezelfde regel aanpasten?**
>
> Dan krijg je een merge conflict. Git vraagt jou om te kiezen. Dat is volgende week, Git advanced. Vandaag ga je er wel eentje uitlokken in de opdracht.

<!-- slide 52 -->

### Plots zit je in Vim

*git pull maakt een merge commit, en die wil een boodschap. Git opent daarvoor je standaard editor, en dat is vaak Vim.*

```console
Merge branch 'main' of https://github.com/samserrien/my-first-repo
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
~
~
~
".git/MERGE_MSG" 6L, 283B
```

<!-- slide 53 -->

### Eruit geraken

*De boodschap die er staat is prima. Je moet ze alleen bewaren en Vim sluiten.*

1. **<kbd>Esc</kbd>**: Terug naar normal mode, voor het geval je al iets getypt hebt.
2. **<kbd>:wq</kbd> <kbd>Enter</kbd>**: Write en quit. Git maakt de merge commit met de boodschap die er staat.
3. **<kbd>i</kbd>**: Toch iets aanpassen? Met i kan je typen. Daarna weer Esc en :wq.

> [!WARNING]
> Het terminalvenster dichtklikken lost niets op. De merge blijft half af, en Vim laat een .swp-bestand achter dat je de volgende keer begroet.

<!-- slide 54 -->

### vi en Vim

#### Wat het is

- vi bestaat sinds 1976, Vim (Vi IMproved) sinds 1991
- Een modale editor: in normal mode is elke toets een commando, pas in insert mode typ je tekst
- Staat op zowat elke Linux-server en elke Mac
- Toch willen leren? [Vim Adventures](https://vim-adventures.com) is een game waarin je met Vim-toetsen rondloopt, en `vimtutor` in je terminal is een les van een halfuur

#### Waarom het opduikt

- Git opent de editor uit `core.editor`, of anders die uit `$EDITOR`
- Staat er niets ingesteld, dan valt Git terug op vi
- De installer van Git for Windows kiest standaard Vim

<!-- slide 55 -->

### Een editor die je wel snapt

*nano toont zijn sneltoetsen onderaan het scherm. Op een Mac is nano een doorverwijzing naar pico, dus hetzelfde commando werkt overal.*

```console
$ git config --global core.editor nano
```

- **nano en pico**: Je kan meteen typen. <kbd>Ctrl</kbd> <kbd>X</kbd> om te sluiten, <kbd>Y</kbd> om te bewaren, <kbd>Enter</kbd> om de bestandsnaam te bevestigen.
- **VS Code**: Met `core.editor "code --wait"` opent de boodschap in een tab. Sluit de tab en Git gaat verder. Werkt alleen als `code` in je terminal gekend is.

<!-- slide 56 -->

### Je zit in Vim voor een merge commit. Hoe maak je de merge af?

- A. Esc, dan :wq en Enter
- B. Ctrl+C
- C. exit typen en Enter
- D. Het terminalvenster sluiten

**Antwoord:** A. Esc, dan :wq en Enter

Esc brengt je naar normal mode, :wq bewaart en sluit. Ctrl+C en exit doen in Vim niets, en een gesloten venster laat een merge achter die nog niet af is.

<!-- slide 57 -->

### Opdracht: Tic tac toe via Git

*25 minuten, Per 2*

Per twee, één repo, om de beurt. Het bord is een tekstbestand en elke zet is een commit.

1. Eén van jullie maakt de repo `tic-tac-toe` met daarin `bord.txt`: drie rijen van drie puntjes. Nodig de andere uit via Settings, Collaborators. Die cloont.
2. Om de beurt: pull, vervang één puntje door je X of O, commit met je zet als boodschap ("X linksboven"), push.
3. Wie pusht zonder gepulld te hebben, krijgt een weigering. Lees de melding, pull, push.
4. Speel tot iemand wint en bekijk dan `git log --oneline`. Speel daarna nog een ronde waarin jullie allebei hetzelfde vakje pakken zonder te pullen.

<!-- slide 58 -->

## 7. Tools

*CLI is cool, maar je hoeft niet alles te typen.*

<!-- slide 59 -->

### Desktop apps voor Git

*Dezelfde commando's, met knoppen en een tekening van je geschiedenis*

- **[GitHub Desktop](/nl/programming-principles/git-in-github-desktop)**: Gratis, simpel, van GitHub zelf. Goed startpunt.
- **GitKraken**: Mooie visuele geschiedenis. Gratis voor publieke repos.
- **Sourcetree, Tower, Fork**: Uitgebreider, voor wie er dagelijks in zit.
- **[VS Code](/nl/programming-principles/git-in-vscode)**: Zit ingebouwd. Source Control-paneel, links in de zijbalk.

> [!WARNING]
> **Eerst de CLI, dan pas de knoppen**
>
> Een GUI verbergt wat er gebeurt. Als het misloopt (en het loopt mis), moet je de commando's kennen om het te fixen. Daarom leer je ze eerst.

<!-- slide 60 -->

### Opdracht: Huiswerk

*Individueel*

Alles komt in je portfolio: wat je deed, waar je vastliep, hoe je het oploste.

1. GitHub Classroom: accepteer `01 basic html website` via de link op Canvas, cloon de repo die je krijgt en voer de opdracht uit de README uit. Commit en push zoals vandaag.
2. Neem een bestaand project (bijvoorbeeld uit vorig jaar) en zet het in Git: repo maken, files toevoegen, een paar echte commits.
3. Probeer één desktop app. Doe er dezelfde flow mee. Schrijf in je portfolio wat je liever hebt en waarom.

<!-- slide 61 -->

**Always use Git.**

Voor elk project. Voor de rest van je opleiding en je carrière. Ook voor dat kleine testje van een uur.

## Begrippen

- **Versiebeheer**: Elke wijziging aan je project wordt bijgehouden: wat, wanneer, door wie en waarom. Je kan terug naar elke vorige versie, en meerdere mensen werken aan dezelfde code zonder elkaar te overschrijven. (slide 8)
- **Git**: Het versiebeheersysteem zelf: een gratis, open source programma op je computer. Het doet al het werk en draait volledig offline. (slide 15)
- **GitHub**: Een website van Microsoft die Git-repositories host. Het is je origin, met alles om samen te werken erbovenop. Zonder Git op je laptop kan je er niets mee. (slide 15)
- **git config**: Stelt Git in, zoals je naam en e-mail, want elke commit draagt je naam. Met --global geldt het voor elke repo op je laptop. Gebruik hetzelfde e-mailadres als op GitHub. (slide 19)
- **Git Bash**: De terminal die je op Windows samen met Git installeert. Hij begrijpt dezelfde commando’s als de terminal op Mac en Linux, dus gebruik die en niet cmd of PowerShell. (slide 22)
- **ls -la**: ls met twee vlaggen: -l toont rechten, grootte en datum, -a ook alles wat met een punt begint. Zonder -a zie je de map .git nooit staan. (slide 24)
- **cat**: Toont de inhoud van een bestand in je terminal. Handig om snel iets te checken, niet om in te werken. (slide 26)
- **.git**: De verborgen map in je repo met de hele geschiedenis, de database van je repository. Verwijder die nooit. (slide 31)
- **git clone**: Kopieert een remote repo naar je laptop, met de volledige geschiedenis erbij. De url vind je op GitHub onder de knop Code. (slide 31)
- **Working directory**: Je files zoals ze nu op je schijf staan, de plek waar je werkt. Wat je hier aanpast, zit nog in geen enkele commit. (slide 33)
- **Staging area**: Wat in de volgende commit gaat. Met git add zet je een file klaar (stagen), met git commit wordt alles in de staging area één commit. (slide 33)
- **Untracked**: Een nieuwe file die Git ziet maar nog niet volgt. Pas na git add gaat hij mee in een commit. Een bestaande file die je aanpast, heet modified. (slide 33)
- **git status**: Zegt wat er aan de hand is in je repo. Rood is nog niet gestaged, groen wel, en of je voorloopt op origin. Git zet er meteen bij welk commando je nu nodig hebt. (slide 34)
- **git add**: Kiest wat in de volgende commit gaat. git add . neemt alles in de map mee, dus lees eerst git status. (slide 37)
- **git commit -m**: Bewaart alles uit de staging area als één commit in je lokale repo, met de boodschap achter -m. Origin weet dan nog van niets. (slide 37)
- **git push**: Stuurt je lokale commits naar origin en plakt ze achter wat er al staat. Heeft origin commits die jij nog niet hebt, dan weigert Git en moet je eerst pullen. (slide 50)
- **git log --oneline**: Toont de commits van je repo, één per regel met de korte sha en de boodschap. Hetzelfde overzicht als de tab Commits op GitHub. (slide 36)
- **Commit message**: De boodschap bij een commit, voor je collega en voor jezelf over drie maanden. Begin met een werkwoord en zeg wat er verandert: "Fix typo in about page", niet "fix". (slide 38)
- **git init**: Maakt van een gewone map een repository. Voor een map die al op je laptop staat, samen met git remote add. (slide 39)
- **git remote add**: Zegt tegen je repo waar origin staat: git remote add origin met de url van een lege repo op GitHub. Daarna volgt de eerste push. (slide 39)
- **git pull**: Twee dingen in één commando. Git haalt de commits van origin die jij nog niet hebt (fetchen) en merget ze in je lokale geschiedenis. (slide 51)
- **Vim**: Een modale editor die Git opent voor de boodschap van een merge commit als je niets anders instelde. Eruit geraken doe je met Esc, dan :wq en Enter. (slide 54)
- **core.editor**: De instelling voor de editor die Git opent als hij een boodschap nodig heeft. git config --global core.editor nano kiest nano, "code --wait" kiest VS Code. (slide 55)
- **nano**: Een eenvoudige editor in je terminal die zijn sneltoetsen onderaan toont. Ctrl X sluit, Y bewaart. Op een Mac heet hij pico, maar het commando nano werkt ook. (slide 55)

## Links en bronnen

### In de presentatie

- [github.com/signup](https://github.com/signup) (slide 17)
- [git-scm.com](https://git-scm.com/) (slide 18)
- [mctantwerp.github.io/codeplay/spel/terminal-velocity](https://mctantwerp.github.io/codeplay/spel/terminal-velocity) (slide 28)
- [github.com/new](https://github.com/new) (slide 30)
- [Vim Adventures](https://vim-adventures.com) (slide 54)
