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

Git sotto il cofano

Git sotto il cofano

TALK tenuto al Club degli sviluppatori - 20 Giugno 2019

ABSTRACT:
Cosa c'è dietro GIT?
Come ragiona GIT?
Qual è il suo modello di storage?
Cosa avviene dietro le quinte di una Commit?
Come viene garantita l'integrità?

Capire a fondo il suo modello di storage è essenziale al fine di evolvere il vostro codice senza timore e in tutta sicurezza.

Il talk è adatto a tutti. Chi non ha mai usato GIT comprenderà cosà c'è dietro ogni comando e riuscirà a impararlo più velocemente. Chi lo utilizza tutti i giorni, potrà approfondire i meccanismi alla base del suo funzionamento e riuscirà a padroneggiarlo con maggiore consapevolezza.

Bio dello speaker

Giuseppe Toto ha maturato forti esperienze nel coordinamento e sviluppo di applicazioni web, mobile e gaming.

Da anni mette a disposizione le sue competenze ad aziende e startup con forte picco di innovazione, aiutandole a crescere e a fare la differenza in un mercato in continua evoluzione. Da grande appassionato di tecnologia, ama trasmettere la propria conoscenza, confrontarsi e imparare costantemente.

blog: https://giuseppetoto.it

Giuseppe Toto

June 20, 2019
Tweet

More Decks by Giuseppe Toto

Other Decks in Programming

