Versionsstyring med Git

==== Læringsmål ====

Du skal kunne:

  • Forklare forskellen på ''git restore'', ''git reset'' og ''git revert''.
  • Anvende hver kommando i praksis i et lille Git-projekt.
  • Vælge den rigtige kommando i den rigtige situation.
  • Forstå hvilke kommandoer der er sikre i et delt repository.

==== Teori ====

=== git restore ===
* Fortryder ændringer i arbejdsfiler før commit.
* Historikken ændres ikke.
* Bruges til at gendanne sidst gemte version.

=== git reset ===
* Flytter projektets lokale historik til en tidligere commit.
* Kan slette commits lokalt.
* Ikke sikkert ved samarbejde.

=== git revert ===
* Laver en ny commit, der fortryder en tidligere commit.
* Ændrer ikke historikken.
* Den anbefalede metode i samarbejdsprojekter.


==== Git: restore, reset og revert — Forklaring + Øvelser ====

Forestil dig, at Git er et skrivebord, hvor du arbejder på filer.\ Noget er kladde (working directory), noget er klar til commit (staging), og noget er gemt i historikken (commits).\ Nogle handlinger er lokale og ufarlige, andre kan være problematiske i samarbejde.

=== git restore ===
"Fortryd kladde"

Bruges til at fortryde ændringer i arbejdsfiler, før du har lavet commit.

  • Du har ændret filer, men ikke committet dem.
  • ''git restore'' betyder: “Gå tilbage til sidste gemte version.”
  • Historikken ændres ikke.

Billede i hovedet:
Du har tegnet på et papir, men fortryder tegningen → du smider papiret ud og tager en ny kopi fra skuffen.


=== git reset ===
"Ryd skrivebordet (lokalt)"

Bruges til at spole projektet tilbage i historikken – men kun lokalt.
Derfor ikke sikkert ved samarbejde.

  • Du går tilbage til en tidligere commit.
  • Commits efter denne fjernes fra din lokale historik.
  • Kan også fjerne filer fra staging.

Billede i hovedet:
Du har lavet tre tegninger (commits). Du vil slette de to sidste → du river dem ud af din egen mappe.
Andres mapper ændres ikke.


=== git revert ===
"Annullér i historikken (sikkert ved samarbejde)"

Bruges til at lave en ny commit, der fortryder en tidligere commit – uden at ændre historikken.

  • Den laver en slags "mod-commit".
  • Den sikre måde at fortryde på i et delt repository.

Billede i hovedet:
Du har tegnet en streg i mappen. I stedet for at rive siden ud, laver du en ny tegning, hvor du visker stregen ud.
Alle kan se, hvad der er sket.


==== Kort opsummering ====

^ Kommando ^ Betydning ^ Hvornår bruges det? ^ Sikkert i samarbejde? ^
| git restore | Fortryd kladde | Når du vil tilbage til sidste gemte version | Ja |
| git reset | Ryd skrivebord (lokalt) | Når du vil spole din lokale historik tilbage | Nej |
| git revert | Annullér i historikken | Når du vil fortryde en delt commit | Ja |


==== Checkpoints ====

Du skal kunne:

  • Forklare forskellen på restore/reset/revert.
  • Vide hvornår man ikke må bruge ''reset''.
  • Gendanne en fil der er ændret men ikke committet.
  • Lave et mod-commit der fortryder en fejl.
  • Vide hvordan man arbejder sikkert med delt historik.

==== Øvelse 1 – "Fortryd kladde" med git restore (nem) ====

Formål: Lære at gendanne ændrede filer før commit.

Trin:
- Opret en mappe og kør ''git init''.
- Opret ''tekst.txt'' med indholdet:
* ''Dette er version A''
- Commit filen.
- Ændr filen til:
* ''Dette er version B''
- Kør: ''git restore tekst.txt''

Forventet resultat:
Filen viser igen "Dette er version A".

Checkpoints:
* Hvad sker der hvis "version A" ikke var committet?
* Ændrer restore historikken?


==== Øvelse 2 – "Ryd skrivebordet" med git reset (mellem) ====

Formål: Forstå soft/mixed/hard reset uden at ødelægge remote.

Trin:
1. Opret et repo uden remote.
2. Lav tre commits: "A", "B", "C".
3. Kør ''git log --oneline'' og noter id for "B".
4. Kør: ''git reset --hard ''

Forventet resultat:
* Commit "C" forsvinder lokalt.
* Projektet matcher commit "B".

Checkpoints:
* Hvorfor må man ikke køre ''reset --hard'' i delt repo?
* Hvad er forskel på ''--soft'', ''--mixed'' og ''--hard''?


==== Øvelse 3 – "Fortryd i historikken" med git revert (svær) ====

Formål: Forstå hvordan man fortryder en commit uden at ændre historikken.

Trin:
1. Lav commit 1: opret ''tal.txt'' med tallet ''1''.
2. Lav commit 2: skift tallet til ''2''.
3. Se loggen: ''git log --oneline''
4. Revert commit 2:
''git revert ''

Forventet resultat:
* Ny commit: "Revert "
* Filen viser igen 1

Checkpoints:
* Hvorfor er revert sikker i samarbejde?
* Hvad ville der ske hvis man brugte reset i stedet?


==== Øvelse 4 – Case: "Git-katastrofen" (team-øvelse) ====

Scenarier (vælg 1):
* En elev har ændringer der skal fortrydes → brug ''restore''.
* En elev har lavet commits lokalt → brug ''reset'' (uden push).
* En elev har pushed en fejl → brug ''revert''.

Succeskrav:
* Repo ender i korrekt tilstand.
* Remote-historik er bevaret.
* Gruppen forklarer deres valg korrekt.


==== Mini‑quiz ====

  • Hvilken kommando ændrer ikke historikken?
  • Hvilken kommando er sikker i samarbejde?
  • Hvad gør ''git reset --hard'' ved dit working directory?
  • Kan ''git restore'' gendanne en fil uden at ændre historikken?
  • Hvad er forskellen på at fjerne en commit vs. at modvirke den?

++++ Hint |
Facit:
1) restore, 2) revert, 3) overskriver tilstand, 4) ja, 5) reset fjerner lokalt – revert skaber et ekstra mod-commit.
++++


[[{}git:git_forloeb|Til oversigt]]