# Wijzigingen van de repository

Als je een nieuw bestand aanmaakt in een Git werkmap (working directory) dan is dat bestand standaard “**untracked**”. Dat wil zeggen dat het wel in een Git werkmap staat maar Git trekt er zich absoluut niets van aan: er worden geen versies van bijgehouden, er wordt zelfs niet bijgehouden of dit bestand gewijzigd wordt. Bij het bekijken van de status van een project staan deze bestanden in de rubriek “Untracked files” (zoals het bestand a.txt uit de vorige oefening).

Tracked bestanden zijn bestanden waarvan Git het bestaan wel kent. Dit zijn bestanden die in de laatste snapshot zaten. Tracked files kennen 3 toestanden:

* **unmodified** (ongewijzigd)
* **modified** (gewijzigd)
* **staged** (staat klaar om aan de volgende snapshot toegevoegd te worden)

<figure><img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FKi7Ll7U6VVoSYEbzl8eJ%2Flevenscyclus.png?alt=media&#x26;token=c5993a03-757e-405a-bada-4ce15aaabd0f" alt=""><figcaption><p>Git levenscyclus</p></figcaption></figure>

## De status van je bestanden controleren

Met het commando <mark style="color:orange;">`git status`</mark> kan je de status van je repo controleren. We hebben dit eerder al gedaan.

{% hint style="success" %}
Controleer de status nogmaals voor de projecten "GitProject1" en "GitProject2" en vergelijk het resultaat.
{% endhint %}

Wanneer er geen untracked bestanden zijn en ook geen tracked bestanden die sinds de laatste snapshot gewijzigd zijn krijg je volgend antwoord:

```git
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
```

Dit zou het geval moeten zijn voor "GitProject2".

## Nieuwe bestanden volgen (tracking)

Om een nieuw bestand te beginnen te tracken, gebruik je het commando <mark style="color:orange;">`git add`</mark> gevolgd door de bestands- of mapnaam. Je kan ook gebruik maken van wildcards om verschillende bestanden/mappen tegelijk toe te voegen.

{% hint style="danger" %}
Wanneer je een folder/map volgt, volg je automatisch ALLES wat in die map zit. Voeg je later bestanden toe aan die map dan worden die standaard niet gevolgd. **Deze moeten dan nog apart worden toegevoegd.**
{% endhint %}

{% hint style="success" %}

1. Ga naar de map "GitProject1".
2. Begin het bestand test.txt te tracken.
3. Controleer de status.
4. Voeg de bestanden a.txt, b.txt en c.txt toe aan deze map.&#x20;
5. Controleer de status.
6. Begin deze 3 nieuwe bestanden te tracken. Doe dit met 1 regel code (gebruik dus wildcards!).
7. Controleer de status.
8. Voeg de bestanden r.txt en Readme.md toe aan de map.
9. Begin deze 2 nieuwe bestanden te tracken. Doe dit met 1 regel code (gebruik dus wildcards!).
10. Controleer de status van het project.

<details>

<summary>Oplossing</summary>

<img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FB4kzOxpJQhuJq7grgK46%2Ftrack%20files%20wildcard.gif?alt=media&#x26;token=da6271f7-7d49-4ef8-94b4-e688086a3ae0" alt="Track files with wildcards" data-size="original">

</details>
{% endhint %}

## Bestanden stagen

We hebben eerder in de cursus gezien: **Alle bestanden die in de staging area staan, kunnen we later toevoegen aan de volgende snapshot.**

Wanneer je een nieuw bestand begint te volgen (tracken) dan komt het in de "Staging area" terecht. Het bestand heeft dus toestand “Staged”.&#x20;

Wanneer je een bestand dat zich reeds in een vorige snapshot bevindt wijzigt, komt het niet onmiddellijk in de "Staging area". Het kan immers zijn dat je wat aan het experimenteren bent, of dat je de gemaakte aanpassingen aan het bestand (nog) niet wilt opslaan. Wanneer je het gewijzigde bestand toch wil toevoegen aan de "Staging area" gebruik je opnieuw het commando <mark style="color:orange;">`git add`</mark>.

