• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Marcus Ramberg: Git now
 

Marcus Ramberg: Git now

on

  • 1,757 views

Marcus Rambergs foredrag under GoOpen 2009

Marcus Rambergs foredrag under GoOpen 2009

Statistics

Views

Total Views
1,757
Views on SlideShare
1,746
Embed Views
11

Actions

Likes
0
Downloads
1
Comments
0

1 Embed 11

http://www.slideshare.net 11

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Marcus Ramberg: Git now Marcus Ramberg: Git now Presentation Transcript

    • G(et)it nå! Marcus Ramberg Nordaaker Ltd @marcusramberg (Twitter)
    • I denne presentasjonen ● Hvorfor versjonskontroll? ● Et historisk perspektiv ● Viktige konsepter ● Git i daglig bruk ● Snedige 3. parts-tillegg
    • 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)
    • 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
    • Et historisk perspektiv ● Patch 1985 ● CVS (1986) – Concurrent Versison System – Lar fere redigere samme fl – Defakto verktøy i UNIX miljøet 1990-tallet
    • 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
    • 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.
    • 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.
    • 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.
    • Viktige konsepter ● Sentralisert vs Desentralisert ● .git - flstruktur ● Objektdatabase ● «Plumbing» og «Porclain»
    • Sentralisert versjonkontroll Arbeidskopi Alice Bob Arbeidskopi Tjener Arbeidskopi Charlie Dixe Arbeidskopi
    • Desentralisert versjonkontroll Arbeidskopi Tjener Alice Bob Tjener Charlie's Laptop Tjener Tjener Tjener Charlie Dixe Tjener
    • Offine ● Diff ● Merge branch ● Copy ● Blame ● Add ● Tag ● Commit ● Alt untatt push/pull ● Checkout branch
    • .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
    • Informasjon lagres i objektdatabase
    • 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
    • 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
    • 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
    • Historikk lagres i commit- objekter tree eec64... parent c9781... 335e a23f 6679 author Tom <tom@...> 1204666883 +0100 601a 5592 committer Max <max@...> 34fe cca6 1204666883 +0100 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
    • 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
    • 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
    • En viktig konsekvens: Git er kjapt!
    • Git-kommandoer - UNIX-flosof
    • Porselenet
    • I daglig bruk $ cd ~/Source/latest-project $ git init $ git add . $ git commit -m'First post' ● Lav kostnad for å komme igang
    • Hent info om repo $ git status $ git log $ git show e6bf359ac52200efe9e46a1 $ git diff HEAD^ $ git grep foo $ git blame lib/buildbreaker.c
    • 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
    • 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.
    • Grener $ git checkout -b new_branch $ git branch # vis gren $ git push origin new_branch $ git checkout –track -b new_remote_branch $ git tag v1.0
    • 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
    • Snedige 3-partstilegg ● Github ● Git-svn ● Easy git ● Gitorious ● gitk/gitx
    • Github – Open Source hosting
    • Spore Forks
    • Github – Sosialt nisje-nettverk
    • 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/
    • 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
    • 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.
    • gitk/gitx
    • 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*]$
    • 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
    • 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.
    • I denne presentasjonen ● Hvorfor versjonskontroll? ● Et historisk perspektiv ● Viktige konsepter ● Git i daglig bruk ● Snedige 3. parts-tillegg 2
    • 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
    • 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.
    • 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
    • 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
    • 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.
    • 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.
    • 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
    • Viktige konsepter ● Sentralisert vs Desentralisert ● .git - flstruktur ● Objektdatabase ● «Plumbing» og «Porclain» 10
    • 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
    • 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
    • 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.
    • .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
    • Informasjon lagres i objektdatabase 15 Katalogen i .git som vist i forrige slide
    • 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.
    • 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
    • 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.
    • 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
    • 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
    • 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.
    • 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
    • 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
    • Porselenet 24 Kommandoene du bruker Resten kalles plumbing, og trengs ikke for vanlige brukere / brukes internt i porselenet
    • 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
    • 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
    • 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
    • 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
    • Grener $ git checkout -b new_branch $ git branch # vis gren $ git push origin new_branch $ git checkout –track -b new_remote_branch $ git tag v1.0 29
    • 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.
    • Snedige 3-partstilegg ● Github ● Git-svn ● Easy git ● Gitorious ● gitk/gitx 31
    • Github – Open Source hosting 32 Tilbyr Webgrensesnitt for commits Grafer Admin for bidragsytere
    • Spore Forks 33 Med en distribuert VCS kan det være mange bidragsytere du ikke har kontakt med Github lar deg spore dem
    • Github – Sosialt nisje-nettverk ● Click to add an outline 34 Timeline for utviklere Nye prosjekter fra folk du følger Commits fra jobb-prosjekter.
    • 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
    • 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
    • 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
    • gitk/gitx 38
    • 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
    • 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