Hva er Git? Snapshots og din første commit
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 medgit addoggit commit, og se den medgit loganvende
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
- Gjør mappen om til et Git-repository.
- Lag filen
README.mdmed litt tekst i. - Spør Git om statusen til mappen.
- Legg README.md klar for neste commit.
- Lag en commit med en beskrivende melding.
- 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
- Endre
README.mdog lagre endringen i en ny commit. - Lag en ny fil
notes.txtog 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 sommainogHEAD. - 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 commitoggit logvirker uten nett. Bare kommandoer som snakker med et annet repository, somgit push,git fetchoggit 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
.giti mappen du står i. Filene dine blir ikke rørt. -b mainvelger navnet på den første branchen.mainer en vanlig konvensjon, ikke et krav. Uten-bbruker Git innstillingeninit.defaultBranch, og eldre oppsett girmaster.- Et nytt repository har en branch uten commits.
HEADpeker på navnetmain, menmainpeker ennå ikke på noe. Derfor feilergit logtil 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
.gitfor 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 statusforteller 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"
--globalgjelder alle repositories for brukeren din. Uten--globalgjelder 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
mainer branchen som flyttet seg.root-commitbetyr at dette er den første commiten, uten forelder.ae07153er starten på commitens ID. Din blir en annen, fordi tidspunktet og forfatteren inngår.create mode 100644betyr 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
- Hva er Git? i Pro Git-boka
- Førstegangsoppsett av Git
- git init, git commit og git config
Per-Arne's Git Good!