Meny for Per-Arne's Git Good!
Fag og prosjekt Per-Arne's Git Good!

Hva er Git? Snapshots og din første commit

Modul 1: Grunnmuren · 10 min

Den interaktive leksjonen trenger JavaScript. Teksten under er hele leksjonen.

Etter leksjonen kan du

  • forklare hva en commit er, og hvordan foreldrepekere binder commits sammen til historikk forstå
  • gjøre en mappe om til et repository med git init, lage en commit med git add og git commit, og se den med git log anvende

Forstå: Et prosjekt med hukommelse

Har du noen gang hatt filer som heter rapport-final, rapport-final-2 og rapport-final-ekte? Git løser det problemet. Git husker hvordan prosjektet så ut på bestemte tidspunkter, slik at du trygt kan gå tilbake, sammenligne og samarbeide.

Hvert slikt tidspunkt kalles en commit. En commit er et fullstendig snapshot av alle filene Git sporer, ikke bare det som ble endret. Den har også en melding, en forfatter og et tidspunkt.

Når du committer igjen, får den nye commiten en peker til forelderen sin. Slik blir historikken en kjede av snapshots.

Legg merke til retningen: pilene peker bakover i tid. En commit kjenner foreldrene sine, men aldri barna, for de fantes ikke da den ble laget.

Navnet main er en branch: en lapp som peker på den siste commiten på denne arbeidslinjen og flytter seg når du committer på den.

Hele historikken ligger i en skjult mappe, .git, inne i prosjektet. Prosjektmappen med denne historikken kalles et repository. Git trenger verken internett eller GitHub for å fungere.

Se demo: Ditt første repository

Vi står i en tom mappe. git init gjør mappen om til et repository. Grafen er fortsatt tom: ingen commits ennå.

$ git init

Nå lager vi en fil. Den dukker opp i arbeidsmappen, altså filene du ser og redigerer.

$ echo "Hello, Git!" > README.md

Før vi går videre: hva tror du git status sier om filen?

$ git status

git add legger en kopi av akkurat denne versjonen i staging-området, også kalt index: utkastet til neste commit. Se at kortet nå også står i staging-området. Filen blir med i neste snapshot.

$ git add README.md

Nå tar vi snapshotet. Meldingen sier kort hva commiten gjør. Se: en commit dukker opp i grafen, og main peker på den.

$ git commit -m "Add welcome text"

Til slutt leser vi historikken. Den korte koden er starten på commitens ID. Git regner den ut fra hele commiten: innhold, forelder, melding, forfatter og tidspunkt. Derfor er den i praksis unik.

$ git log --oneline

Oppgaver

  1. Gjør mappen om til et Git-repository.
  2. Lag filen README.md med litt tekst i.
  3. Spør Git om statusen til mappen.
  4. Legg README.md klar for neste commit.
  5. Lag en commit med en beskrivende melding.
  6. Vis historikken med én linje per commit.

Øv: Overfør: to commits til

Nytt repository med én commit. Ingen demo denne gangen — bruk det du nettopp så.

Oppgaver

  1. Endre README.md og lagre endringen i en ny commit.
  2. Lag en ny fil notes.txt og commit den i en egen commit.

Sjekk deg selv: Hent det fram igjen

Hva lagrer en commit?

  • Bare linjene som ble endret siden forrige commit
  • Et snapshot av de sporede filene, pluss melding, forfatter og forelder
  • En lenke til filene i mappen, så senere redigeringer blir med automatisk

Hvor lagrer Git commitene du lager i et repository?

  • På GitHub
  • I .git-mappen inne i prosjektet
  • I én felles Git-database for hele datamaskinen

Hvorfor peker pilene fra en ny commit til forelderen, og ikke omvendt?

  • En commit kan ikke endres etter at den er laget, og barna fantes ikke da den ble laget
  • Det er bare en tegnekonvensjon
  • Fordi Git leser historikken fra den eldste commiten og framover

Vanlige misforståelser

  • «Git og GitHub er det samme.» Git er programmet som lagrer historikken lokalt. GitHub er én av flere tjenester som kan oppbevare en kopi.
  • «En commit lagrer bare endringene.» Den peker på et fullstendig snapshot; endringer beregnes når du ber om dem.

Les mer

Git, repository og hosting

  • Git er et program på din egen maskin. Det lagrer historikken til et prosjekt som en kjede av commits.
  • Et repository er prosjektmappen pluss den skjulte mappen .git, der Git lagrer objekter (filinnhold, snapshots, commits) og pekere som main og HEAD.
  • GitHub, GitLab og Codeberg er hostingtjenester. De oppbevarer en kopi av repositoryet og legger til ting Git selv ikke har: pull requests, issues, tilgangsstyring og nettsider. En pull request er en funksjon i tjenesten, ikke i Git.
  • Alt du gjør i denne leksjonen er lokalt. git init, git add, git commit og git log virker uten nett. Bare kommandoer som snakker med et annet repository, som git push, git fetch og git clone, overfører objekter og flytter pekere et annet sted.

