Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere

Pagina creata da Caterina Cocco
 
CONTINUA A LEGGERE
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Git: sistema di versionamento distribuito

                              Igor Maculan
                              Andrea Vanzan
                              Padova, 18/02/2016
IC-GEN-Presentazione-160128
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Sommario

• Versionare

• Git, i concetti di base

• EGIT: Eclipse + Git

• Best practices

                            1
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Versionare
Cosa vuol dire?

Il controllo di versione è un sistema che registra, nel tempo, i cambiamenti ad un file o ad
una serie di file, così da poter richiamare una specifica versione in un secondo momento.

Molte persone gestiscono le diverse versioni copiando i file in un'altra directory (magari una
directory denominata con la data). Questo approccio è molto comune perché è molto
semplice, ma è anche incredibilmente soggetto ad errori. É facile dimenticare in quale
directory sei e modificare il file sbagliato o copiare dei file che non intendevi copiare.

                                                                                               2
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Versionare
Version Control System (VCS)

Funzionalità
•   Ripristinare i file ad una versione precedente
•   Ripristinare l'intero progetto a uno stato precedente
•   Revisionare le modifiche fatte nel tempo
•   Vedere chi ha cambiato qualcosa che può aver causato un problema
•   Creare dei “rami”(branch) alternativi dove implementare/sperimentare nuove
    funzionalità senza doversi preoccupare di “sporcare” il codice esistente
•   Condividere il progetto tra più sviluppatori
•   Poter risalire ai sorgenti di una determinata versione del prodotto

                                                                                 3
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Versionare
VCS Centralizzato (CVCS)

•   Unico server centrale
•   Nessun versionamento locale
•   Connessione al server obbligatoria

Esempi
• CVS
• SVN

                                         4
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Versionare
VCS Distribuito (DVCS)

•   Non necessita di un server centrale
•   Permette un versionamento locale
•   Non necessita di una connessione
•   Permette di sincronizzare i progetti da uno
    sviluppatore ad un altro
•   Possibilita’ di lavorare con server multipli
    (es: server di gruppi diversi)

Esempi
• GIT
• Mercurial

                                                   5
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Git
Git o SVN?
“Git is not better than Subversion. But is also not worse. It's different.”
[Pro]
• Decentralizzato
• Orientato ai branch
• Buon sistema di merging
• Largamente utilizzato
• Performante
• Backup implicito distribuito dell’intero repository
• Tag locali
• Granularità di permessi

[Contro]
• Complesso
• Impossibilità di clonare sotto directory
• Versionamento non progressivo (SHA1)
• Tag su singolo commit
• Commit su singolo branch

                                                                              6
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Git
Chi lo usa?

              7
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Git
Il repository locale

Quasi tutte le operazioni che si effettuano su GIT sono locali, quindi non necessitano di una
connessione o di un server centrale per funzionare.

L’intera storia del progetto e’ interamente in locale, all’interno della directory .git

Le uniche operazioni che si svolgono “online” sono di sincronizzazione tra i repository, quindi tra
le directory .git che risiedono nella workstation ed in un server/sviluppatore remoto

Per chi e’ abituato ad un sistema centralizzato (CVS,SVN) e’ come avere un server centrale nella
propria workstation e, mediante dei comandi dedicati, sincronizzare i vari server/sviluppatori in
rete

                                                                                                  8
Git: sistema di versionamento distribuito - Igor Maculan Andrea Vanzan Padova, 18/02/2016 - InfoCamere
Git
Tre stati
                          La directory di Git è dove Git salva i metadati e
            WorkStation   il database degli oggetti del tuo progetto. Questa
                          è la parte più importante di Git, ed è ciò che
                          viene copiato quando si clona un repository da
                          un altro computer.

                          La directory di lavoro è un checkout di una
                          versione specifica del progetto. Questi file
                          vengono estratti dal database compresso nella
                          directory di Git, e salvati sul disco per essere
                          usati o modificati.

                          L'area di stage è un file, contenuto
                          generalmente nella directory di Git, con tutte le
                          informazioni riguardanti la tua prossima commit.
                          A volte viene indicato anche come 'indice', ma lo
                          standard è definirlo come 'area di stage'

                                                                             9
