===== Jeg har lavet fejl og vil fordtryde en ændring ===== ==== 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]]