2. I denne presentasjonen
● Hvorfor versjonskontroll?
● Et historisk perspektiv
● Viktige konsepter
● Git i daglig bruk
● Snedige 3. parts-tillegg
3. Hvorfor versjonskontroll?
● Forutsetting for samarbeid
● Men også alene
● Undo for kodebasen din
– cp Codebase Codebase.goodCopy
– cp Codebase Codebase.reallyGoodCopy
● Forutsetning for kontroll
● Utvikle fere funksjoner parallelt (Grener)
4. Et historisk perspektiv
● ~1960 CDC Update IBM IEB_Update, første
SCM verktøyene (Kort-baserte)
● 1972 Bell Labs fnner opp diff algoritmen
● RCS (Sent på 1970-tallet
– Revision Control System
– Låser alle fler
– Skalerer dårlig med fere utviklere.
– Fortsatt nyttig for å jobbe med binærobjekter
5. Et historisk perspektiv
● Patch 1985
● CVS (1986)
– Concurrent Versison System
– Lar fere redigere samme fl
– Defakto verktøy i UNIX miljøet 1990-tallet
6. Et historisk perspektiv
● SVN
● Annonsert in 2000 som en erstatning for
CVS
– Atomiske commit
– Lagrer fytting og kopiering av fler. Sporer hele
endringer samlet, heller enn enkelt-fler.
– Støtter Webdav-basert protokoll
– SVK er et påbygg som gir distribuert støtte for
SVN
7. Et historisk perspektiv
● Tidlig på 2000 tallet, første distribuerte
systemer som GNU arch og BitKeeper
● 2005 – Linus thorvalds starter Git
prosjektet etter kontrovers rundt
Bitkeeper-lisensiering.
● Ps: det fnnes fere systemer som
Perforce, Rational og Microsoft Source
Safe som ikke ble nevnt i denne
historikken.
8. Git er:
● Distribuert
● Kjapt og skalerbart til store kodebaser
● Open Source (GPL V2)
● Basert på å lagre snapshots, ikke diffs
● Tilgjengelig i de feste unix distribusjoner.
● Tilgjengelig som installasjonspakker for
Windows og OSX.
9. Git er ikke:
● SVN
– Git er ikke det neste logiske steget på stigen
fra RCS -> CVS -> SVN
● Kjempe-enkelt
– «With great power comes great reponsibility»
– Git kan være litt frusterende i starten.
10. Viktige konsepter
● Sentralisert vs Desentralisert
● .git - flstruktur
● Objektdatabase
● «Plumbing» og «Porclain»
14. .git
● En katalog i roten av hvert prosjekt:
|-- HEAD # peker til aktiv gren
|-- config # instillinger for dette prosjektet
|-- description # beskrivelse av prosjektet
|-- hooks/ # automatiske handlinger
|-- index # index file ( Hva er planlagt til neste
commit)?
|-- logs/ # Historikk over grenene dine
|-- objects/ # Objektene til prosjektet (commiter,
trær, blober, tagger)
`-- refs/ # Pekere til grenene dine
25. I daglig bruk
$ cd ~/Source/latest-project
$ git init
$ git add .
$ git commit -m'First post'
● Lav kostnad for å komme igang
26. Hent info om repo
$ git status
$ git log
$ git show e6bf359ac52200efe9e46a1
$ git diff HEAD^
$ git grep foo
$ git blame lib/buildbreaker.c
27. Kan legge til noder etter
behov.
F.eks kan bob ha forket mitt repository og
gjort noen endringer jeg ønsker å hente
$ git add remote bob git://bob/o.git
$ git pull bob
28. Split & Hersk
$ git clone git://git.no/foo.git foo
$ vi foo.pl
$ git rebase
$ vi bar.pl
$ git add foo.pl bar.pl
$ git format-patch origin/master
Evt. La maintainer pulle direkte fra din fork.
35. Easy git
● Enkelt påbygg til git
● Kun sukker, fullt kompatibel med git
● Bedre dokumentasjon med eksempler
● Får git til å ligne mer på svn
● Finnes en rekke lignende tillegg
● http://www.gnome.org/~newren/eg/
36. git-svn
● Bruk git som klient for svn repositories
$ git-svn clone http://svn.url/
$ git-add Changes
$ git-commit -m'Phear it'
$ git-svn rebase
$ git-svn dcommit
37. Gitosis
● Sett opp din egen git server
● Gir tilgang over SSH uten å trenge egne
brukerkontoer
● Styr tilgangskontroll
● http://eagain.net/gitweb/?p=gitosis.git
● Kombiner med GitWeb for din egen mini-
github.
39. Bonus: git prompt
● Jeg nevnte at Git er kjapt, sant? Hvorfor ikke putte det i
promptet?
function parse_git_dirty {
[[ $(git status 2> /dev/null | tail -n1) != quot;nothing to commit
(working directory clean)quot; ]] && echo quot;*quot; }
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e quot;s/*
(.*)/[1$(parse_git_dirty)]/quot; }
export PS1='u@h [033[1;33m]w[033[0m]$(parse_git_branch)$
'
presto:
marcus@Command-Central ~/Source/mojomojo[master*]$
40. Spørsmål?
● marcus@nordaaker.com
● Nordaaker leverer blant annet konsulent-
tjenester ifb. med git.
http://nordaaker.com/services.no.html
● Noen skisser ble hentet fra
http://inso.cc/wp/2008/04/10/get-the-git-sl
● Alt slide-materialet er lisensiert under
Attribution-Share Alike 2.5 Lisensen
41. G(et)it nå!
Marcus Ramberg
Nordaaker Ltd
@marcusramberg (Twitter)
1
Hvem er jeg?
Erfaring med versjonkontroll
- Jobb
- Brukt diverse verktøy siden 1996. Tidlig, RCS &
CVS.
- Innført SVN i flere bedrifter
- Evaluerte VCS for SO - Perforce
- Open Source
- Bruker av diverse tjenester fra Sourceforge til
Google Code.
- Satte opp opprinnelig SVN repo for Catalyst
- Nylig migrert MojoMojo fra SVN til Git
Mitt selskap git alle prosjekter
Også dokument-storage
Deployer iusethis.com direkte til produksjon via
GitHub. Har også rails applikasjoner som deployer
med capistrano og Git.
42. I denne presentasjonen
● Hvorfor versjonskontroll?
● Et historisk perspektiv
● Viktige konsepter
● Git i daglig bruk
● Snedige 3. parts-tillegg
2
43. Hvorfor versjonskontroll?
● Forutsetting for samarbeid
● Men også alene
● Undo for kodebasen din
– cp Codebase Codebase.goodCopy
– cp Codebase Codebase.reallyGoodCopy
● Forutsetning for kontroll
● Utvikle fere funksjoner parallelt (Grener)
3
Versionskontroll utenfor utvikling:
Wiki
Undo tracking i Word
44. Et historisk perspektiv
● ~1960 CDC Update IBM IEB_Update, første
SCM verktøyene (Kort-baserte)
● 1972 Bell Labs fnner opp diff algoritmen
● RCS (Sent på 1970-tallet
– Revision Control System
– Låser alle fler
– Skalerer dårlig med fere utviklere.
– Fortsatt nyttig for å jobbe med binærobjekter
4
Diff fortsatt viktig i dag – unified diff som ble utviklet i
1990 er dominerende stil for patchutveksling
RCS er nyttig f.eks i DNS-systemer hvor du ønsker å
låse en zonefil fra å bli redigert av flere samtidig.
45. Et historisk perspektiv
● Patch 1985
● CVS (1986)
– Concurrent Versison System
– Lar fere redigere samme fl
– Defakto verktøy i UNIX miljøet 1990-tallet
5
Patch utviklet av Larry wall , forfatteren av Perl, og en
deltaker på denne konferansen
CVS har versjonsnummer per fil. Sentralisert
låsemekanisme. Ingen sporing av
kopiering/renaming
. Metadata i hver katalog
46. Et historisk perspektiv
● SVN
● Annonsert in 2000 som en erstatning for
CVS
– Atomiske commit
– Lagrer fytting og kopiering av fler. Sporer hele
endringer samlet, heller enn enkelt-fler.
– Støtter Webdav-basert protokoll
– SVK er et påbygg som gir distribuert støtte for
SVN
6
Brandet som CVS done right.
Samme sentraliserte modell, men sporer endringer i
trær heller enn filer
47. Et historisk perspektiv
● Tidlig på 2000 tallet, første distribuerte
systemer som GNU arch og BitKeeper
● 2005 – Linus thorvalds starter Git
prosjektet etter kontrovers rundt
Bitkeeper-lisensiering.
● Ps: det fnnes fere systemer som
Perforce, Rational og Microsoft Source
Safe som ikke ble nevnt i denne
historikken.
7
● Merk at det også finnes andre distribuerte VCS som
bazaar og hg.
48. Git er:
● Distribuert
● Kjapt og skalerbart til store kodebaser
● Open Source (GPL V2)
● Basert på å lagre snapshots, ikke diffs
● Tilgjengelig i de feste unix distribusjoner.
● Tilgjengelig som installasjonspakker for
Windows og OSX.
8
Eksempel på store kodebaser som bruker git: Linux,
Perl, Gnome, X11 & Wine
Windows-støtte var lenge et problem, og fungerte
kun med hjelp av CygWin. Nå finnes msysgit, som
inkluderer en installer, samt en portabel versjon
som ikke trenger å installeres.
49. Git er ikke:
● SVN
– Git er ikke det neste logiske steget på stigen
fra RCS -> CVS -> SVN
● Kjempe-enkelt
– «With great power comes great reponsibility»
– Git kan være litt frusterende i starten.
9
Ugyldig mental modell.
Hjelper hvis du er vant med unix modellen.
Så blir det skikkelig digg etterhvert
50. Viktige konsepter
● Sentralisert vs Desentralisert
● .git - flstruktur
● Objektdatabase
● «Plumbing» og «Porclain»
10
51. Sentralisert versjonkontroll
Arbeidskopi Alice Bob Arbeidskopi
Tjener
Arbeidskopi Charlie Dixe Arbeidskopi
11
Dette er f.eks SVN og CVS
Arbeidskopien innholder ikke historikk
Kan ikke jobbe offline
52. Desentralisert versjonkontroll
Arbeidskopi
Tjener Alice Bob Tjener
Charlie's
Laptop
Tjener
Tjener
Tjener Charlie Dixe Tjener
12
Hver bruker har et fullverdig tre med historikk, og
utveksler sine endringer med «upstream» og
«downstream».
I Charlie's eksempel utveksler laptoppen hans
infomasjon kun med arbeidsstasjonen, som igjen
utveksler informasjon med de andre.
I praksis finnes det ofte et offentlig/sentralt repository,
men dette trenger ikke være autorativt.
Eks. Linux
53. Offine
● Diff ● Merge branch
● Copy ● Blame
● Add ● Tag
● Commit ● Alt untatt push/pull
● Checkout branch
13
SVN var her en forbedring over CVS, som trengte
online tilgang til alle operasjoner, inkludert diff.
54. .git
● En katalog i roten av hvert prosjekt:
|-- HEAD # peker til aktiv gren
|-- config # instillinger for dette prosjektet
|-- description # beskrivelse av prosjektet
|-- hooks/ # automatiske handlinger
|-- index # index file ( Hva er planlagt til neste
commit)?
|-- logs/ # Historikk over grenene dine
|-- objects/ # Objektene til prosjektet (commiter,
trær, blober, tagger)
`-- refs/ # Pekere til grenene dine
14
Kan flyttes ut av prosjektet ved å sette en ENV
variabel
Hooks innholder eksempler. Kan f.eks. Brukes for å
sende mail på commit eller sjekke at ting er riktig
formattert.
Objektdatabasen skal vi se på straks
55. Informasjon lagres i
objektdatabase
15
Katalogen i .git som vist i forrige slide
56. id(object) = SHA1(innholdet i flen)
335e a23f 6679
601a 5592
3347 efa4 34fe cca6
dd85 57bc
cc39 3e93
2211 5390
8e9b 1798
332e 23a7
1432 1260
f943 eab4 93a4 cc5e
b3ca
16
SHA1 – Populær hashing algoritme
Secure Hash Algorithm
SHA-1 (as well as SHA-0) produces a 160-bit digest
from a message with a maximum length of (264 −
1) bits.
Utfases som crypto fra 2010 til fordel for SHA-2
Mer enn bra nok for Git's formål.
57. Innhold lagres i blob objekter
#include <stdio.h>
335e a23f 6679 int main ()
{
601a 5592 printf(”Hello World”);
return 0;
34fe cca6 }
3347 efa4
dd85 57bc
cc39 3e93
2211 5390
8e9b 1798
332e 23a7
1432 1260
f943 eab4 93a4 cc5e
b3ca
17
binary large object (Blob)
Populær term fra SQL
58. Struktur lagres i tree-objekter
040000 tree fec552 src
100644 blob cdea5 hw.c
335e a23f 6679 100644 blob b45d5
INFO
601a 5592
3347 efa4 34fe cca6
dd85 57bc
cc39 3e93
2211 5390
8e9b 1798
332e 23a7
1432 1260
f943 eab4 93a4 cc5e
b3ca
18
Flere tre-objekter bygger en trestruktur.
Filrettigheter i oktal.
59. Historikk lagres i commit-
objekter
tree eec64...
parent c9781...
335e a23f 6679 author Tom <tom@...>
<tom@...>
1204666883 +0100
601a 5592 committer Max
<max@...>
max@...>
34fe cca6 1204666883 +0100
1204666883
3347 efa4
dd85 57bc Fixed a major bug in
cc39 3e93 Hello World.
2211 5390
8e9b 1798
332e 23a7
1432 1260
f943 eab4 93a4 cc5e
b3ca
19
Git skiller mellom forfatter og committer
60. Referanser lagres i tag-objekter
object 92e86...
type commit
tag v1.0.7
335e a23f 6679 tagger Jack <jack@...
>
1136523576 -0800
601a 5592 GIT 1.0.7
-----BEGIN PGP
SIGNATURE-----
3347 efa4 34fe cca6 Version: GnuPG v1.4.2
(GNU/Linux)
dd85 57bc iD8D…
-----END PGP
cc39 3e93 SIGNATURE-----
2211 5390
8e9b 1798
332e 23a7
1432 1260
f943 eab4 93a4 cc5e
b3ca
20
Tags kan signeres kryptografisk
Kan også pushes upstream
61. Peker på et
grener
feature-X
master
commit
objekt
335e a23f 6679
tags 601a 5592
34fe cca6
v1.0 3347 efa4
dd85 57bc
alpha-3 cc39 3e93
2211 5390
as aliases 8e9b 1798
of objects 332e 23a7
(usually 1432 1260
commits) 93a4 cc5e
f943 eab4
b3ca
21
Git sporer da siste commit objekt for hver branch du
tracker
Git holder også styr på når du sist merget en branch.
Merk at når du sletter en branch etter å ha merget
den inn i head forsvinner den fra objektdatabasen,
men er fortsatt tilgjengelig i logger i en periode.
62. En viktig konsekvens:
Git er kjapt! 22
De fleste lokale operasjoner går på under et sekund,
inkludert lage ny branch og bytte branch
Undersøkelse fra mozilla fra 2006 viste da at git var
betraktelig raskere enn hg og bazar
http://weblogs.mozillazine.org/jst/archives/2006/11/vc
s_performance.html
63. Git-kommandoer - UNIX-flosof
23
Små kraftige kommandoer som har et begrenset
område. Alle kommandoene som heter git- kan
også kalles via selve git kommandoen med
kommandonavnet som parameter
64. Porselenet
24
Kommandoene du bruker
Resten kalles plumbing, og trengs ikke for vanlige
brukere / brukes internt i porselenet
65. I daglig bruk
$ cd ~/Source/latest-project
$ git init
$ git add .
$ git commit -m'First post'
● Lav kostnad for å komme igang
25
Svært kjapt å starte å versjonskontrollere en katalog
Krever ikke server
66. Hent info om repo
$ git status
$ git log
$ git show e6bf359ac52200efe9e46a1
$ git diff HEAD^
$ git grep foo
$ git blame lib/buildbreaker.c
26
Commitish trenger bare nok av commit-meldingen til
å være unikt i dette repositoriet
Postfix med ^ referrerer til parent
67. Kan legge til noder etter
behov.
F.eks kan bob ha forket mitt repository og
gjort noen endringer jeg ønsker å hente
$ git add remote bob git://bob/o.git
$ git pull bob
27
68. Split & Hersk
$ git clone git://git.no/foo.git foo
$ vi foo.pl
$ git rebase
$ vi bar.pl
$ git add foo.pl bar.pl
$ git format-patch origin/master
Evt. La maintainer pulle direkte fra din fork.
28
70. Pro Tip: retrack your branch
# Make sure pushed remote branch is
setup
retrack = quot;!retrack() { git
config quot;branch.$1.remotequot; $(dirname
quot;$2quot;); git config quot;branch.
$1.mergequot; quot;refs/heads/$
(basename quot;$2quot;)quot;; }; retrackquot;
$ git retrack foo origin/foo
30
Etter en push av en ny branch
Sikrer at configen blir satt opp riktig.
72. Github – Open Source hosting
32
Tilbyr
Webgrensesnitt for commits
Grafer
Admin for bidragsytere
73. Spore Forks
33
Med en distribuert VCS kan det være mange
bidragsytere du ikke har kontakt med
Github lar deg spore dem
74. Github – Sosialt nisje-nettverk
● Click to add an outline
34
Timeline for utviklere
Nye prosjekter fra folk du følger
Commits fra jobb-prosjekter.
75. Easy git
● Enkelt påbygg til git
● Kun sukker, fullt kompatibel med git
● Bedre dokumentasjon med eksempler
● Får git til å ligne mer på svn
● Finnes en rekke lignende tillegg
● http://www.gnome.org/~newren/eg/
35
Jeg bruker ikke dette
Kan være nyttig i en overgangsfase
76. git-svn
● Bruk git som klient for svn repositories
$ git-svn clone http://svn.url/
$ git-add Changes
$ git-commit -m'Phear it'
$ git-svn rebase
$ git-svn dcommit
36
Greit hvis du vil teste ut git uten å gjøre en full
migrering
77. Gitosis
● Sett opp din egen git server
● Gir tilgang over SSH uten å trenge egne
brukerkontoer
● Styr tilgangskontroll
● http://eagain.net/gitweb/?p=gitosis.git
● Kombiner med GitWeb for din egen mini-
github.
37
79. Bonus: git prompt
● Jeg nevnte at Git er kjapt, sant? Hvorfor ikke putte det i
promptet?
function parse_git_dirty {
[[ $(git status 2> /dev/null | tail -n1) != quot;nothing to commit
(working directory clean)quot; ]] && echo quot;*quot; }
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e quot;s/*
(.*)/[1$(parse_git_dirty)]/quot; }
export PS1='u@h [033[1;33m]w[033[0m]$(parse_git_branch)$
'
presto:
marcus@Command-Central ~/Source/mojomojo[master*]$ 39
80. Spørsmål?
● marcus@nordaaker.com
● Nordaaker leverer blant annet konsulent-
tjenester ifb. med git.
http://nordaaker.com/services.no.html
● Noen skisser ble hentet fra
http://inso.cc/wp/2008/04/10/get-the-git-slides/
● Alt slide-materialet er lisensiert under
Attribution-Share Alike 2.5 Lisensen
40