Tidsåtgång: 4–5 timmar
Arbetssätt: Två personer, driver/navigator-rotation
Fokus: Git-workflow, commits, branches, rollback, merge-konflikter
Övningen kombinerar grundläggande webbutveckling (HTML/CSS/JavaScript) med avancerad Git-hantering. Ni bygger en enkel webbapplikation samtidigt som ni övar på branching, meningsfulla commits, rollback-strategier och konfliktlösning.
- En person skapar ett nytt Git-repository lokalt
- Skapa ett remote "bare" (tomt, ingen readme) repository på GitHub (public)
- Lägg till sökvägen till remote repot lokalt via git add URL-till-repot
- Pusha till remote
- Den andra personen klonar repository
Skapa följande filer på main branch:
project-root/
├── index.html (minimal struktur)
├── styles.css (tom eller minimal)
├── app.js (tom eller minimal)
└── README.md (projektbeskrivning)
Gör initial commit: "init: project baseline with base files"
Ni ska följa dessa regler genomgående:
- Imperativ form: "add", "fix", "refactor", "feat"
- Prefix med typ:
feat:,fix:,refactor:,chore: - Kortfattad första rad (max 72 tecken)
- Längre beskrivning vid behov efter tom rad (Kolla hur man gör detta i Git dokumentationen)
- En logisk enhet (sak, funktion) per commit
- Driver: skriver kod
- Navigator: granskar, diskuterar, guidar
- Växla roll var 20–30 min
Ni ska bygga en Task Manager med följande funktioner:
- Header med titel och navigering
- Formulär för att lägga till task (titel + prioritet)
- Lista som visar tasks
- Möjlighet att markera task som klar
- Möjlighet att ta bort task
- Filtrering: visa alla/aktiva/klara
- Responsiv design (mobile-first)
Branch: feature/layout
- Skapa och checka ut branch
- Implementera HTML-struktur:
- Semantiska element (header, main, section, footer)
- Form med input-fält och button
- Container för task-lista
- Gör minst 3 separata commits:
feat: add header and navigation structurefeat: add task input formfeat: add task list container
- Push branch till remote
- Merge till
main(via PR eller lokalt)
Checkpoint: Verifiera att main har uppdaterats korrekt
Branch: feature/base-styles
- Skapa och checka ut ny branch från
main - Implementera:
- CSS-reset eller normalize
- Grundläggande typografi och färgschema
- Layout för form och lista
- Button-styling
- Gör minst 4 commits med meningsfulla meddelanden
- Introducera avsiktligt fel: I sista commit, lägg till CSS som förstör någon layout (t.ex.
body { display: none; }) - Push branch
- Merge till
main
Checkpoint: main innehåller nu ett fel som ni ska åtgärda senare
Branch: feature/responsive
- Skapa branch från
main(inkluderar felet) - Implementera:
- Mobile-first approach
- Media queries för tablet/desktop
- Flexbox eller Grid för layout
- Testa i olika skärmstorlekar
- Gör 3–4 commits
- Push branch (merge EJ än)
Vänta med merge
Branch: feature/task-logic
- Skapa branch från
main - Implementera JavaScript:
- Lägg till task
- Visa tasks i DOM
- Markera som klar (toggle)
- Ta bort task
- LocalStorage för persistens
- Dela upp i små logiska commits:
feat: add task creation logicfeat: implement task renderingfeat: add toggle complete functionalityfeat: add delete task featurefeat: implement localStorage persistence
- Push branch (merge EJ än)
Checkpoint: Nu har ni flera branches redo att mergas, plus ett fel i main
Mål: Åtgärda felet som introducerades i Del 2
- Checka ut
main - Öppna index.html i browser
- Identifiera vilket fel som finns (layout förstörd)
- Använd
git log --onelineför att hitta commits frånfeature/base-styles
- Identifiera commit-hash för den felaktiga commit
- Använd:
git revert <commit-hash> - Testa att felet är åtgärdat
- Push till remote
- Skapa en test-branch:
test/rollback-experiment - Använd
git reset --hard HEAD~1för att gå tillbaka - Observera skillnaden mot
revert - Diskutera: När är reset lämpligt vs revert?
- Ta bort test-branch
Mål: Skapa och lösa en merge-konflikt
-
Checka ut
feature/responsive -
Ändra
<h1>i index.html till:<h1>Task Manager Pro</h1> -
Commit:
fix: update application title -
Push branch
-
Checka ut
feature/task-logic -
Ändra samma
<h1>till:<h1>My Task Dashboard</h1> -
Commit:
feat: personalize app title -
Push branch
- Checka ut
main - Merge
feature/responsive(bör gå smidigt) - Försök merge
feature/task-logic - Konflikt uppstår!
- Kör
git statusför att se konfliktfiler - Öppna index.html och hitta konfliktmarkörer:
<<<<<<< HEAD <h1>Task Manager Pro</h1> ======= <h1>My Task Dashboard</h1> >>>>>>> feature/task-logic - Välj en lösning (eller kombinera):
<h1>Task Manager – Dashboard</h1> - Ta bort konfliktmarkörer
- Testa i browser
- Stage:
git add index.html - Commit:
git commit(meddelande genereras automatiskt) - Push till remote
Checkpoint: Konflikt löst, båda branches mergade
Branch: feature/filter
- Skapa branch från uppdaterad
main - Implementera filtrering (visa alla/aktiva/klara tasks)
- Lägg till knappar eller radio buttons för filter
- Uppdatera rendering-logik
- Gör 3 commits
- Push och merge till
main
Mål: Städa commit-historik med interaktiv rebase
- Skapa ny branch:
feature/polish - Gör några små förbättringar (CSS-tweaks, kommentarer i kod)
- Gör 4–5 små commits (simulera "work in progress")
- Använd interaktiv rebase för att squash:
git rebase -i HEAD~5
- Squash alla commits till 2 meningsfulla commits
- Force-push:
git push --force-with-lease
- Varför force-push?
- När är det säkert att omskriva historik?
- Varför
--force-with-leaseistället för--force?
- Skapa en sista feature-branch:
feature/final-touches - Gör små förbättringar (README, kommentarer, styling)
- Push branch
- Skapa Pull Request på GitHub med:
- Beskrivande titel
- Detaljerad beskrivning av ändringar
- Checklist (om relevant)
- Den andra personen granskar PR:
- Kommentera på kod
- Begär ändringar eller approva
- Merge PR (välj squash-merge eller merge-commit)
Mål: Skapa en formell release av projektet med versionstag och release notes
En Git tag är en märkning av en specifik commit (som ett bokmärke i historiken).
En GitHub Release är ett paket som innehåller:
- Taggen
- Automatiska nedladdningslänkar (zip/tar.gz av koden)
- Release notes (beskrivning av vad som är nytt/ändrat)
- Valfritt: bifogade filer (binärer, assets)
Varför? En release markerar en stabil version av projektet och gör det lätt för andra att hitta och ladda ner specifika versioner.
- Checka ut
main:git checkout main
- Pull senaste ändringar:
git pull
- Verifiera att allt fungerar i browser
- Kontrollera commit-historik:
git log --oneline -10
-
Skapa en annotated tag (rekommenderat för releases):
git tag -a v1.0.0 -m "Release: Task Manager v1.0.0 - Initial stable version"-a= annoterad tag (innehåller metadata)v1.0.0= versionsnamn (följer Semantic Versioning: MAJOR.MINOR.PATCH)-m= meddelande
-
Verifiera att taggen skapades:
git tag git show v1.0.0
git push --tagseller specifikt för en tag:
git push origin v1.0.0Resultat: Taggen syns nu på GitHub under "Tags" (bredvid "Branches")
-
Navigera till repository på GitHub
-
Klicka på "Releases" (höger sidebar under "About", eller via huvudmenyn)
-
Klicka "Create a new release" eller "Draft a new release"
-
Fyll i Release-formuläret:
Choose a tag:
- Välj
v1.0.0från dropdown (den tag ni precis pushade)
Release title:
Task Manager v1.0.0Describe this release: Skriv release notes i Markdown-format. Exempel:
## ✨ Features - ✅ Add, complete, and delete tasks - 🎯 Filter tasks by status (all/active/completed) - 💾 Automatic save with LocalStorage - 📱 Fully responsive design (mobile-first) ## 🛠️ Technical Details - Vanilla JavaScript (no frameworks) - Semantic HTML5 - Mobile-first CSS with Flexbox - Persistent storage via LocalStorage ## 🚀 Installation 1. Download source code (zip below) 2. Open `index.html` in a modern browser 3. Or serve via local server: `python -m http.server` ## 📝 Known Issues None at this time. ## 👥 Contributors - [Ditt namn] - [Din partners namn]
- Välj
-
Valfritt: Bifoga filer
- Om ni hade kompilerade filer, bilder, eller andra assets kan ni dra och släppa här
- För denna övning: hoppa över
-
Pre-release?
- Låt vara avbockad (detta är en stabil release)
- Skulle användas för beta/alpha-versioner
-
Klicka "Publish release"
-
På GitHub:
- Releasen syns under "Releases"
- Automatiska nedladdningslänkar för "Source code (zip)" och "Source code (tar.gz)" finns
-
Lokalt:
git fetch --tags git tag -l
-
Testa nedladdning:
- Klicka på "Source code (zip)" på GitHub
- Packa upp och öppna index.html för att verifiera
Reflektera tillsammans:
-
Vad är skillnaden mellan en tag och en release?
- Tag: En Git-referens till en specifik commit
- Release: Ett GitHub-koncept som paketerar en tag med metadata och filer
-
När skapar man en release?
- Vid varje stabil version (1.0.0, 1.1.0, 2.0.0)
- Vid bugfix-releases (1.0.1)
- Inte för varje commit eller feature
-
Vad är Semantic Versioning?
- MAJOR (1.0.0 → 2.0.0): Breaking changes (inkompatibla ändringar)
- MINOR (1.0.0 → 1.1.0): Nya features (bakåtkompatibla)
- PATCH (1.0.0 → 1.0.1): Bugfixes (bakåtkompatibla)
Om tid finns kvar:
-
Skapa en hotfix:
- Hitta en liten bugg
- Fixa på branch
hotfix/1.0.1 - Merge till
main - Skapa tag
v1.0.1och ny release
-
Experimentera:
- Skapa en pre-release (t.ex.
v1.1.0-beta.1) - Testa att checka ut en specifik tag:
git checkout v1.0.0
- Återgå till main:
git checkout main
- Skapa en pre-release (t.ex.
Checkpoint: Ni har nu en officiell v1.0.0 release med automatiska nedladdningslänkar och dokumentation!
Diskutera och dokumentera:
- Vilka Git-kommandon kändes naturliga?
- Hur fungerade kommunikationen i parprogrammeringen?
- Vilka Git-koncept var svåra?
- Vilka konflikter uppstod (tekniska eller samarbete)?
- Vilka Git-färdigheter vill ni utveckla mer?
- Hur kan ni tillämpa detta i framtida projekt?
- Task Manager fungerar enligt spec i browser
- Minst 15 meningsfulla commits i historiken
- Genomfört minst en
git revertframgångsrikt - Löst minst en merge-konflikt manuellt
- Använt interaktiv rebase för att städa historik
- Skapat och mergat Pull Request
- Taggat release (v1.0.0)
- Dokumenterat retrospektiv
- Semantiska element
- Accessibility (ARIA labels där relevant)
- Valid HTML5
- Mobile-first design
- Minst 2 breakpoints
- Konsekvent naming (BEM eller annan konvention)
- Vanilla JS (inga ramverk)
- Event listeners
- LocalStorage
- Funktionell uppdelning (modulärt)
- Meningsfulla branch-namn
- Commit-messages följer policy
- Använt: branch, merge, revert, rebase, tag
Lösning: Avbryt merge med git merge --abort och försök igen steg för steg
Lösning: Kontrollera att ni inte force-pushar till main (ska skyddas)
Lösning: Använd git reflog för att hitta och återställa
Lösning: Kontrollera att ni kör via http:// (inte file://) eller använd local server
Lycka till! Detta är en självständig övning, ni löser problem tillsammans och konsulterar dokumentation vid behov.