Marcus Ramberg: Git now

1,008 views

Published on

Marcus Rambergs foredrag under GoOpen 2009

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,008
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Marcus Ramberg: Git now

  1. 1. G(et)it nå! Marcus Ramberg Nordaaker Ltd @marcusramberg (Twitter)
  2. 2. I denne presentasjonen ● Hvorfor versjonskontroll? ● Et historisk perspektiv ● Viktige konsepter ● Git i daglig bruk ● Snedige 3. parts-tillegg
  3. 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. 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. 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. 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. 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. 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. 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. 10. Viktige konsepter ● Sentralisert vs Desentralisert ● .git - flstruktur ● Objektdatabase ● «Plumbing» og «Porclain»
  11. 11. Sentralisert versjonkontroll Arbeidskopi Alice Bob Arbeidskopi Tjener Arbeidskopi Charlie Dixe Arbeidskopi
  12. 12. Desentralisert versjonkontroll Arbeidskopi Tjener Alice Bob Tjener Charlie's Laptop Tjener Tjener Tjener Charlie Dixe Tjener
  13. 13. Offine ● Diff ● Merge branch ● Copy ● Blame ● Add ● Tag ● Commit ● Alt untatt push/pull ● Checkout branch
  14. 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
  15. 15. Informasjon lagres i objektdatabase
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. 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
  22. 22. En viktig konsekvens: Git er kjapt!
  23. 23. Git-kommandoer - UNIX-flosof
  24. 24. Porselenet
  25. 25. I daglig bruk $ cd ~/Source/latest-project $ git init $ git add . $ git commit -m'First post' ● Lav kostnad for å komme igang
  26. 26. Hent info om repo $ git status $ git log $ git show e6bf359ac52200efe9e46a1 $ git diff HEAD^ $ git grep foo $ git blame lib/buildbreaker.c
  27. 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. 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.
  29. 29. 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
  30. 30. 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
  31. 31. Snedige 3-partstilegg ● Github ● Git-svn ● Easy git ● Gitorious ● gitk/gitx
  32. 32. Github – Open Source hosting
  33. 33. Spore Forks
  34. 34. Github – Sosialt nisje-nettverk
  35. 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. 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. 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.
  38. 38. gitk/gitx
  39. 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. 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. 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. 42. I denne presentasjonen ● Hvorfor versjonskontroll? ● Et historisk perspektiv ● Viktige konsepter ● Git i daglig bruk ● Snedige 3. parts-tillegg 2
  43. 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. 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. 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. 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. 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. 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. 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. 50. Viktige konsepter ● Sentralisert vs Desentralisert ● .git - flstruktur ● Objektdatabase ● «Plumbing» og «Porclain» 10
  51. 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. 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. 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. 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. 55. Informasjon lagres i objektdatabase 15 Katalogen i .git som vist i forrige slide
  56. 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. 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. 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. 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. 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. 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. 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. 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. 64. Porselenet 24 Kommandoene du bruker Resten kalles plumbing, og trengs ikke for vanlige brukere / brukes internt i porselenet
  65. 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. 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. 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. 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
  69. 69. 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
  70. 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.
  71. 71. Snedige 3-partstilegg ● Github ● Git-svn ● Easy git ● Gitorious ● gitk/gitx 31
  72. 72. Github – Open Source hosting 32 Tilbyr Webgrensesnitt for commits Grafer Admin for bidragsytere
  73. 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. 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. 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. 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. 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
  78. 78. gitk/gitx 38
  79. 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. 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

×