Bestanden uit de vorige snapshot die nog niet gewijzigd zijn "Unmodified", zullen niet worden weergegeven wanneer je de status bekijkt. Gewijzigde bestanden "Modified" en bestanden die "Staged" zijn wel.

{% hint style="success" %}

1. Ga naar GitProject2 en controleer de status.
2. Open het README.md bestand. Type daarvoor de naam van het bestand (let wel op de hoofdletters)!
3. Voeg aan dat bestand onderaan een regel tekst toe en sla het bestand op.
4. Controleer de status.
5. "Stage" het bestand.
6. Controleer de status opnieuw.

<details>

<summary>Oplossing</summary>

<img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FaPohiBu5sMY1UUp2QGl9%2Fmodify-add.gif?alt=media&#x26;token=9fe31606-5be9-4475-bce8-2aac765cef77" alt="" data-size="original">

</details>
{% endhint %}

## Bestanden negeren

Vaak zul je een aantal bestanden hebben waarvan je niet wilt dat Git deze automatisch toevoegt of zelfs maar als untracked toont. Om dit te doen maak je een bestand genaamd <mark style="color:orange;">`.gitignore`</mark>, waarin je de bestandsnamen plaatst die je wilt negeren.&#x20;

* Gebruik voor elk nieuw te negeren bestand een nieuwe regel.&#x20;
* Je kan gebruik maken van wildcards.&#x20;

{% hint style="danger" %}
Wanneer je gebruik maakt van wildcards, moet je wel opletten dat je die niet te ruim neemt. Stel dat voorlopig alle bestanden die met de letter "n" beginnen genegeerd mogen worden. Je zou dan de regel "n\*.\*" kunnen toevoegen aan .gitignore. Wanneer je later dan bestanden toevoegt aan je project die met de letter "n" beginnen, zullend die ook genegeerd worden.
{% endhint %}

{% hint style="success" %}

1. Ga naar de map GitProject2 en controleer de inhoud en de status.
2. Voeg de bestanden "n.txt", "negeermij.txt", "negeermij.info", "a.log" en "b.log" toe aan de map met het commando <mark style="color:orange;">`echo`</mark>
3. Controleer de status opnieuw.

<details>

<summary>Oplossing</summary>

<img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FAbZvajejyngQpgLMAoCS%2Fgitignore1.gif?alt=media&#x26;token=e38598cc-5488-4bc2-9a4f-02ff99bcc574" alt="" data-size="original">

</details>

1. Voeg het bestand ".gitignore" toe aan de map
2. Open het bestand ".gitignore"  en voeg daar het bestand "n.txt", alle bestanden met als naam "negeermij" en alle bestanden met de extensie ".log" aan toe aan dit bestand.
3. Controleer de inhoud en de status van de map.

<details>

<summary>Oplossing</summary>

<img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FgJSBKNsbceSDopMCRRQb%2Fgitignore2.gif?alt=media&#x26;token=9c556225-854f-45f7-b43c-483e16936fb8" alt="" data-size="original">

</details>

1. Open ".gitignore" opnieuw, verwijder de regel "n.txt" en sla het bestand op.
2. Controleer de inhoud en de status van de map.
   {% endhint %}

