Gå til indholdet

Git og Github

Git og GitHub er meget brugt i moderne softwareudvikling, uanset hvilket programmeringssprog der bruges. I C#-udvikling kan de være yderst effektive til at håndtere versionskontrol, samarbejde, og kode deling.

Information til undervisere

Afhængig af kursisten formål med at lære C# kan denne sektion måske springes over. Hvis du tager det med så forbered et eksempel som kursisterne kan være i (pull, branch, push, pull request).

Git

Hvad er Git?

Git er et lokalt versionskontrolsystem, der blev designet af Linus Torvalds, skaberen af Linux. Versionskontrolsystemer tillader flere personer at arbejde på det samme projekt samtidigt. Git holder styr på ændringer i din kode over tid, så du kan gendanne tidligere versioner af din kode, hvis det er nødvendigt.

Som begynder i Git bør du kende lidt til begreber som

Begreb Forklaring
Commit En “commit” er en ændring til et projekt, der er gemt i en Git repository. Den repræsenterer et øjebliksbillede af projektet på et bestemt tidspunkt. Hver commit har en unik ID (ofte kaldet en “commit hash”), som bruges til at holde styr på ændringerne.
Pull “Pull” er en operation, der henter data fra en fjernserver. I Git-sammenhæng bruges “pull” til at hente den nyeste version af et repository fra en fjernserver og flette den med din lokale version.
Push “Push” er operationen, der sender dine lokale ændringer til fjernserveren. Hvis du har lavet nogle commits lokalt, som du vil dele med resten af dit team, vil du “pushe” dem til fjernserveren (for eksempel GitHub), så de bliver synlige for alle.
Branch En “branch” er en parallel version af et repository. Den er adskilt fra “main” linjen af udvikling og bruges til at arbejde isoleret på en feature eller en bug fix. Når arbejdet er færdigt, kan branchen flettes tilbage til main linjen.
Pull Request En “pull request” (ofte forkortet PR) er en metode til at foreslå ændringer til et projekt på GitHub. Når du åbner en pull request, foreslår du, at dine ændringer skal flettes ind i den originale repository. Pull requests gør det muligt for andre at gennemgå og diskutere dine ændringer, før de bliver integreret i projektet.
Repository (Repo) Et “repository” er et opbevaringssted for et software projekt. Det indeholder alle filer til projektet og holder styr på hver ændring lavet til disse filer.
Fork En “fork” er en kopi af et repository. At forke et repository giver dig mulighed for at eksperimentere med ændringer uden at påvirke det originale projekt.
Clone At “clone” et repository betyder at skabe en lokal kopi af et fjernrepository på din egen computer. Dette giver dig mulighed for at arbejde på projektet lokalt.
Merge At “merge” er at tage ændringer fra en branch og inkorporere dem ind i en anden branch. Dette er ofte hvordan du får dine ændringer ind i projektet efter du har arbejdet på dem i en separat branch.
Issue Et “issue” er en måde at holde styr på opgaver, forbedringer og bugs for dit projekt på GitHub. De kan være så simple som to-do lister, eller de kan være komplekse boards med labels, tildelinger og milestones.

Ressourcer om Git

GitHub’s Learning Lab er en god måde at lære Git og GitHub på. Det er en samling af kurser, der er designet til at hjælpe dig med at lære Git og GitHub ved at bruge GitHub. Du kan tage kurserne i dit eget tempo, og de er gratis at bruge.

Han viser det faktisk også meget godt:

Microsoft har også lavet en rigtig god Youtube serie omkring Git og brug i VS:

Installation af Git

For at bruge Git skal du installere det på din computer. Git er tilgængelig for Windows, Mac og Linux. Du kan downloade den seneste version af Git fra Git’s officielle hjemmeside. Det er typisk allerede installeret på en Linux og Mac maskine, ligesom en Windows maskine brugt i undervisningslokaler også vil have det installeret. Alternativt kan downloade og installere det fra her til Windows. En installation til Windows vil typisk også installere Git Bash, som er en terminal til Windows, der giver en emulering af en Bash-oplevelse i en Windows-miljø.

Første gang du benytter git