Hva git init gjør

$ git init -b main
Initialized empty Git repository in /home/student/project/.git/
  • Kommandoen lager .git i mappen du står i. Filene dine blir ikke rørt.
  • -b main velger navnet på den første branchen. main er en vanlig konvensjon, ikke et krav. Uten -b bruker Git innstillingen init.defaultBranch, og eldre oppsett gir master.
  • Et nytt repository har en branch uten commits. HEAD peker på navnet main, men main peker ennå ikke på noe. Derfor feiler git log til du har laget den første commiten:
$ git log
fatal: your current branch 'main' does not have any commits yet
  • Ikke rediger filer inne i .git for hånd. Sletter du .git, er hele historikken borte, mens filene i mappen blir liggende.

Pass på hvor du kjører git init. Kjører du den i hjemmemappen ved et uhell, blir alt under den ett stort repository. git status forteller alltid om du står i et repository eller ikke.

Hvem står som forfatter?

Hver commit lagrer navn og e-post. Git leser dem fra innstillingene. Mangler de, prøver Git å gjette ut fra brukernavnet og maskinnavnet ditt, og nekter å committe hvis det ikke går:

$ git commit -m "Add welcome text"
Author identity unknown
*** Please tell me who you are.
Run
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.

Et gjettet navn blir sjelden riktig, så sett begge selv før første commit:

git config --global user.name "Kari Nordmann"
git config --global user.email "kari@example.com"
  • --global gjelder alle repositories for brukeren din. Uten --global gjelder innstillingen bare repositoryet du står i.
  • Navn og e-post er bare tekst i commiten. Det er ikke innlogging. Når du senere skal pushe til en server, logger du inn med en SSH-nøkkel eller et token via en credential helper.

Fra fil til commit, med ekte utskrift

En ny fil er usporet til du har kjørt git add på den:

$ echo "Hello, Git!" > README.md
$ git status
On branch main
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
    README.md
nothing added to commit but untracked files present (use "git add" to track)

Etter git add står filen under «Changes to be committed»:

$ git add README.md
$ git status
On branch main
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   README.md

Selve commiten svarer med en kort kvittering:

$ git commit -m "Add welcome text"
[main (root-commit) ae07153] Add welcome text
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
  • main er branchen som flyttet seg. root-commit betyr at dette er den første commiten, uten forelder.
  • ae07153 er starten på commitens ID. Din blir en annen, fordi tidspunktet og forfatteren inngår.
  • create mode 100644 betyr at filen er ny og en vanlig fil som ikke er kjørbar.

git log uten valg viser hele ID-en, forfatter, dato og melding:

$ git log
commit ae07153176166626ac1264449d3bf293f131d342
Author: Student <student@example.invalid>
Date:   Tue Oct 13 09:10:27 2026 +0200
    Add welcome text

I en vanlig terminal åpner git log en pager når utskriften er lang. Trykk q for å avslutte.

Snapshots, ikke endringslister

  • En commit peker på et fullstendig snapshot av alle sporede filer, pluss melding, forfatter, tidspunkt og ID-en til forelderen.
  • Filer som ikke er endret, lagres ikke på nytt. Det nye snapshotet peker på det samme innholdet som før. Leksjonen om historikk viser dette med ekte objekter.
  • Differ lagres ikke. Når du ber om en diff, regner Git den ut ved å sammenligne to snapshots. For å spare plass pakker Git etter hvert like objekter sammen i såkalte packfiles, der noen lagres som forskjeller mot andre. Det er en lagringsdetalj du aldri ser. Modellen du jobber med, er fortsatt hele snapshots.
  • ID-en er en hash på førti tegn som regnes ut fra hele commiten. Repositories som bruker det nyere SHA-256-formatet, har ID-er på 64 tegn. Endrer du innhold, melding eller forelder, får du en ny ID. Derfor kan en commit ikke endres i ettertid. Kommandoer som «endrer historikk» lager egentlig nye commits.

Vanlige meldinger og hva de betyr

Melding Betyr Gjør dette
fatal: not a git repository (or any of the parent directories): .git Du står ikke i et repository Gå til prosjektmappen, eller kjør git init
nothing added to commit but untracked files present Ingenting er staget Kjør git add på filene som skal med
nothing to commit, working tree clean Ingen endringer i sporede filer venter på commit Ingenting, alle endringer er committet
Author identity unknown Navn eller e-post mangler Sett user.name og user.email med git config
does not have any commits yet Du kjørte git log før første commit Lag en commit først

Les videre