Er zijn nog heel wat mogelijke patronen Git ignore patronen. Je vind er een heleboel van terug onderaan de [Git Cheat Sheet](https://dbh-ict.gitbook.io/inleiding-git-github/git-cheat-sheet#git-ignore).

## Wijzigingen committen

Als je de staging area gevuld is zoals jij het wilt, kun je de wijzigingen committen met het commando. We hebben hiervoor enkele mogelijkheden:

* Type "<mark style="color:orange;">`git commit`</mark>. Hierna start de editor op die we in het begin hebben ingesteld (in ons geval Notepad++) met daarin een standaard boodschap die we zouden kunnen gebruiken. Alle regels zijn echter nog voorafgegaan door een #, waardoor deze genegeerd zullen worden. Wil je deze standaard boodschap gebruiken, verwijder dan overal de #. je kan uiteraard ook je eigen boodschap meegeven.&#x20;
* Type <mark style="color:orange;">`git commit -m “[boodschap]`</mark><mark style="color:orange;">”</mark>&#x20;
* Wanneer je een *modified* bestand onmiddellijk wilt committen zonder het eerst in de staging area te plaatsen kan dit ook met de <mark style="color:orange;">`-a`</mark> optie. Type dan <mark style="color:orange;">`git commit -a -m “[boodschap]”`</mark>`.`

{% hint style="danger" %}
Wanneer je geen boodschap meegeeft, zal de commit niet uitgevoerd worden.&#x20;

Enkel *modified* bestanden zullen worden toegevoegd aan de nieuwe commit. Wanneer alle bestanden in de staging area *unmodified* zijn, zal de commit dus ook niet uitgevoerd worden.&#x20;
{% endhint %}

{% hint style="success" %}

1. Ga naar de map GitProject2 en controleer de inhoud en de status.
2. Stage alle Untracked bestanden in 1 keer
3. Bekijk de status
4. Commit de wijzigingen van je project

   Geef onderaan de tekst als boodschap "first commit" mee, sla het bestand op en sluit af.
5. Controleer de status opnieuw.&#x20;

<details>

<summary>Oplossing</summary>

<img src="https://1633044495-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCY7jofLvHZLUwlQLNxqF%2Fuploads%2FRYrpDyvnuKzkkpZAc6Iu%2FFirst%20commit.gif?alt=media&#x26;token=d1345671-229e-4a0b-8688-2f6a59bd9400" alt="" data-size="original">

</details>
{% endhint %}

## Aanpassingen maken

### Bestand verwijderen

Wanneer je een bestand uit de werkmap verwijdert zonder het <mark style="color:orange;">`git rm`</mark> commando te gebruiken, blijft de verwijderde bestandsinformatie in de Git repository staan en wordt het bestand opgeslagen in de "untracked files". Het gebruik van "git rm" zorgt ervoor dat het bestand niet alleen uit de werkmap wordt verwijderd, maar ook uit de Git repository. Het bestand wordt dan opgeslagen in de Git repository als een verwijderd bestand.

Er zijn verschillende manieren om <mark style="color:orange;">`git rm`</mark> te gebruiken, bijvoorbeeld:

1. <mark style="color:orange;">`git rm [bestandsnaam]`</mark> - hiermee verwijder je een specifiek bestand uit de werkmap en Git repository.
2. <mark style="color:orange;">`git rm -r [directory]`</mark> - hiermee verwijder je een directory en de inhoud ervan uit de werkmap en Git repository.
3. <mark style="color:orange;">`git rm --cached [bestandsnaam]`</mark> - hiermee verwijder je een bestand uit de Git repository maar niet uit de werkmap.

Na het uitvoeren van "git rm" moet je de wijzigingen committen om ze definitief te maken.

### Een bestand verplaatsen/hernoemen

Een bestand verplaatsen of hernoemen kan met het <mark style="color:orange;">`git mv [bestandsnaam_old] [bestandsnaam_new]`</mark> commando.

Je kan het bestand ook kopieren naar een bestand met een andere naam, je oud bestand verwijderen en het nieuwe bestand beginnen te volgen.

### Een commit wijzigen.

Je kan een bestaande commit (snapshot) wijzigen met het commando <mark style="color:orange;">`git commit --amend`</mark>.  Je kan dit commando op 2 manieren gebruiken

1. Je wilt enkel de boodschap bij de commit veranderen. Type dan deze code, de texteditor zal dan openen met daarin de commit boodschap die je geschreven hebt. Je kan deze aanpassen en opnieuw opslaan.
2. Je wilt geen nieuwe commit maken, maar nog wat aangepaste bestanden toevoegen aan  een reeds bestaande. Voeg dan eerst de aangepaste bestanden toe met <mark style="color:orange;">`git add`</mark> en type de code. Je creëert geen nieuwe commit, maar past de laatste aan.

### Een gestaged bestand unstagen

Vooraleer je een commit doet, moet je zeker zijn dat alle bestanden in de staging area mogen toegevoeg worden aan de nieuwe snapshot. Indien er bestanden zijn die we toch niet willen toevoegen, hebbben we 2 mogelijke commando's om een gestaged bestand uit de staging area te halen. Het ene commando is al wat ingrijpender dan de andere.

1. <mark style="color:orange;">`git reset HEAD [bestandsnaam]`</mark> zal het bestand uit de staging area halen, maar de wijzigingen in de working directory zullen bewaard blijven. \
   Dit commando gebruik je dus wanneer je een bestand hebt aangepast en in de gestaged hebt. Je wilt de aanpassingen behouden, maar nog wat wijzigingen doorvoeren vooraleer je dit bestand wilt opnemen in de commit.
2. <mark style="color:orange;">`git rm --cached [bestandsnaam]`</mark>  zal het bestand uit de staging area halen, maar ook alle wijzigingen sinds de laatste commit teniet doen.

### Een gewijzigd bestand weer ongewijzigd maken

Bestanden die we gewijzigd hebben, die niet in de staging area staan en waarvan we de wijziging niet willen behouden, brengen we terug naar hun toestand van de laatste commit met het commando <mark style="color:orange;">`git checkout -- [bestandsnaam]`</mark>.

## Oefeningen

Voor de volgende oefening maak je gebruik van volgende site:

{% embed url="<https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_National_Pok%C3%A9dex_number>" %}
Alle Pokemon per generatie
{% endembed %}

Voor deze oefeningen kan je bestanden/mappen uiteraard ook aanmaken/aanpassen vanuit de verkenner. Dit hoeft niet (tenzij expliciet opgegeven) vanuit CMD.

1. Maak een nieuwe map "Pokemon" aan.
2. Zorg ervoor dat deze map een Git repo wordt.
3. Gebruik het commando <mark style="color:orange;">`echo`</mark> om in deze map het bestand "Readme.md" met daarin de tekst "info Pokemon" aan te maken. Maak ook het lege bestand "InfoVoorMezelf.md" aan.
4. Zorg ervoor dat het bestand "InfoVoorMezelf.md" genegeerd wordt door Git.
5. Bekijk de status van het project.
6. Maak het bestand "Generation1.csv".
7. Volg alle bestanden (behalve deze die genegeerd moeten worden natuurlijk).
8. Maak een commit (1) met als mededeling "Generation1 toegevoegd".
9. Maak de bestanden "Generation2.csv", "Generation3.csv" en "Genera<mark style="color:red;">**tie**</mark>4.csv" <mark style="color:red;">**(zorg ervoor dat het laatste bestand de Nederlandse benaming heeft!)**</mark> aan en volg deze door gebruik te maken van 1 regel code.&#x20;
10. Bekijk de status van het project.
11. Maak een nieuwe commit (2) met als mededeling "Generaties 2-4 toegevoegd".
12. Vul het *nummer* en de *naam* van de eerste 5 Pokemon van de eerste generatie in. Dit is een .csv bestand, zorg dus voor de juiste structuur.
13. Bekijk de status van het project.
14. Maak een commit (3) met als mededeling "Eerste 5 Pokemon Gen1 toegevoegd". (vergeet de tussenstap niet!)
15. We merken nu dat we het *type* Pokemon vergeten toevoegen zijn. Pas het bestand "Generation1.csv" dus aan met het *type* (bij 2 types, geef je ze allebei, gescheiden door "/"). We maken nu <mark style="color:red;">**geen nieuwe commit**</mark>, maar voegen deze wijzigingen toe aan de laatste commit (3). Voeg ook aan de mededeling toe "nr, naam en type". &#x20;
16. Voeg nu ook de eerste 5 Pokemon van de generaties 2-4 toe en maak een commit (4) met als tekst "5 Pokemon in generatie 2-4".
17. Pas de naam van het bestand "Generatie4.csv" aan door "Generation4.csv" en maak een nieuw commit (5) met als tekst "Generatie4 -> Generation4"