Transcript

  1. OBIETTIVO DI QUESTO TALK - Maggiore confidenza con GIT -

    Facilitare l’apprendimento di GIT - Evolvere il vostro codice senza timore e in tutta sicurezza
  2. OBIETTIVO DI QUESTO TALK - Come ragiona GIT ? -

    Cosa c’è dietro GIT? - Cosa avviene dietro le quinte di una COMMIT ? IL MODELLO DI STORAGE DI GIT
  3. git init git add <nomedelfile> git commit –m «Messaggio per

    la commit» Il modello di storage di git Il ciclo di vita dello stato dei file COME RAGIONA GIT? La nostra prima commit
  4. Modified Untracked Unmodified Staged Git: Cosa succede quando faccio una

    commit? Working Directory .git Directory My Project shoppingList (v1) ShoppingList (v1) git add git commit shoppingList (v1) Staging Area ShoppingList (v1) git commit ciclo di vita dei file Repository Commit #01 HEAD (Area di sosta)
  5. Git: lo stato del repository Blob: rappresenta un file versionato

    (compresso con zlib) del nostro progetto legenda l
  6. Git: lo stato del repository Albero: un mini filesystem che

    può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda l
  7. Git: lo stato del repository Commit: un specifico stato (albero)

    del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_01
  8. Git: lo stato del repository Commit: un specifico stato (albero)

    del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_01 HEAD: Dove sono? Puntatore a una commit o un altro puntatore (branch/tag)
  9. Git: integrità Git ha integrità Gli oggetti in git sono

    identificati (sha-1) dal loro contenuto Qualsiasi cosa in GIT è controllata tramite checksum (30 caratteri esadecimali) 2c6a03aa17ddb9053f769147dff01cbb40a81ccd SHA-1
  10. Git: lo stato del repository Commit: un specifico stato (albero)

    del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_01 HEAD: Dove sono? Puntatore a una commit o un altro puntatore (branch/tag)
  11. Git: lo stato del repository Commit: un specifico stato (albero)

    del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_01 HEAD: Dove sono? Puntatore a una commit o un altro puntatore (branch/tag) Se avessi due file con nomi diversi ma con stesso contenuto ? Sarebbero rappresentati da un unico oggetto blob
  12. la cartella .Git #commit_01 .git cartella cartella .git/refs/heads/master .git/HEAD .git/objects/7e/c2...

    .git/objects/e3/c8… .git/objects/2c/6a03aa17ddb9053f769147dff01cbb40a81ccd Niente database interni o inutile complessità ma semplici file e cartelle sono sufficienti per consentire la gestione di qualsiasi repository.
  13. Modified Untracked Unmodified Staged Git: Cosa succede quando faccio una

    commit? Working Directory .git Directory My Project shoppingList (v1) Repository shoppingList modificato Commit #02 Staging Area shoppingList (v2) commit shoppingList (v1) shoppingList (v2) shoppingList (v2) git add git commit shoppingList (v2) HEAD Commit #01 ciclo di vita dei file
  14. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_02 #commit_01
  15. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_02 #commit_01 #commit_02
  16. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_02 #commit_01 #commit_02
  17. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_02 #commit_01 #commit_02
  18. GIT non memorizza le differenze … ma ogni commit è

    un SNAPSHOT dell’intero progetto
  19. GIT: Istantanee non differenze! Ogni volta che facciamo una commit,

    git fa un’immagine/istantanea/snapshot di tutti i file in quel momento
  20. SVN: In ogni versione memorizza le differenza I sistemi come

    SVN tendono a memorizzare i cambiamenti come differenze rispetto al file di base.
  21. GIT: Istantanee non differenze Git è meno efficiente rispetto a

    SVN? - Mozilla è passato da SVN a GIT. Lo stesso repository da 12GB è arrivato a 420MB (*) - Possiamo spostarci nella storia del nostro repository in modo istantaneo - Le diramazioni sono più veloci (incentiva l’uso dei branch) (*) https://git.wiki.kernel.org/index.php/GitSvnComparison
  22. Modified Untracked Unmodified Staged Git: Cosa succede quando faccio una

    commit? Working Directory .git Directory My Project shoppingList (v2) WishList (v1) git add git commit wishList (v1) Staging Area wishList (v1) commit stati dei files Repository Commit #03 wishList (v1) todoList (v1) todoList (v1) todoList (v1) todoList (v1) shoppingList (v2) Commit #01 Commit #02 HEAD
  23. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_03 #commit_01 #commit_02
  24. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_03 #commit_01 #commit_02 #commit_03
  25. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_03 #commit_01 #commit_02 #commit_03
  26. Git: lo stato del repository HEAD: Dove sono? Puntatore a

    una commit o un altro puntatore (branch/tag) Commit: un specifico stato (albero) del progetto con in più alcuni meta dati Albero: un mini filesystem che può contenere oggetti blob (file) e altri alberi (directory) Blob: rappresenta un file versionato (compresso con zlib) del nostro progetto legenda #commit_03 #commit_01 #commit_02 #commit_03
  27. Il risultato di «git reset --hard 480a» MAS Questa commit

    invisibile da «git log» ma è possibile recuperarla #commit_01 #commit_02 #commit_03 Annullare l’ultima commit? git reset --hard 480a
  28. IMMUTABILITA’ - Ogni nodo presente nell’albero è IMMUTABILE e non

    sarà mai cancellato o modificato - …neanche dai comandi più «pericolosi»: reset, merge, rebase… (andranno solo in aggiunta)
  29. Git: lo stato del repository MAS #commit_01 #commit_02 #commit_03 POSSIAMO

    DECIDERE DI «ANNULLARE» L’AZIONE DI «ANNULLAMENTO DELL’ULTIMA COMMIT»
  30. Git: lo stato del repository #commit_01 #commit_02 #commit_03 POSSIAMO DECIDERE

    DI «ANNULLARE» L’AZIONE DI «ANNULLAMENTO DELL’ULTIMA COMMIT»
  31. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono

    utili quando vogliamo C0 C1 C2 C2.1 feature-x HEAD master
  32. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono

    utili quando vogliamo C0 C1 C2 C2.1 C3 fix bug master HEAD feature-x
  33. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono

    utili quando vogliamo C0 C1 C2 C2.1 C.2.2 C3 HEAD feature-x master
  34. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono

    utili quando vogliamo C0 C1 C2 C2.1 C.2.2 C4 C3 merge master HEAD feature-x
  35. Cosa è un branch in git? Possiede 2 parent e

    indica che questa nuova commit è il risultato di un merge di due commit Risultato del merge local/master origin/master local/develop HEAD
  36. Cosa è un branch in git? Possiede 2 parent e

    indica che questa nuova commit è il risultato di un merge di due commit Risultato del merge local/master origin/master local/develop HEAD
  37. Cosa è un branch in git? local/master origin/master Cosa sono

    i branch in GIT? I BRANCH sono puntatori mobili su una particolare commit dotati di etichetta - Quando ci posizioniamo su un BRANCH l’operazione è istantanea local/develop HEAD
  38. I branch in altri sistemi di versionamento (VCS) In altri

    VCS, come svn, l’operazione di posizionamento di un branch potrebbe richiedere anche alcuni minuti (ricostruzione dei delta)
  39. Il client GIT offre un «astrazione» del suo albero -

    GIT non fa altro che offrire una serie di comandi per manipolare questa struttura ad albero - Ogni nodo presente nell’albero è protetto e non sarà mai cancellato/modificato - …neanche dai comandi più «pericolosi» «reset,merge, rebase» (andranno solo in aggiunta) - Una volta che avete capito questa struttura è facile capire cosa si può fare con git e come i vari comandi operano. Vi sentirete più confidenti e sicuri a portare i cambianti al vostro software