Git

Git er et annerledes revisjonskontrollsystem. Det er svært lett å gjøre feil når man bruker Git, spesielt om du har brukt CVS, SVN eller lignende tidligere. Git er raskt i forhold til Bazaar (citation needed, du finner det fort ut når du har brukt Git en stund), og når man blir vant med systemet er det veldig behagelig å bruke. Denne guiden er ment for å lære deg å bruke Git, samt hjelpe deg med å unngå de fellene jeg har gått i, opptil flere ganger :)

Jeg er langt fra ekspert i Git, det er fare for at det er feil i guiden og den er ikke i nærheten av å være komplett. Hvis du kan rette feil eller tilføye nyttig informasjon så gjør for all del det.

Det finnes forøvrig en helt ok torturial her: http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html

For informasjon hosting av repoer, se Git-repo.

De enkle tingene

Legge til "filer"

Git bryr seg om innhold og ikke filer. Konseptet er litt vanskelig når man er vant til RCS som legger til filer og kataloger. I Git legger man til innhold, ikke filer og kataloger og av den grunn kan man ikke legge til tomme kataloger. Påfølgende kommando er vanskelig å forklare på en enkel måte, men den vil trolig gjøre det du vil om du vil legge til en ny fil i repositoriet:

git add [fil eller katalog] ...

Sjekke inn endringer

Det er flere måter å sjekke inn endringer på, men jeg holder meg til de 3 enkleste her.

Metode 1
Dersom du er vant med SVN, CVS, osv er dette en enkel måte å sjekke inn alle endringer du har gjort siden sist. Har du lagt til nye filer må de addes først som beskrevet over.

git commit -a

Metode 2
Du kan også sjekke inn enkeltfiler eller kataloger. Bare fjern "-a" og skriv inn filnavn eller katalognavn:

git commit [fil eller katalog] ...

Metode 3
Som jeg har forsøkt å forklare så bry Git seg om innhold og ikke filer/kataloger. Det kommer kanskje ikke så klart frem siden jeg sier at du "legger til" filer, men det du faktisk gjør er at du legger til innhold. I den tredje måten bruker man "add" for å legge til innhold. Jeg har aldri forsøkt dette, men jeg tror man kan endre en fil, kjøre "git add <fil>", endre filen litt til og så kjøre "git commit" og man vil bare sjekke inn endringene gjort til du skrev "git add <fil>". Jeg har aldri hatt behovet for dette selv. Den siste måten jeg vil forklare på å sjekke inn endriger er slik:

git add <fil eller katalog>

git commit

Sjekke ut kode

git clone <path>

Slette endringer gjort siden forrige commit

Her finnes en av de vanligste feilene noen som er nye i Git gjør. Du må ikke bruke git revert, den gjør noe helt annet enn det du trolig vil. Derimot er du interessert i denne kommandoen:

git checkout -f [fil eller katalog] ...

Dytte dine endringer til et felles repository

Mest sannsynlig vil du ha clonet fra et felles repository, derfor trenger du bare å kjøre denne kommandoen når du vil dytte dine endringer til et felles repository:

git push

Hente endringer fra et felles repository

Antar fortsatt at du clonet fra et felles repository:

git pull

Dette er ekvivalent med git fetch fulgt av git merge. git fetch henter objekter og refs fra en remote, og merge merger inn endringer fra den relevante remote branchen. Om du ikke vil ha en merge-commit, kan du bruke git rebase istedenfor, som "spiller av" dine commits etter de du har hentet fra remoten. For å gjøre dette, bruk git pull --rebase.

De vanskelige tingene

Remotes

Remotes er andre repositorier. Man kan legge til et annet repository som en remote med kommandoen git remote add navn url, hvor navn er navnet du senere bruker til å referere til remoten. "origin" er en halvspesiell remote som blir automatisk opprettet når du kloner ut et repository, men du kan fint slette og legge til en annen origin. Sletting av remotes gjør man med git remote rm navn, hvor navn igjen er remoten du vil fjerne. Som tidligere forklart, git pull gjør først en git fetch og så en git merge FETCH_HEAD. Om man ikke oppgir noe annet, vil git fetch hente endringer fra origin, fra den remote branchen som er satt med git branch --track eller git branch --set-upstream. Du kan også hente inn commits fra arbitrære repositories med git pull remote branch, hvor remote er en URL til et annet repository, og branch er branchen i remoten du vil hente ting fra. branch er valgfri.

tl;dr:

Legge til remote:

git remote add navn url

Fjerne remote:

git remote rm navn

Hente inn ting:

git pull remote branch

Branches

Branches lar deg ha forskjellige utgaver av treet, for eksempel kan man ha egne feature branches for å utvikle en spesifikk feature, hvor man kan jobbe uforstyrret. Det er kjekt om man jobber på noe over lang tid som ikke nødvendigvis kan merges med resten av koden. Man lager en branch med git checkout -b branchnavn. Branchen vil da inneholde det samme som branchen du kom fra (f. eks. master-branchen). master er default-branchen. Man lister branches med å kjøre git branch -a, den lister både lokale branches og branches i remotene som er tilgjengelig. For å bytte til en annen eksisterende branch, bruk git checkout branchnavn. Git gjør også litt magi for å automatisk tracke remote branches, dvs. branches i remotes, evt. kan du sette dette manuelt med overnevnte git branch --track.

tl;dr

Opprette en ny branch:

git checkout -b branchnavn

Liste branches:

git branch -a

Bytte branch:

git checkout branchnavn

Legge til en remote branch som trackes:

git branch --track

Referanser

refs eller references i git er en måte å navngi commits o. l. så du skal slippe å gå rundt og huske SHA-hasher. Vanlige referanser HEAD, som til enhver tid vil peke på siste commit i repositoriet, og tags. Det er vanlig å ha navngitte tags for f. eks. releaser, så man enkelt kan gå tilbake til en gitt release. Du kan bruke git tag for å liste tags, eller søke med git tag -l foo*, som vil søke etter tags som starter med foo. Man oppretter tags med å bruke git tag -a tagnavn -m 'Melding'. Dette vil da opprette en tag med navnet "tagnavn" og lagre en melding med innholdet "Melding" sammen med taggen.

tl;dr

Liste tags:

git tag

Søke etter tags:

git tag -l foo*

Opprette tag

git tag -a tagnavn -m 'Melding'

detached head

http://sitaramc.github.com/concepts/detached-head.html

Lenker: Start, ari, billig, hvordan utvikle, dhcp, dyrt, git-repo, isfit-wlan, itkaclprogrammering, medlemsdb2, hvordan utvikle, puppet, ufs, uka-no, hvordan utvikle

Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2013-01-14 17:08 | Revisjon: 7 (historie, blame) | Totalt: 1886 kB | Rediger