SlideShare a Scribd company logo
1 of 64
Download to read offline
PRESENTA
«GIT sotto il cofano»
Giuseppe Toto
SPEAKER
OBIETTIVO DI QUESTO TALK
- Maggiore confidenza con GIT
- Facilitare l’apprendimento di GIT
- Evolvere il vostro codice senza timore e in tutta sicurezza
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
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
GIT: Creare un repository
git init
Inizializza il repository del progetto (crea la directory .git)
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)
GIT SOTTO IL COFANO:
il modello di storage
Git: lo stato del repository
Blob: rappresenta un file versionato
(compresso con zlib) del nostro
progetto
legenda
l
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
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
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)
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
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)
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
Come sono immagazzinati gli oggetti di GIT?
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.
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
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
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
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
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
GIT non memorizza le differenze
… ma ogni commit è un SNAPSHOT dell’intero progetto
GIT: Istantanee non differenze!
Ogni volta che facciamo una commit, git fa un’immagine/istantanea/snapshot di tutti i file in quel
momento
SVN: In ogni versione memorizza le differenza
I sistemi come SVN tendono a memorizzare i cambiamenti come differenze rispetto al file di base.
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
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
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
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
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
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
PROVIAMO A DEDURRE ALCUNI COMANDI DI
GIT
Git: lo stato del repository
-
#commit_01
#commit_02
#commit_03
Posizionarsi
sulla commit
precedente?
git checkout 7367
#commit_01
#commit_02
#commit_03git checkout 7367
Posizionarsi
sulla commit
precedente?
Git: lo stato del repository
#commit_01
#commit_02
#commit_03
Annullare
l’ultima commit?
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
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)
Git: lo stato del repository
MAS
#commit_01
#commit_02
#commit_03
POSSIAMO DECIDERE
DI «ANNULLARE»
L’AZIONE DI
«ANNULLAMENTO
DELL’ULTIMA COMMIT»
Git: lo stato del repository
#commit_01
#commit_02
#commit_03
POSSIAMO DECIDERE
DI «ANNULLARE»
L’AZIONE DI
«ANNULLAMENTO
DELL’ULTIMA COMMIT»
I branch
I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0
master
HEAD
I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0 C1
master
HEAD
I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0 C1 C2
master
HEAD
I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0 C1 C2
C2.1
feature-x HEAD
master
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
I branch (’ramificazioni’)
Biforcare (e convergere) il nostro codice
Sono utili quando vogliamo
C0 C1 C2
C2.1
C.2.2
C3
HEADfeature-x
master
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
Cosa è un branch in git?
local/master
local/develop
HEAD
Cosa è un branch in git?
Cosa è un branch in git?
local/master
local/develop
origin/master
HEAD
Cosa è un branch in git?
local/master
local/develop
origin/master
HEAD
Cosa è un branch in git?
local/master
origin/masterlocal/developHEAD
Cosa è un branch in git?
local/master
origin/masterlocal/develop
HEAD
Cosa è un branch in git?
local/master origin/masterlocal/develop
HEAD
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
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
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
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)
CONCLUSIONI
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
Riferimenti
RIFERIMENTI
RIFERIMENTI
https://git-scm.com/book/en/v2
RIFERIMENTI
Tool per disegnare lo stato del repository
https://github.com/ben174/git-draw
GRAZIE J
Lasciami un Feedback
http://bit.ly/2XfFW2v
TROVI ANCHE QUESTA PRESENTAZIONE

More Related Content

Similar to GIT SOTTO IL COFANO

Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)Valerio Radice
 
Git gestione comoda del repository
Git   gestione comoda del repositoryGit   gestione comoda del repository
Git gestione comoda del repositoryRoberto Polli
 
Git: un'introduzione pratica
Git: un'introduzione praticaGit: un'introduzione pratica
Git: un'introduzione praticaBabel
 
Sys05 uso consapevole di git - beyond the basic
Sys05   uso consapevole di git - beyond the basicSys05   uso consapevole di git - beyond the basic
Sys05 uso consapevole di git - beyond the basicDotNetCampus
 
Introduzione a Git e GitLab
Introduzione a Git e GitLabIntroduzione a Git e GitLab
Introduzione a Git e GitLabYefry Figueroa
 
Migrare da un VCS centralizzato a Git
Migrare da un VCS centralizzato a GitMigrare da un VCS centralizzato a Git
Migrare da un VCS centralizzato a GitGian Maria Ricci
 
Introduzione a git
Introduzione a gitIntroduzione a git
Introduzione a gitrpanfili
 
Da GitHub a Nuget con la nuova build di Visual Studio Online
Da GitHub a Nuget con la nuova build di Visual Studio OnlineDa GitHub a Nuget con la nuova build di Visual Studio Online
Da GitHub a Nuget con la nuova build di Visual Studio OnlineDavide Benvegnù
 