Git
Workflow
1.      Modifica i file nella tua directory di lavoro
2.      Fanne lo stage, aggiungendone le istantanee all'area di stage
3.      ”Committa”: salva i file dell'area di stage in un'istantanea (snapshot) permanente
        nella tua directory di Git.
4.      “Pusha”: allinea il/i server/sviluppatori remoti
5.      “Pulla”(Fetch+Checkout): allineati alle modifiche dei server remoti
                                                                        Workstation User2

                Workstation User1                                             Working Dir

                  Working Dir
                                                                                            Stage Area

                                 Add/Remove                                      .git Dir

                                  Stage Area
                                                                      Fetch                       Push
     Checkout/Reset                Commit
                                                                          Remote Server
                                                      Push

                      .git Dir                        Fetch                     .git Dir

                                                                                                     10
Git
Utilizzo classico: Sviluppatore – Server Centrale

                                                    11
Git
Modello GitHub
Utilizzato tipicamente per progetti opensource, dove il numero di contributors varia ed ognuno può
creare una propria «versione» del sorgente

                          GitHub server

               Repository
                                    fork       Dev1 Repo               push/pull         Dev1
               principale

                                               Dev2 Repo               push/pull         Dev2

                                                        pull request
         Integration manager

                                                                                              12
Git
 Branch: Merge con Fast Forward
master

         m1           m2             d1            d2

                                                            MERGE
dev

                                      d1           d2

 Non essendoci conflitti tra il branch master e dev la storia viene “appiattita” (fast forward)
 nel branch di destinazione (in questo caso master)

                                                                                             13
Git
Branch: Merge senza Fast Forward
master

         m1            m2             m3                               m4=m3 + d1 + d2

                                                            MERGE
dev

                                      d1            d2

Nel commit M3 sono state committate modifche relative a dei file modificati anche nei
commit d1 e d2.

Nel caso in cui le modifiche riguardino stessi “metodi/funzioni/pezzi di codice” GIT chiedera’
all’utente di “unire/mergiare” i file manualmente e commitarli in un nuovo commit m4.

Nel caso in cui GIT non rilevi modifiche relative alla stessa porzione di codice il sistema
unira’ automaticamente i file e creera’ automaticamente un commit m4

                                                                                              14
Git
Branch applicati: singolo branch
master

             m1             m2             m3

                           V_1.0.0   BUG in produzione
                                     nella versione 1.0.0

•        Non posso usare la versione corrente perche’ contiene la 1.0.0 piu’ N modifiche della
         futura release 1.1.0
•        Recupero il tag v_1.0.0 e sistemo il problema, ma come posso “committare” sul branch
         “master”? visto che contiene le modifiche per la versione successiva 1.1.0
•        Se il fix necessita di ulteriori release, come lo recupero per modificarlo ulteriormente?

                                                                                                 15
Git
  Branch applicati: branch multipli
devel

                           d1               d2
master

         m1      m2        BUG in produzione  m3            m4
                           nella versione 1.0.0

                V_1.0.0                          V_1.0.1   V_1.1.0
fix

                                f1     f2

                                                                16
Git
Don’t panic!!!

La maggior parte dei comandi GIT viene mascherata da eclipse che ne permette un uso
semplificato e molto simile a sistemi di versionamento gia’ conosciuti in azienda (CVS,SVN)

                                                                                        17
EGit
Clone
1.   Utilizzare la prospettiva “GIT Repositories”
2.   Selezionare clona repository
3.   Inserire i riferimenti del repository

                                                    18
EGit
Commit, push

               19
EGit
Fetch e Pull

               20
EGit
Creazione branch

                   21
EGit
Merge branch

               22
EGit
Reset

        23
EGit
Stash

        24
EGit
Tag

       25
EGit
Conflitti

            26
EGit
Blame

        27
EGit
History

          28
