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

Hvorfor Git? Git, GitHub og distribuert versjonskontroll

Modul 1: Grunnmuren · 10 min

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

Etter leksjonen kan du

  • forklare forskjellen på Git, programmet som lager og lagrer historikken, og vertstjenester som GitHub, GitLab og Bitbucket forstå
  • sammenligne fildeling som Dropbox, sentralisert versjonskontroll som SVN og distribuert versjonskontroll som Git ut fra hvor historikken ligger og hva som overlever når serveren forsvinner analysere
  • gjenopprette et prosjekt på en ny server fra en klon etter at den gamle serveren er borte anvende

Forstå: Hvor ligger historikken?

Et prosjekt endrer seg hver dag, og som regel er flere med. Da trenger dere svar på tre spørsmål: Hvordan så det ut før? Hvem endret hva, og hvorfor? Og hvordan slår vi sammen arbeid som skjedde samtidig? Det er dette versjonskontroll svarer på. Det avgjørende er hvor historikken ligger.

Dropbox, OneDrive og Google Drive synkroniserer filer. Alle får den nyeste versjonen av hver fil, og tjenesten tar vare på eldre versjoner av hver fil en periode. Men det finnes ingen historikk over prosjektet som helhet, og ingen melding om hvorfor noe ble endret. Lagrer to personer samme fil samtidig, får du en konfliktkopi i stedet for en sammenslåing.

Sentralisert versjonskontroll, som Subversion, ofte kalt SVN, har en ekte historikk med commits og meldinger. Men historikken ligger bare på serveren. Du har en arbeidskopi av filene, og hver commit går rett til serveren. Uten nett kan du verken committe eller lese historikken.

Git er distribuert. En klon er ikke bare filene. Den er hele repositoryet, med alle commits og hele historikken. Du committer lokalt, også uten nett, og deler med push og pull. Serveren er bare én kopi til, og to kloner kan til og med hente direkte fra hverandre.

Tenk deg at serveren forsvinner uten sikkerhetskopi. Med Dropbox har alle fortsatt den nyeste versjonen av filene, men de eldre versjonene lå hos tjenesten. Med SVN overlever bare arbeidskopiene, og historikken er borte. Med Git har hver klon hele historikken, så teamet pusher den til en ny server og fortsetter. Prøv selv med knappene under figuren.

Git er programmet på maskinen din. Det virker uten nett og uten konto. GitHub er en tjeneste som lagrer Git-repositories og legger samarbeid oppå: pull requests, issues og automatiske tester. GitLab, Bitbucket og Codeberg gjør det samme, og GitLab kan dere også drive på egen server. For Git er hver av dem bare en remote: et annet repository på en adresse. Pull requests og issues ligger hos tjenesten, ikke i Git.

Se demo: Serveren forsvinner

Dette er klonen din av et lite teamprosjekt. Grafen viser main hos deg, hos Ada og i origin, den delte serveren. Loggen viser alle tre commitene, ikke bare de nyeste filene.

$ git log --oneline

Nå later vi som om serveren forsvinner. Vi sletter det delte repositoryet, slik en tjeneste som legges ned eller en disk som ryker ville gjort. Se at main i origin forsvinner fra grafen.

$ rm -rf /course/origin.git

Å hente fra serveren går ikke lenger. Git finner ikke repositoryet på adressen. Din origin/main står likevel igjen: den er ditt eget notat om hvor serveren var sist.

$ git fetch

Hva med Ada? Hun klonet det samme repositoryet. Vi ser i klonen hennes.

$ git log --oneline

Du kan også fortsette å jobbe. En commit lagres i ditt eget repository og trenger ingen server. Nå har du fire commits.

$ printf 'Offline notes\n' >> plan.md && git commit -qam 'Work offline'

Teamet lager et nytt, tomt repository på en ny server. Her er det en mappe, men det kunne vært GitLab, Codeberg eller en ny konto på GitHub.