PostgreSQL : Architettura di storage
PostgreSQL : Architettura di storagePostgreSQL : Architettura di storage
PostgreSQL : Architettura di storageEnrico Pirozzi
 
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALE
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALELezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALE
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALEGianluigi Cogo
 
Introduzione al Version Control (SVN)
Introduzione al Version Control (SVN)Introduzione al Version Control (SVN)
Introduzione al Version Control (SVN)Marcello Missiroli
 

Similar to GIT SOTTO IL COFANO (19)

Emerasoft Git quickstart
Emerasoft Git quickstartEmerasoft Git quickstart
Emerasoft Git quickstart
 
Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)Introduzione a Git (ITA - 2017)
Introduzione a Git (ITA - 2017)
 
Git gestione comoda del repository
Git   gestione comoda del repositoryGit   gestione comoda del repository
Git gestione comoda del repository
 
Git: un'introduzione pratica
Git: un'introduzione praticaGit: un'introduzione pratica
Git: un'introduzione pratica
 
Sys05 uso consapevole di git - beyond the basic
Sys05   uso consapevole di git - beyond the basicSys05   uso consapevole di git - beyond the basic
Sys05 uso consapevole di git - beyond the basic
 
Git
GitGit
Git
 
Introduzione a Git e GitLab
Introduzione a Git e GitLabIntroduzione a Git e GitLab
Introduzione a Git e GitLab
 
Migrare da un VCS centralizzato a Git
Migrare da un VCS centralizzato a GitMigrare da un VCS centralizzato a Git
Migrare da un VCS centralizzato a Git
 
Git in 5 minuti
Git in 5 minutiGit in 5 minuti
Git in 5 minuti
 
Introduzione a git
Introduzione a gitIntroduzione a git
Introduzione a git
 
Introduzione a Git
Introduzione a GitIntroduzione a Git
Introduzione a Git
 
Da GitHub a Nuget con la nuova build di Visual Studio Online
Da GitHub a Nuget con la nuova build di Visual Studio OnlineDa GitHub a Nuget con la nuova build di Visual Studio Online
Da GitHub a Nuget con la nuova build di Visual Studio Online
 
Git 101 (Introduzione a Git)
Git 101 (Introduzione a Git)Git 101 (Introduzione a Git)
Git 101 (Introduzione a Git)
 
Xamarin DevOps
Xamarin DevOpsXamarin DevOps
Xamarin DevOps
 
GITT (part 1 of 2)
GITT (part 1 of 2)GITT (part 1 of 2)
GITT (part 1 of 2)
 
Introduzione a Git
Introduzione a GitIntroduzione a Git
Introduzione a Git
 
PostgreSQL : Architettura di storage
PostgreSQL : Architettura di storagePostgreSQL : Architettura di storage
PostgreSQL : Architettura di storage
 
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALE
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALELezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALE
Lezione 7 del 21 febbraio 2012 - CLOUD STORAGE PER USO PERSONALE
 
Introduzione al Version Control (SVN)
Introduzione al Version Control (SVN)Introduzione al Version Control (SVN)
Introduzione al Version Control (SVN)
 

GIT SOTTO IL COFANO

  • 1. PRESENTA «GIT sotto il cofano» Giuseppe Toto SPEAKER
  • 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)
  • 7. GIT SOTTO IL COFANO: il modello di storage
  • 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
  • 15. Come sono immagazzinati gli oggetti di GIT?
  • 16. 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.
  • 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
  • 31. PROVIAMO A DEDURRE ALCUNI COMANDI DI GIT
  • 32. Git: lo stato del repository - #commit_01 #commit_02 #commit_03 Posizionarsi sulla commit precedente?
  • 33. git checkout 7367 #commit_01 #commit_02 #commit_03git checkout 7367 Posizionarsi sulla commit precedente?
  • 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»
  • 40. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono utili quando vogliamo C0 master HEAD
  • 41. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono utili quando vogliamo C0 C1 master HEAD
  • 42. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono utili quando vogliamo C0 C1 C2 master HEAD
  • 43. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono utili quando vogliamo C0 C1 C2 C2.1 feature-x HEAD master
  • 44. 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
  • 45. I branch (’ramificazioni’) Biforcare (e convergere) il nostro codice Sono utili quando vogliamo C0 C1 C2 C2.1 C.2.2 C3 HEADfeature-x master
  • 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
  • 47. Cosa è un branch in git?
  • 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
  • 63. RIFERIMENTI Tool per disegnare lo stato del repository https://github.com/ben174/git-draw
  • 64. GRAZIE J Lasciami un Feedback http://bit.ly/2XfFW2v TROVI ANCHE QUESTA PRESENTAZIONE