Hvis det er første gang du benytter git på en maskine skal du tilføje et user name og email. I princippet er det underordnet hvad du skriver her hvis det kun er dig der bruger det pågældende repository, men du kan angive dine personlige oplysninger hvis du vil.

  • Åbn en terminal
  • Skriv følgende kommandoer:
git config --global user.name "Dit navn"
git config --global user.email "Din email"

Hvad er GitHub?

GitHub er en webbaseret platform for versionskontrol og samarbejde, der gør det muligt for udviklere at arbejde sammen om projekter. Mens Git er et kommandolinjeværktøj, leverer GitHub et webbaseret grafisk interface. Det giver også adgang til flere samarbejdsfunktioner, såsom opgavestyring, fejlsporing og projektstyring, samt funktioner, der bygger videre på Git. GitHub er ejet af Microsoft.

Arbejdsmåder i GitHub

GitHub tilbyder flere måder at arbejde med projekter på:

  1. Eget repository: Når du opretter dit eget repository (projekt) på GitHub, har du fuld kontrol over det. Du kan tilføje filer, lave ændringer og push’e (overføre) dem direkte til hovedgrenen (eller en anden gren) i dit repository. Andre udviklere kan bidrage til dit projekt ved at oprette pull requests eller issues (fejlrapporter eller forslag).

  2. Fork og Pull Requests: Hvis du vil bidrage til et projekt, som du ikke ejer, kan du “forke” (kopiere) det. Når du har forket projektet til din egen GitHub-konto, kan du lave ændringer lokalt og derefter sende en “pull request” (PR) til det originale repository. Repository-ejeren kan herefter gennemgå dine ændringer og vælge, om de skal flettes ind i hovedprojektet. Dette er en central arbejdsgang i open source-projekter.

  3. Collaborator-modellen: I nogle projekter kan repository-ejeren give andre udviklere rettigheder til direkte at push’e ændringer til et repository. Dette er almindeligt i teams, hvor flere medlemmer arbejder sammen på lige fod uden behov for PR’er for hver eneste ændring.

Da vi i forbindelse med undervisning ofte arbejder med små projekter, vil vi ofte benytte den første model, hvor du har fuld kontrol over dit eget repository, og andre kan bidrage ved at oprette pull requests. Da undervisningen typisk foregår på en fremmed maskine, vil vi også benytte SSH-nøgler til at logge ind på GitHub. På den måde kan du arbejde med dit repository uden at risikere at efterlade login-informationer på en fremmed maskine fordi du har brugt et browser token. Det kan være noget rod at rydde op i bagefter.

Den helt simple upload til GitHub
  • Sørg for at arbejde i en mappe (eksempelvis \kursus) så alle projekter er placeret her
  • Kør eventuelt følgende powershell script for at slette alle \obj og \bin foldere som typisk ikke skal med op på GitHub
    • Get-ChildItem -Recurse -Directory | Where-Object { $_.Name -in 'bin', 'obj' } | Remove-Item -Recurse -Force
  • Opret et repository
  • Upload samtlige mappe manuelt gennem browseren

Brug et SSH token

Her er en trin-for-trin guide til at oprette et SSH token på en fremmed maskine:

Generer en ny SSH-nøgle

Åbn Git Bash og indtast følgende kommando (erstat ‘din_email@example.com’ med din egen e-mailadresse):

ssh-keygen -t ed25519 -C "din_email@example.com"

Når du bliver bedt om at “Enter a file in which to save the key,” kan du trykke Enter. Dette accepterer den standardfilplacering. Indtast derefter en sikker adgangskode, når du bliver bedt om det.

Start ssh-agent

I Git Bash, start ssh-agent i baggrunden ved at indtaste:

eval "$(ss h-agent -s)"

Tilføj SSH nøgle

Tilføj derefter din SSH private nøgle til ssh-agenten ved at indtaste:

ssh-add ~/.ssh/id_ed25519

Tilføj den nye SSH-nøgle til din GitHub-konto

Kopier indholdet af SSH-nøglen (id_ed25519.pub filen) til din udklipsholder ved at indtaste:

clip < ~/.ssh/id_ed25519.pub

