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

Git gyorstalpaló

Miklos V
October 11, 2016
210

Git gyorstalpaló

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

Miklos V

October 11, 2016
Tweet

Transcript

  1. Git gyorstalpaló:
    A programozók
    csoportjainak gyűjtőneve
    a merge conflict.
    Vajna Miklós
    2016­10­11

    View Slide

  2. 2 / 42 ELTE, 2016 | Vajna Miklós
    Miről lesz szó?
    ● Történet, motiváció
    ● Alulról felfelé bevezetés
    ● Munkafolyamatok
    ● Gyakorlat

    View Slide

  3. Motiváció

    View Slide

  4. 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

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. 7 / 42 ELTE, 2016 | Vajna Miklós
    Történet
    ● RCS (Revision Control System)
    ● CVS (Concurrent Versions System)
    ● Subversion
    ● BitKeeper
    ● Git

    View Slide

  8. Alulról felfele bevezetés

    View Slide

  9. 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

    View Slide

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

    View Slide

  11. 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

    View Slide

  12. 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)

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. 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

    View Slide

  19. 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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

  25. Munkafolyamatok

    View Slide

  26. 26 / 42 ELTE, 2016 | Vajna Miklós
    CVS jellegű
    megosztott repó
    fejlesztő
    fejlesztő fejlesztő

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

  29. 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

    View Slide

  30. 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

    View Slide

  31. Gyakorlat

    View Slide

  32. 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)

    View Slide

  33. 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

    View Slide

  34. 34 / 42 ELTE, 2016 | Vajna Miklós
    Repó létrehozás
    ● git init
    ● git clone
    ● Majd:
    ● git add
    ● git commit
    ● git status
    ● git log

    View Slide

  35. 35 / 42 ELTE, 2016 | Vajna Miklós
    Pull / push
    ● git remote add origin
    ● git push ­­set­upstream origin master
    ● git fetch origin, git fetch
    ● git pull
    ● git push

    View Slide

  36. 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

    View Slide

  37. 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
    ● 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

    View Slide

  38. 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

    View Slide

  39. 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

    View Slide

  40. 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

    View Slide

  41. 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

    View Slide

  42. 42 / 42 ELTE, 2016 | Vajna Miklós
    Kérdések?
    ● Valaki?

    View Slide