Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git gyorstalpaló

Miklos V
October 11, 2016
240

Git gyorstalpaló

ELTE (https://www.elte.hu/), Budapest

Miklos V

October 11, 2016
Tweet

Transcript

  1. 2 / 42 ELTE, 2016 | Vajna Miklós Miről lesz

    szó? • Történet, motiváció • Alulról felfelé bevezetés • Munkafolyamatok • Gyakorlat
  2. 4 / 42 ELTE, 2016 | Vajna Miklós Minek a

    verziókezelés? • Mindenki használ verziókezelést: • Gondoljunk csak a „mentés másként” funkcióra • Tarball + patch­ek • Kollaborációhoz nélkülözhetetlen • Segíti a hibakeresést • Egyfajta dokumentációs eszköz
  3. 5 / 42 ELTE, 2016 | Vajna Miklós Minek az

    elosztott verziókezelés? • A teljes repó (kivétel: shallow clone) elérhető helyben • Gyors diff, blame, log, merge • Nem kell mindig online lenni • Nincs egyedi hibapont (SPoF) • Committer fogalma eltűnhet • Mentések kevésbé fontosak • Egyszerűbb branch / merge
  4. 6 / 42 ELTE, 2016 | Vajna Miklós Miért pont

    a git? • Legfontosabb OK: elosztott • De ezen felül is vannak egyedülálló funkciói: • git merge­recursive (cherry­pick kezeli az átnevezéseket) • git rerere • git blame: észreveszi, ha egy darab kódot áthelyeztünk máshova • git grep • combined diff
  5. 7 / 42 ELTE, 2016 | Vajna Miklós Történet •

    RCS (Revision Control System) • CVS (Concurrent Versions System) • Subversion • BitKeeper • Git
  6. 9 / 42 ELTE, 2016 | Vajna Miklós A 4

    objektumtípus • Alacsony szinten: tartalom szerint címezhető filerendszer • 4 objektumtípus: blob, tree, commit, tag • Blob: egy fájl egy verziója • Tree: 1..* tree vagy 1..* blob • Commit: 0..* commit és pontosan 1 tree • Tag: csak annotált tagek esetén használatos, bármire mutathat
  7. 10 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum • Ref, symref • Hook • Reflog • Config • Index • Packfile • Submodule
  8. 11 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: ref, symref • A nem annotált tagek refek • És nem tag objektumok • Tipikus ref­ek: • HEAD • refs/heads/master master → • refs/remotes/origin/master → origin/master
  9. 12 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: hooks • Távoli: pl. levél küldése push után • Helyi: • nem szándékos merge esetén figyelmeztetés • coding style nem betartása • Lehet kikényszerített (push elutasít) • Vagy önkéntes (git commit ­n)
  10. 13 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: reflog • git commit ­m A • git commit ­m B • Utolsó commit eldob • Akarom is B­t, meg nem is • reflog: helyi napló B­ről • Alapértelmezés: 2 hétig
  11. 14 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: config • git config ­­global user.name "Vajna Miklós" • git config –global user.email [email protected] • git config color.grep auto • git config interactive.singlekey true • git config push.default current
  12. 15 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: index • Probléma: egy file­ban két módosítás, csak az egyiket akarjuk commitolni • Vagy conflict feloldás közben: conflictok feloldása egyesével Objektumtároló Munkakönyvtár Index diff diff HEAD diff diff --cached
  13. 16 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: packfile • Kezdetben: egy objektum egy file → • Így se rossz: tree­ben csak a változott file kerül ténylegesen tárolásra • De: • Sok I/O seek • Kis változás nagy file­ban • Megoldás: packfile • git gc ­­auto
  14. 17 / 42 ELTE, 2016 | Vajna Miklós Ami nem

    objektum: submodule • Probléma: közös kód, több projekt használná • Megoldás: tegyük külön repóba, de pontosan kövessük, melyik verzióját használjuk • API változtatást jól leköveti • Bisect­et segíti
  15. 18 / 42 ELTE, 2016 | Vajna Miklós Merge rebase

    ↔ • Kezdeti állapot: • Rebase: • Merge: A B C F G D E topic master A B C F G D E topic master H A' B' C' F G D E topic master
  16. 19 / 42 ELTE, 2016 | Vajna Miklós Parancsok •

    Túl sok: a git (2.10.1) 164 paranccsal rendelkezik • Melyeket kell ismerni? • Kategóriák: • Fő porcelain parancsok • Egyéb porcelain parancsok • Plumbing parancsok
  17. 20 / 42 ELTE, 2016 | Vajna Miklós Plumbing parancsok

    • Scripteléshez, ez a git stabil API­ja • Példa: log rev­list ↔ $ git log --pretty=oneline HEAD~2.. 3b3e7061d610fa83d15b0ba66aba08fd7e39e611 fdo#66743 fix 5abc99f2fc9db8aa4dbce293898e26561f947ece Show errors $ git rev-list HEAD~2.. 3b3e7061d610fa83d15b0ba66aba08fd7e39e611 5abc99f2fc9db8aa4dbce293898e26561f947ece
  18. 21 / 42 ELTE, 2016 | Vajna Miklós Porcelain parancsok:

    túlélőkészlet • init, clone, add, rm, mv • status, branch, diff, log • commit, reset (commit és add visszavonása) • fetch, pull, push • checkout, rebase, merge • show, grep, bisect
  19. 22 / 42 ELTE, 2016 | Vajna Miklós Porcelain parancsok:

    további gyakran használtak • archive, bundle, format­patch / am • cherry­pick és revert • describe, shortlog • gc, clean, stash, submodule
  20. 23 / 42 ELTE, 2016 | Vajna Miklós Porcelain parancsok:

    ritkábban használt hasznosak • Manipuláció: config, filter­branch • Lekérdezés: blame, fsck, verify­tag • Beszélgetés ufókkal: • fast­import / fast­export • archimport, cvsimport/export • quiltimport, svn • git clone mediawiki::https://wiki.example.com
  21. 24 / 42 ELTE, 2016 | Vajna Miklós Ref­ek szimbolikus

    nevei • Állatorvosi ló: • Mit érdemes ebből megjegyezni: ^ és ~ G H I J A = = A^0 \ / \ / B = A^ = A^1 = A~1 D E F C = A^2 = A^2 \ | / \ D = A^^ = A^1^1 = A~2 \ | / | E = B^2 = A^^2 \|/ | F = B^3 = A^^3 B C G = A^^^ = A^1^1^1 = A~3 \ / \ / A H = D^2 = B^^2 = A^^^2 = A~2^2 I = F^ = B^3^ = A^^3^ J = F^2 = B^3^2 = A^^3^2
  22. 26 / 42 ELTE, 2016 | Vajna Miklós CVS jellegű

    megosztott repó fejlesztő fejlesztő fejlesztő
  23. 27 / 42 ELTE, 2016 | Vajna Miklós git.git jellegű

    • Fejlesztőknek helyi privát repó • Patch levelező listára • Karbantartó felveszi repóba • Ha szükséges, a listán inline review • maint, master, next, pu • Alrendszer karbantartóktól pulloz
  24. 28 / 42 ELTE, 2016 | Vajna Miklós Közzétett repók

    fejlesztő publikus fejlesztő privát fejlesztő privát fejlesztő publikus “a” repó integrátor
  25. 29 / 42 ELTE, 2016 | Vajna Miklós GitHub pull

    request • Csak github.com­on • De sokan használják: pl. ELTE­javagyak • Lépések: • fork • clone • hack hack hack • push • pull request
  26. 30 / 42 ELTE, 2016 | Vajna Miklós Gerrit •

    Push jogot mindenkinek • Bárki regisztrálhat, de kezdetben csak virtuális branchbe pusholhat • Review • 1 commit 1 change (lehet több → iteráció) • Approve, submit
  27. 32 / 42 ELTE, 2016 | Vajna Miklós Helyszínek •

    Három helyszín: • munkakönyvtár (working directory) • stage/index (belső név: cache) • repó (git repository)
  28. 33 / 42 ELTE, 2016 | Vajna Miklós Konfiguráció •

    Konfiguráció: • Rendszer, globális, helyi • Repó része is, meg nem is • Köztes megoldás: – Submodule példa
  29. 34 / 42 ELTE, 2016 | Vajna Miklós Repó létrehozás

    • git init • git clone <URL> • Majd: • git add • git commit • git status • git log
  30. 35 / 42 ELTE, 2016 | Vajna Miklós Pull /

    push • git remote add origin <URL> • git push ­­set­upstream origin master • git fetch origin, git fetch • git pull • git push
  31. 36 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés

    • git branch • git checkout ­b ujbranch • git merge master • git checkout master • Conflict? • git status • vi foo/bar.c • git add foo/bar.c • git commit
  32. 37 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés:

    referenced clone • Csak akkor érdekes, ha több branch­ünk van • git clone ­­reference …/master <URL> • Ha submodule­okat is használunk: • Külön script kell hozzá, pl configure opció • A megspórolt hely jelentős, egy példa master / branch méretére: 1.2GB / 13MB
  33. 38 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés:

    rebase ­i • Még nem publikált commit­ok remixelése • Példa: unit teszt • Javítás commitálása • Unit teszt commitálása • Javítás revertelése: jelez hibát a teszt? • rebase ­i: – Revert eldobása – Unit teszt squash­olása a javításba
  34. 39 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés:

    bisect • Bisect: bináris keresés • Regressziók automatikus visszakeresése • bibisect: ha nagy a projekt, és egy nap lenne • Reverse bisect: mit kéne backportolni? • A jó és a rossz válaszok felcserélése • git bisect start és a git bisect good/bad esetén is
  35. 40 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés:

    push tree • Készítsünk egy referenced clone­t, pl. master­ push • Push helyett cherry­pick master­pushba, majd onnan push • Elkerülhető vele egy hosszú rebuild a munkaórák alatt • Minél kevesebbszer csinálunk tényleges pullozást, annál kevésbé hatékony (több conflict) • Továbbra is pullozzunk pl. naponta
  36. 41 / 42 ELTE, 2016 | Vajna Miklós Branch kezelés:

    gitk • Egyszerű grafikus felület branch­ek áttekintéséhez • Ennél több: • Pl. commit gyereke