Det vil kopiere indholdet af din offentlige nøgle til udklipsholderen.

Login på GitHub i din webbrowser (brug Incognito hvis du er på en ekstern maskine) og klik på Settings (under dit navn i øveste højre hjørne) -> SSH og GPG nøgler -> Ny SSH nøgle. Giv nøglen en titel og indsæt den offentlige nøgle i “Key” feltet. Tryk “Add SSH key” for at tilføje nøglen.

Nu kan du bruge SSH til at interagere med GitHub.

Opret et nyt repository på GitHub

Det nemmeeste er at oprette et repository på GitHub og derefter clone det til din lokale maskine. Her er trinene:

  • Gå til GitHub (Incognito) og log ind
  • Vælg “New repository”.
  • Giv dit repository et navn, en beskrivelse og vælg om det skal være offentligt eller privat. Du bør vælge at initialisere dit repository med en README-fil og en .gitignore-fil (vælg Visual Studio på listen).

Klon dit repository til en fremmed maskine

Når du har oprettet dit repository kan du klikke på den store grønne knap på forsiden til repositoriet. Her skal du vælge at klone via SSH og kopiere URL’en til udklipsholderen.

Åbn ny en terminal og naviger til den mappe, hvor du vil klone dit repository. Indtast følgende kommando:

git clone din_repository_ssh_url

Din Windows-maskine har nu adgang til dit private GitHub-repository, og du kan både push og pull. Husk at fjerne SSH-nøglen fra din GitHub-konto, når du er færdig med at bruge den fremmede maskine.

Adgang til enkelte repos

Hvis du vil begrænse adgangen til kun et bestemt repository, kan du overveje at bruge “Deploy keys”. En “Deploy key” er en SSH-nøgle, der er knyttet til et specifikt repository i stedet for en brugerkonto, og den har kun adgang til det repository, den er knyttet til.

Her er trinnene for at tilføje en Deploy key:

  1. Generer en ny SSH-nøgle på den fremmede maskine, som du gjorde før jvf. ovennævnte
  2. Kopier den offentlige nøgle til din udklipsholder.
  3. Gå til dit repository på GitHub.
  4. Klik på “Settings” i den øverste menu.
  5. Klik på “Deploy keys” i den venstre sidebjælke.
  6. Klik på “Add deploy key”.
  7. Giv nøglen en titel, indsæt den offentlige nøgle i “Key” feltet og tryk “Add key”.

Nu vil denne nøgle kun have adgang til det specifikke repository, den er knyttet til, og ikke alle dine repositorier. Men vær opmærksom på, at en deploy key kun kan læse data som standard. Hvis du også vil kunne skrive (push) til repository, skal du markere “Allow write access” når du tilføjer nøglen.

Info

SSH (Secure Shell) og GPG (GNU Privacy Guard) er begge kryptografiske netværksprotokoller, men de bruges til forskellige formål:

  1. SSH (Secure Shell): SSH bruges til at skabe en sikker forbindelse mellem to systemer. Dette gør det muligt at eksekvere kommandoer på en fjernserver eller overføre filer mellem to systemer over en sikret forbindelse. SSH-nøgler er ofte brugt til at autentificere brugere til servere, og kan bruges til at erstatte password-baseret autentificering. Når du tilføjer en SSH-nøgle til din GitHub-konto, kan du interagere med GitHub (clone, push, pull osv.) uden at skulle indtaste dit brugernavn og password hver gang.

  2. GPG (GNU Privacy Guard): GPG er en fri implementering af OpenPGP standarden, der bruges til at kryptere og dekryptere indhold og til at skabe digitale signaturer. GPG-nøgler kan bruges til at “signere” git commits eller tags, hvilket giver en verificerbar garanti for, at det indhold, du har sendt, faktisk kommer fra dig og ikke er blevet ændret undervejs. Når du tilføjer en GPG-nøgle til din GitHub-konto, kan dine commits have en “Verified” label på GitHub.

Så mens begge er kryptografiske protokoller, bruges SSH normalt til sikre forbindelser mellem systemer og password-fri autentificering, mens GPG typisk bruges til at kryptere/dekryptere indhold og lave digitale signaturer.