$ git init -q --bare /course/backup.git

origin er bare et navn på en adresse. Vi peker navnet til den nye serveren. Ingenting blir sendt ennå.

$ git remote set-url origin /course/backup.git

Én push, og main er tilbake på en server med hele historikken sin: alle fire commitene, også de tre som ble laget før serveren forsvant. Andre brancher og tagger sender du på samme måte, med git push --all og git push --tags.

$ git push -u origin main

Oppgaver

  1. Vis historikken i klonen din, én linje per commit.
  2. Pek origin til det nye repositoryet /course/backup.git.
  3. Gjenopprett hele historikken på den nye serveren, og la main følge den.

Øv: Overfør: hent direkte fra en kollega

Serveren er borte igjen, og denne gangen har Ada en commit hun ikke rakk å pushe. Hennes klon i /course/ada er et fullstendig repository, så den kan være en remote for deg.

Oppgaver

  1. Få Adas nye commit inn i din main uten noen server.

Sjekk deg selv: Sjekk deg selv

Hva er forskjellen på Git og GitHub?

  • Git er programmet som lager og lagrer historikken. GitHub er en tjeneste som lagrer kopier av repositories og legger samarbeid oppå.
  • GitHub er den nyere versjonen av Git.
  • Git er kommandolinjen, og GitHub er det grafiske programmet for Git.

Team A bruker SVN, og serveren mister disken uten sikkerhetskopi. Team B bruker Git, og repositoryet på GitHub blir slettet. Hva har hvert team igjen?

  • Begge har bare filene i arbeidskopiene sine.
  • Team A har bare arbeidskopiene. Team B har hele historikken i hver klon.
  • Begge har hele historikken, fordi alle versjonskontrollsystemer kopierer den til hver maskin.

Du og en medstudent redigerer rapport.docx i en delt Dropbox-mappe på samme tid. Hva skjer?

  • Dropbox fletter endringene sammen, slik som en merge i Git.
  • Én av dere får en konfliktkopi, og dere må slå sammen endringene for hånd.
  • Den som lagrer sist får en feilmelding, og endringen forkastes.

GitHub er nede en hel dag. Hva kan du fortsatt gjøre i klonen din?

  • Ingenting, fordi Git krever innlogging hos GitHub.
  • Lese historikken, lage brancher og committe. Push og pull må vente, eller gå til en annen remote.
  • Lese filene, men ikke committe før GitHub er tilbake.

Teamet flytter fra GitHub til GitLab ved å pushe klonene sine dit. Hva følger ikke med?

  • Commits på main
  • Taggene
  • Issues og diskusjonene i pull requestene

Vanlige misforståelser

  • «Git og GitHub er det samme.» Git er et program som kjører på maskinen din, uten nett og uten konto. GitHub er én av flere tjenester som lagrer Git-repositories og legger samarbeid oppå.
  • «Historikken ligger på GitHub.» Hver klon har hele historikken. GitHub har én kopi til. Det som bare finnes hos tjenesten, er issues, pull requests og diskusjonene der.
  • «Dropbox er også versjonskontroll.» Dropbox synkroniserer filer og kan hente fram eldre versjoner av én fil en periode, men lagrer ingen øyeblikksbilder av hele prosjektet med en melding om hvorfor, og samtidige endringer blir konfliktkopier i stedet for en merge.

Les mer

Versjonskontroll

Versjonskontroll er et system som husker hvordan et sett med filer så ut over tid, slik at du kan gå tilbake, se hvem som endret hva og hvorfor, og slå sammen arbeid som skjedde parallelt. Forskjellen mellom systemene ligger i hvor historikken lagres og hva den består av.

