= SCM - Source Code Management :customcss: slides.css :icons: font == Kildekodehåndtering * lagring av kode * sporing av endringer * versionering * distribusjon [.grid-left-right-50-50] == `git` [.smaller-60] [.area-left] * sporing og deling av kodeendringer i såkalte _repo_ (repository) * både sentrale og lokale repo har all endringshistorikk * initiell kopi hentes ved å _kloning_ (clone) * endringer (i filer) registreres i _commits_ * commits deles med andre ved å _dytte_ (push) til en server * andre kan da _dra_ (pull) endringene inn i lokalt repo [.area-right] image::../images/git-local-remote-repo.png[] [.grid-left-right-50-50] == 4 repo-"kopier" [.smaller-60] [.area-left] * originalen (_origin_), hentet fra server (`pull`) * arbeidsområdet (_working directory_), lokale filer som kan være endret * indeksen (_staging area_ eller _index_), endringer du har lagt til med (`add`) * lokalt repo, endringene du har commitet (`commit`) [.area-right] image::../images/git-repo-copies.png[] == repo-kommandoer image::../images/git-repo-copies.png[width="400px"] image::../images/git-repo-commands.png[width="500px"] == Typisk sekvens [.smaller-80] * `git pull` (eller `clone` første gang) - henter ned endringer fra serveren * gjør egne endringer * `git status` - viser hva som er endret * `git add <fil eller mappe>` - legger endringer til fremtidig commit * `git commit -m <melding, m/oppgavenummer>` - registrerer all endringene (lagt til med `add`) * `git pull` - henter andres endringer, i tilfelle konflikt * `git push` - deler endringer med andre via serveren == Forgreining (branching) [.smaller-60] [.left-70] * greiner (branches) ** sporer egne utviklingstråder ** gjør jobbing i parallell ryddigere * sammenslåing (merging) ** en (hoved)grein slås gjerne sammen med en annen, når den andre er ferdig (nok) ** etter sammenslåing, så deles gjerne resultatet med andre ** andre henter så ned for å være oppdatert [.right] image::../images/git-branching.png[width="200px"] == Sekvens m/forgreining [.smaller-80] * `git pull` - henter ned endringer fra serveren * `git checkout -b <navn på (ny) grein>` - lager ny grein, med utgangspunkt i den du jobber med * gjør egne endringer * `git add ...` og `git commit ...` - registrerer all endringene * `git checkout master` - bytter til hovedgrein * `git merge <navn på grein>` - slår annen grein (den nye) sammen med denne (hovedgreina) * ... == Eclipse-støtte for git [.smaller-60] * Egne Eclipse-tillegg - JGit (git-impl) og EGit (UI) * Git Repositories-panel - oversikt over repo ** klone repo fra server eller registrere lokalt repo ** utføre `pull` og `push` ** utføre `checkout` inkl. lage ny grein ** ... image::../images/git-repositories-view.png[height="200px"] == Eclipse-støtte forts. [.smaller-60] * Git Staging - statusoversikt ** filer i arbeidsområdet som er endret ** filene i indeksen ** legge til (`add`) eller fjerne (`remove`) fra indeksen image::../images/git-staging-view.png[width="800px"] == Endringsforespørsler [.smaller-60] * en `pull`/`merge`-forespørsel (request) brukes for mer formell godkjenning av endringer ** Pull Request er github-termen, mens Merge Request brukes i gitlab * brukes ofte for å inkludere endringer utenfra, f.eks. ** utviklere utenfor kjerne-teamet ** brukere av åpen kildekode som har fikset feil * forenkler administrasjon av åpne prosjekter == PR/MR-prosedyre [.smaller-60] * (utenforstående oppretter kopi på egen server) * lager en grein for endringene og utfører dem lokalt * i stedet for å slå sammen med egen hovedgrein ** `push` grein til egen server ** lag en `pull`/`merge`-forespørsel (PR/MR), som (potensielt) kan inkluderes i hovedgreina ** UI for dette finnes på github/i gitlab ** forespørselen får en egen dialog/diskusjonstråd ** en utvikler med rettigheter kan så godkjenne evt. avslå forespørsel