-
Git er er distribuert versjonskontrollsystem for kildekode. Istedet for en sentralisert server, så kan man ha flere repositorier, som man kan hente ned kildekoden fra. I motsetning til subversjon, som kun har en sentralisert server. Dette gjør det veldig nyttig i open source prosjekter, hvor hvem som helst kan lage sin egen fork av et prosjekt, og eieren/løytnaten kan hente de endringene de vil fra tilgjenglige fork, og merge dette inn i hovedprosjektet. Man kan fortsatt velge å kjøre med en sentralisert server struktur, slik at alle sjekker inn i samme remote server.
-
Mens andre versjonskontrollsystem, som subversjon, lagrer et sett med filer og endringer som har skjedd på disse filene, så lagrer Git fulle snapshots av alle filene, og lagrer heller en referanse av hvilke filer som blir brukt.
-
Første gang man henter ned et prosjekt så vil all historien bli lastet ned. Så ved bytting av branch, så er det kun en referansetabell som blir omskrevet. Dette gjør det veldig raskt å endre og lage nye brancher.
-
Alt i git er sjekksummet med SHA-1. Kun en fil har samme sjekksum, så blir en kopi lagret.
git clone git://github.com/stigebil/fagmote-git.git
cd fagmote-git
Alle revisjoner og endringer blir merket med ditt navn, så kjør dette for å sette det globalt
git config --global user.name "Your Name"
git config --global user.email foo@bar.com
git config --global color.ui auto
Lag en ny git alias
git config --global alias.l "log --graph --pretty=oneline --abbrev-commit --decorate"
####1. Lag en ny fil med navn 1.txt ####2. Sjekk status på filen. Filen er "untracked" git status ####3. For å legge en fil til staging så skriv: git add 1.txt ####4. Sjekk status på fil. Sammenlign med forrige staus ####5. commit git commit -m "Added 1.txt." ####6. Sjekk historien git l
Fil 1.txt er nå sjekket inn i ditt lokale repository
####7. Gjør en endring på 1.txt git diff git add 1.txt git diff git diff --staged
####8. Unstage 1.txt. git reset 1.txt git status
####9. Sjekk inn fil igjen, men kjør nå følgende kommando git commit -am "Updated 1.txt"
Når man kjører git commit -a så automatisk stager man alle filer som er tracket av git, som det har skjedd en endring på
####8. Gjør en ny endring på 1.txt, og rull tilbake endringene git diff git checkout 1.txt git diff
####9. Slett filen fra git rm 1.txt git rm 1.txt git commmit -m"Deleting 1.txt"
Det er kjapt å lage nye brancher i git. master tilsvarer trunk i subversion. Siden det er såpass lett og kjapt å lage branchers, så anbefales det å lage topic brancher fot hver enkelt ny feature, og så merge inn i utviklingsbranchen. Slik kan man enkelt jobbe med flere ting samtidig.
git branch
git checkout -b ny-branch
git branch -v
git checkout -b er det samme som å kjøre:
git branch ny-branch
git checkout ny-branch
git branch -d ny-branch
git merge ny-branch
git l
git status
For å se orginal fil.
git show :1:nyfil.txt
For å se master sin versjon
git show :2:nyfil.txt
For å se ny-branch sin versjon
git show :3:nyfil.txt
git add nyfil.txt
git commit -m "Merged"
git l
git branch -d ny-branch
git branch -v
git commit -am "Updated nyfil.txt with fail"
git l
sha-a "Updated nyfil.txt with fail"
git commit -a --amend
git l
Legg merke til at sjekksummen er anderledes, men commit-beskrivelsen er anderledes sha-a' "Updated nyfil.txt with fail"
echo "foo" >> nyfil.txt
git commit -am "Added foo"
echo "bar" >> nyfil2.txt
git commit -am "Added bar"
git l
git rebase -i HEAD~2
Nå kan man endre rekkefølgen på de 2 siste commitene. Den elste er først
pick sha-a "Added foo" pick sha-b "Added bar"
Bytt rekkefølge på teksten slit at det står slik
pick sha-b "Added bar" pick sha-a "Added foo"
Save/quit
git l
git reflog
Denne viser hva "HEAD" var X commits siden Finn 'commit (amend): Updated nyfil.txt'
//Kjør denne hvor X er nummeret som stod siden commit (ammend)
git reset --hard HEAD@{X}
Stashing gjør det mulig å lagre unna arbeid som ikke er klar til å sjekkes inn. Slik at man kan jobbe på noe annet.
git status
git stash save "Work in progress"
git status
git stash apply
Hver gang vi har gjort en merge nå, så har vi lagd en fork i history. Med rebase, så kan man merge sammen kode, uten at det lages en fork i historien. Rebase "replays commits" over din egen kode, slik at man får en lineær historie.
Generel regel er at du ikke skal kjøre rebase for kode som er lastet opp til et public repository, siden det kan skape problemer for de andre på prosjektet.
git checkout -b working
echo "rebasing1" >> nyfil.txt
git commit -am "Rebasing"
git checkout master
echo "rebasing2" >> nyfil2.txt
git commit -am "Rebasing master"
git checkout working
git l working master
git rebase master
git l working master
http://git-scm.com/book/en/Git-Branching-Rebasing
Så langt har man kun sjekket inn kode til ditt lokale repository. Noen kommandoer du bruker når du jobber mot remote er push, clone, fetch og pull. En kort oversikt over kommandoene.
Clone lager en kopi av hele prosjektet, inkludert brancher.
Lister opp url på remote branch.
Pusher alle commits til remote reopsitories
Henter ned endring fra kilden for en ønsket branch. Dette gjør først git fetch for å hente koden ned fra remote og så en git merge inn i aktiv branch. For å kjøre denne så må all koden din være sjekket inn. Alternativt kan man dumpe den til stash og så kjøre git stash apply.
Denne kommandoen henter ned koden fra remote server. Man gjør selv en merge(e.eks git merge origin master) på koden hentet ned til branchen din.
Mange anbefaler å gjøre en git fetch og en git merge istedet for git pull, for å ha bedre kontroll over hva som skjer.