Egenskap Fildeling (Dropbox, OneDrive, Google Drive) Sentralisert (Subversion/SVN, Perforce) Distribuert (Git, Mercurial)
Hva lagres Nyeste versjon av hver fil, eldre versjoner per fil en periode Commits av hele prosjektet med melding og forfatter Commits av hele prosjektet med melding og forfatter
Hvor ligger historikken Hos tjenesten På serveren I hver klon
Uten nett Du redigerer filene; synkronisering venter Du redigerer filene, men kan ikke committe eller lese loggen Alt unntatt fetch, pull og push
Samtidige endringer Konfliktkopi som du slår sammen for hånd Serveren krever at du oppdaterer og fletter før commit Merge eller rebase av hele brancher
Serveren forsvinner Filene overlever, versjonene kan være borte Bare arbeidskopiene overlever Hver klon har hele historikken

Fildeling er utmerket for dokumenter som én person eier om gangen. Det er ikke versjonskontroll: en versjon av én fil sier ikke hvordan resten av prosjektet så ut samtidig, og den sier ikke hvorfor den ble endret.

Hvorfor Git er distribuert

Git ble laget av Linus Torvalds i 2005 for å utvikle Linux-kjernen, med tusenvis av utviklere og ingen sentral server alle måtte vente på. En git clone kopierer derfor hele repositoryet: alle commits, brancher og tagger. Konsekvensene merker du hver dag:

  • Raskt: log, diff, blame, branch og commit leser fra din egen disk.
  • Offline: du kan committe på toget og pushe når du er på nett igjen.
  • Robust: hver klon er en fullstendig kopi. Forsvinner serveren, pusher dere en klon til en ny server.
  • Trygt å eksperimentere: en branch er gratis, og ingenting deles før du pusher.
  • Integritet: hver commit har en ID som beregnes fra innholdet, så endret eller ødelagt historikk blir oppdaget.

Distribuert betyr ikke at det ikke finnes en server. De fleste team avtaler at ett repository, for eksempel på GitHub, er det felles. Det er en avtale, ikke en teknisk forskjell: Git ser alle repositories som likeverdige.

Git, GitHub og de andre

Navn Hva det er
Git Fri programvare som kjører på maskinen din. Lager commits, brancher og merger.
GitHub Vertstjeneste for Git-repositories, eid av Microsoft. Pull requests, issues, GitHub Actions.
GitLab Vertstjeneste med merge requests, issues og CI. Kan også drives på egen server.
Bitbucket Atlassians vertstjeneste, tett koblet til Jira.
Codeberg, Gitea, Forgejo Fri programvare og ideelle tjenester for Git-hosting.
Azure DevOps Microsofts plattform for bedrifter, med Git-repositories.

Alt som ligger i repositoryet, kan flyttes til en annen tjeneste: git clone henter alle brancher og tagger, og git push --all og git push --tags sender dem videre. En vanlig git push sender bare branchen du står på. Det tjenesten legger oppå, som pull requests, issues, kommentarer, wiki og CI-oppsett i tjenestens database, ligger bare hos tjenesten. Tjenestene har egne verktøy for å flytte slikt.

Remote: et annet repository

For Git er GitHub bare en remote: et annet repository på en adresse, med et kort navn som origin. Adressen kan være https://github.com/…, en SSH-adresse eller en mappe på samme disk, slik som /course/origin.git i dette kurset. Derfor kan du like gjerne hente fra en kollegas klon som fra GitHub. Leksjonen Remotes og clone går i dybden.

Når Git ikke passer

Git er laget for tekst. Det lagrer gjerne bilder og PDF-er, men kan ikke flette dem, og store binærfiler gjør repositoryet tungt for alle som kloner. Bruk Git LFS for store filer, og fildeling for dokumenter som ikke trenger historikk. Git er heller ikke en sikkerhetskopi av maskinen din: bare det du committer og pusher, finnes andre steder.

Installere Git

I kurset kjører ekte Git i nettleseren, så du trenger ikke installere noe. Når du skal bruke Git i egne prosjekter, følger du siden Installer Git.

Offisiell dokumentasjon