Best practices
Commenti

   1.    *** empty log message ***
                                     Mettere dei commenti nei commit e’ utile per
   2.    *** empty log message ***   ritrovare le modifiche nel tempo.
   3.    *** empty log message ***
   4.    *** empty log message ***   GIT obbliga l’inserimento di un commento
   5.    *** empty log message ***
   6.    *** empty log message ***
   7.    *** empty log message ***   E’ possibile obbligare un determinato formato
   8.    *** empty log message ***   nei commenti dei commit
   9.    *** empty log message ***
   10.   *** empty log message ***   (es MTS 123: descrizione breve)
   11.   *** empty log message ***

                                                                                     29
Best Practices
 Branch per funzionalità
   •     Utile con i consulenti (un branch per mantis, un mantis per consulente)
   •     Possibilità di scegliere cosa andrà in produzione e cosa rimandare alla prossima release
MTS
234

                         c1           c2           c3
MTS
123

                         d1           d2
test

                                                  t1               t2
master

            m1                                                                     m3
             1.0.0

                                                                                    1.1.0
                                                                                                    30
Best Practices
  Branch per versione
    •       Mantiene separate le linee di sviluppo
    •       Utile per pochi sviluppatori
Rel 1.1.0

                           a1            a2
master

               m1                                    m2                m3
                1.0.0

                                                     1.1.0

                                                                       1.2.0
Rel 1.2.0

                                                             b1   b2

                                                                               31
Best Practices
Tag e Commit
Commit
• menzionare la funzionalità che si sta implementando nel commit seguendo uno standard
  (es MTS 123:implementato… oppure #issue 123:implementato), così da poter sfruttare
  sistemi automatici di associazione issue-commit

Tag
• «taggare» le versioni rilasciate in produzione per permettere di rintracciare facilmente i
   sorgenti relativi
• utilizzare una nomeclatura omogenea nei nomi dei tag (es v_1.0.0)
• non spostare i tag per non creare confusione agli sviluppatori che si trovano una situazione
   diversa dalla precedente
• commentare i tag (se il sistema di versionamento lo permette)

                                                                                             32
Best Practices
Code review e Continuous Integration

    Dev1                  Code Review
                            (gerrit)                 Valuta modifica

                                                     Conferma modifica

                push
    Local git                      CR
                                                                         Core Dev
      repo                      git repo

                 Jenkins                   Jenkins
                Notification                result

                               Jenkins
                               Server
                                                                Repository
                                                                principale

                                                                                    33
Migrazione
Quando, come, modalità?
Quando?
Dal 1 agosto 2016 tutti i repository presenti in cvs.intra.infocamere.it e in
ict04.ict.intra.infocamere.it saranno accessibili in sola lettura.
È quindi necessario che ogni responsabile del software chieda di migrare i propri
repository, seguendo le nuove nomenclature definite dalla PR220.

Come chiedere la migrazione?
Aprire un mantis nel progetto «Admin Source Repository CVS-GIT», specificando il
progetto da migrare e con quale modalità.

Modalità di migrazione
             Mantenendo la storia                                   Senza storia
•   Viene mantenuta la storia del progetto       •   Non viene mantenuta la storia del progetto
•   Richiede l’intervento di un amministratore   •   Equivale alla creazione di un nuovo
•   Pianificata                                      progetto e la chiusura del vecchio
•   Tempi d’attesa determinati dalla             •   Viene svolta totalmente dal responsabile del
    complessità della struttura del progetto         software
                                                 •   Tempi d’attesa ridotti
                                                                                            34
Riferimenti

•   Console Web interna
    http://gd.intra.infocamere.it/
•   Git Website
    https://git-scm.com/
•   Git Book
    https://git-scm.com/book/en/v2
•   Piattaforma di sviluppo software basata su git
    https://github.com/
•   Corso interattivo di git base (comandi da console)
    https://try.github.io/
•   Comandi più comuni di Git da shell
    http://marklodato.github.io/visual-git-guide/index-it.html#basic-usage
    http://rogerdudler.github.io/git-guide/index.it.html

                                                                             35
Best Practise
Norme di sicurezza

                     36
Grazie per l’attenzione.
Puoi anche leggere