TAlk tenuto al CLUB DEGLI SVILUPPATORI - BARI il 20 giugno 2019
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
2. OBIETTIVO DI QUESTO TALK
- Maggiore confidenza con GIT
- Facilitare l’apprendimento di GIT
- Evolvere il vostro codice senza timore e in tutta sicurezza
3. 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
4. git init
git add <nomedelfile>
git commit –m «Messaggio per la commit»
Il modello di storage di gitIl ciclo di vita dello stato dei file
COME RAGIONA GIT?
La nostra prima commit
5. GIT: Creare un repository
git init
Inizializza il repository del progetto (crea la directory .git)
6. ModifiedUntracked Unmodified Staged
Git: Cosa succede quando faccio una commit?
Working
Directory
.git Directory
My Project
shoppingList
(v1)
ShoppingList
(v1)
git add
git commitshoppingList
(v1)
Staging Area
ShoppingList
(v1)
git commit
ciclo di vita dei file
Repository
Commit #01
HEAD
(Area di sosta)
8. Git: lo stato del repository
Blob: rappresenta un file versionato
(compresso con zlib) del nostro
progetto
legenda
l
9. 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
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
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)
12. 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
13. 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)
14. 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
17. ModifiedUntracked 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 commitshoppingList
(v2)
HEAD
Commit #01
ciclo di vita dei file
18. 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
19. 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
20. 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
21. 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
22. GIT non memorizza le differenze
… ma ogni commit è un SNAPSHOT dell’intero progetto
23. GIT: Istantanee non differenze!
Ogni volta che facciamo una commit, git fa un’immagine/istantanea/snapshot di tutti i file in quel
momento
24. SVN: In ogni versione memorizza le differenza
I sistemi come SVN tendono a memorizzare i cambiamenti come differenze rispetto al file di base.
25. 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
26. ModifiedUntracked Unmodified Staged
Git: Cosa succede quando faccio una commit?
Working
Directory
.git Directory
My Project
shoppingList
(v2)
WishList
(v1)
git add
git commitwishList
(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
27. 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
28. 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
29. 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
30. 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
34. Git: lo stato del repository
#commit_01
#commit_02
#commit_03
Annullare
l’ultima commit?
35. 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
36. 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)
37. Git: lo stato del repository
MAS
#commit_01
#commit_02
#commit_03
POSSIAMO DECIDERE
DI «ANNULLARE»
L’AZIONE DI
«ANNULLAMENTO
DELL’ULTIMA COMMIT»
38. Git: lo stato del repository
#commit_01
#commit_02
#commit_03
POSSIAMO DECIDERE
DI «ANNULLARE»
L’AZIONE DI
«ANNULLAMENTO
DELL’ULTIMA COMMIT»
46. I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0 C1 C2
C2.1
C.2.2
C4C3
merge
master HEAD
feature-x
49. Cosa è un branch in git?
local/master
local/develop
origin/master
HEAD
50. Cosa è un branch in git?
local/master
local/develop
origin/master
HEAD
51. Cosa è un branch in git?
local/master
origin/masterlocal/developHEAD
52. Cosa è un branch in git?
local/master
origin/masterlocal/develop
HEAD
53. Cosa è un branch in git?
local/master origin/masterlocal/develop
HEAD
54. Cosa è un branch in git?
Possiede 2 parent
e indica che questa
nuova commit è il
risultato di un
merge di due
commit
Risultato
del
mergelocal/master
origin/master
local/develop
HEAD
55. Cosa è un branch in git?
Possiede 2 parent
e indica che questa
nuova commit è il
risultato di un
merge di due
commit
Risultato
del
mergelocal/master origin/master
local/develop
HEAD
56. 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
57. 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)
59. 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