SlideShare a Scribd company logo
Git - Continuous Integration - Docker
la terna dello sviluppo moderno
Gerardo Di Iorio
@arete
Chi Sono
Gerardo Di Iorio
Programmatore presso
Organizzatore DevDay AV
Linux dal 1992 ( potevo utilizzare UNIX su x86)
Cosa è Git
Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di
comando, creato da Linus Torvalds nel 2005.
Fonte Wikipedia
Per controllo di versione intendiamo un software che ci permette di mantenere diverse versioni di uno
stesso progetto, in modo da facilitare il suo sviluppo.
● Sviluppo Distribuito
● Gestione di progetti con moltissimi file
● Merge complessi
● Gestione delle branch semplici
● Veloce
● Robusto
● ….. lo usano tutti!
Importanza di un VCS
“Il controllo versione ingegneristico si è sviluppato dai processi formali basati sui disegni cartacei. Le modifiche a questi documenti sono
identificate incrementando un numero o un codice associato ad essi, denominato "numero di versione", "etichetta di versione", o
semplicemente "versione", e sono etichettate con il nome della persona che ha apportato la modifica. Una semplice forma di controllo
versione, per esempio, assegna il numero 1 alla prima versione di un progetto. Quando viene apportata la prima modifica, il numero
identificativo di versione passa a 2 e così via.” fonte wikipedia
Importanza di un VCS
● Il codice funziona, provo ad aggiungere questa modifica
● Ho sempre lo zip di ieri
● Ho l’undo
● Commento queste due linee ??
● Potrei fare anche migliorare quest’altra funzione….
● Bug risolto da un collega
● Quale modifiche devo mantenere ?
● Non Funziona piu’ nulla !!!!
● Particolarmente urgentissimo !!
NO Problem!
● Ho il controllo delle modifiche
● Ho la storia di tutte le mie modifiche
● Posso ripristinare lo stato di ogni singola modifica
● Branch di sviluppo
● Posso collaborare con altre persone
Installare Git
https://git-scm.com/
➔ Windows (32/64 bit)
➔ Linux (repo distro)
➔ OSX
CLI/GUI
● Gitk,giggle,ungit,gitg
● GitExtensions(Windows)
● Gitkraken(Mac,Windows)
Controllo dei Sorgenti
Centralizzato
Centralized Version Control Systems - CVCS
CVS,Subversion Perfoce
Unico repository con tutte le
informazioni e la storia del progetto.
Localmente si ha solo uno snapshot
della versione (sincronizzata)
Localmente si ha tutta la
storia del
progetto(repository)
Decentralizzato
Distribuited Version Control Systems - DVCS
Git, Mercurial, Bazzars,Darcs
Locale
VCS
RCS,Cartelle,Patch
Il progetto viene gestito con copie
locali del progetto,in modo da avere
uno storico dello sviluppo.
Storia di GIT
● Sviluppo del kernel (1991-2005) Patch e File Compressi
● Uso di BitKeeper (2002)
● Reverse Engineering (Telnet BitKeeper Port ->help)
● Linus Torvalds inizia lo sviluppo di Git
Caratteristiche
● Velocità
● Design semplice
● Ottimo supporto allo sviluppo non-lineare (migliaia di rami paralleli)
● Completamente distribuito
● Capacità di gestire, in modo efficiente (velocità e dimensione dei dati), progetti grandi come il kernel Linux
Funzionamento di GIT
● Git tiene traccia solo dei file che gli indichiamo
esplicitamente
● Un file può essere untracked o unmodified
● Applichiamo le modifiche che vogliamo aggiungere
● Spostiamo il file nella staging area
● Quando si crea un commit vengono salvate tutte le
modifiche presenti nella staging area
● Continuiamo le nostre modifiche
● Tutto ciò viene svolto in locale
git init
Inizializza un repository Git in locale
● Creare una directory
● >git init (inizializza il repository nella directory corrente)
● >git init <folder> (inizializza il repository nella directory <folder>)
>git config --global user.email “Gerardo Di Iorio”
>git config --global user.email “arete74@gmail.com”
git status
Stato del repository
● Branch corrente (default master)
● Stato del repo “avanti” o “indietro” rispetto al branch remoto
● I file modificati non ancora nella staging area
● I file nuovi non ancora tracciati I file tracciati ma rimossi o rinominati
>git status
git add
Aggiunge i file nella staging area
● Serve per spostare le modifiche nella staging area
● Per re a tracciare file non tracciati
● Va fatto con i file che volete siano compresi nel prossimo commit
● Se è una cartella, aggiunge i file ricorsivamente
>git add <file1> <file2> ...<filen>
git add
Aggiunge i file nella staging area
● >git add -a – aggiunge tutte le modifiche sui file già tracciati
● >git add -A – come sopra ma aggiunge anche i file non ancora tracciati
● git add non aggiunge le modifiche correnti alla staging area!
.gitignore
File con elenco di file che vogliamo esplicitamente ignorare nel repository
● Il file accetta sia nomi completi che globbing
● Supporta la negazione *.o (escludi tutti i file che finiscono con .o) !main.o
(...ma non main.o)
Best Pactrick
● Non includere i file che sono generati dal processo di build
● Utilizzare template da https://gitignore.io
git commit
>git commit
● Crea un commit con le modifiche nella staging area
● Di default apre un editor di testo per permettere di digitare il messaggio di
commit
● E’ possibile aggiungere il messaggio come parametro direttamente dalla cli
>git commit -m”Initial Commit”
● Linux kernel >git commit -s
Best practice
● i messaggi di commit devono avere un senso “Versione quasi stabile” ←Nope.
● I commit in Git sono velocissimi, non si pagano
● Evitare MegaCommit “Riscritta tutta la funzione A e aggiunta funzione B e migliorata
funzione C”
● Facilità successiva nell’individuare bug
Commit
Struttura del commit
● Ogni commit è identificato univocamente e630e1fafacccdb8008555b63724058c6c5e8918
● Ha id l’ID è generato facendo un hash (SHA1) di un po’ di “roba”
● In genere (date le proprietà degli hash) possiamo utilizzare i primi 6/8
caratteri del commit, per identificare uno specifico commit
● Puo’ avere 1 o 2 genitori (solo il primo commit non ha nessun genitore)
● I commit possono essere “taggati”, versioni,etc
Assegna il nome all’ultimo commit
>git tag <nome>
assegna il nome al commit specificato
>git tag <nome> <commit>
Crea un tag annotato, vengono riportate anche le info relative a chi ha creato il tag
>git tag -a <nome> <commit>
Comandi
● git rm – rimuove un file nel repository
● git rm --cached – rimuove il file dal tree ma non lo elimina
● git mv – sposta un file del repository
● git log – mostra la history dei commit
● git show <commit> – mostra uno specifico commit
● git diff – mostra il diff tra la staging area e quello lo stato corrente
● git diff --staged – mostra il diff tra l’ultimo commit e la staging area
● git reset – toglie tutto dalla staging area (le modifiche restano)
● git reset --hard <commit> – riporta tutti i file nello stato del commit
● git blame <file> – visualizza le modifiche riga per riga con il commit e autore
● git checkout <commit> -- <file1> <file2> … <fileN> riporta il singolo/i file alla
stato del commit
● git stash crea un salvataggio temporaneo dei file nella stage area
Demo
Collaboriamo
Rami di sviluppo parallelo
● Ramo di produzione
● Ramo/i di personale di sviluppo
● Ramo/i personale di un altro sviluppatore
Git Flow
git branch
Quando creare una branch ?
● branch per il ramo stabile
● un branch per il ramo di sviluppo
● per introdurre nuove funzionalità, per la localizzazione
● particolarmente urgentissimo
git branch Mostra tutte le branch locali
git branch -r Mostra tutte le branch remote
git branch <branch> crea una branch
git branch -D <branch> cancella la branch
git merge
Quando si effettua un merge di due branch possiamo trovare due possibili casi:
1. Fast Foward
2. 3-Way Merge
git merge fast-forward
Nel caso in cui non sia stato fatto nessun
nuovo commit sul branch master da quando
è stato creato il branch develop.
git checkout master
git merge develop
Non viene creato un nuovo commit per il
merge. Nei merge fast forward non ci
possono essere conflitti
git merge 3-way (comando)
Git risale il grafo fino a trovare un parente
comune (B).Quindi, dopo aver svolto il diff
tra il parente e i 2 nodi coinvolti nel merge,
svolge il cosiddetto 3-way merge.
● Se i due commit hanno introdotto la stessa modifica nella
stessa sezione, la modifica viene introdotta
● Se i due commit hanno introdotto una modifica in una
sezione e l’altro non ha modificate quella sezione, la
modifica viene introdotta
● Se tutti e due hanno modificato in modo diverso la stessa
sezione, si viene creato un conflitto
● Risolti i conflitti, viene creato un commit di merge, e’
speciale perchè ha due puntatori ai predecessori commit
git rebase
git rebase
Eseguiamo un rebase di feature su master
git checkout feature; git rebase master
Partendo dall’ultimo commit di master tenta di applicare, un commit alla volta,
tutti i commit che sono sul ramo feature.Si possono ottenere piu conflitti, per
commit.
Riscrive la storia della branch!!!!!
git rebase -i
Esegue un rebase interattivo
git rebase -i master
Viene aperto un editor, in cui vengono mostrati tutti i commit che devono essere
applicati.Per ogni singolo commit e’ possibile specificare l’azione che deve
compiere:
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# These lines can be re-ordered; they are executed from top to bottom.
Conflitti
Durante un merge o un rebase potrebbero esserci dei conflitti
I conflitti vengono segnalati con questa sintassi:
<<<<<<< HEAD <-Modifiche relative al branch corrente
…….
=======
……
….
>>>>>>> <commit-id> -Modifiche relative al commit del branch remoto
Conflitti
I conflitti possono essere risolti anche “a mano” con un editor di testo
Esistono però dei tool visuali
meld,kdiff3,...
git mergetool avvia il vostro tool di risoluzione conflitti
Dopo aver risolto i conflitti, potete continuare con il vostro merge/rebase
git flow
Hosting Git repository
Per condividere il nostro repository con altre persone
abbiamo bisogno di un hosting
Github - free solo per repository pubblici
Gitlab - free per repository pubblici e privati, self hosting
Bitbucket - free per repository pubblici e privati
gitea - self hosting, solo un exe
https://git.wiki.kernel.org/index.php/GitHosting lista completa
Potete condividere il vostro branch via patch (linux kernel)
git format-patch [BASE_BRANCH_NAME]:
$ git format-patch master
0001-<commit message>.patch
$ git send-email --to <your mail> ~/patches/*.patch
$ git apply 0001-<commit message>.patch
git remote
I repository remoti possono essere sincronizzati:
local file system,ssh,https,git
git remote add <nome> <url>
git remote add origin https://github.com/git/git.git
git remote add originssh git@github.com:git/git.git
git remote show Mostra la lista dei repo remoti
git push,fetch,pull
Sincronizziamo i repo remoti
git fetch origin Sincronizza il repo remoto con il locale, scarica solo le branch
e commit remoti...non viene modificata la branch locale
git pull origin Effettua il fetch, e cerca anche di fare il merge.
git push origin test:test Sincronizza la branch locale con la branc remoto.
Se la branch remota non esiste la crea
git push origin -f test:test Effettua il push forzata, nel caso che la storia del
branch remota sia differente
git cherry-pick
cherry-pick <commit> applica i cambiamenti
introdotti da un commit in altro branch
● Bug fix da altre branch
● Singole Implementazioni
● Test di una nuova api
● …..
git non solo codice
etckeeper
● e’ una collezione di script bash che consentono di tenere sotto controllo tramite un sistema di revisione distribuito
directory /etc/
● Dobbiamo ricordarci che è fondamentale mantenere per ogni file, oltre i permessi anche il proprietario ed il gruppo
nonche tutta la struttura di directory comprese quelle vuote.
git-lfs
● estensione per gestire grandi file, presenti su non sul repository locale,ma su cloud esterni,github,gilab,aws etc
Backup di filesystem
● bup
Gestione dei documenti per presentazioni scientifiche…
latex,tex….
Backup
Come effettuo il backup di un repo git ?
git bundle create /backup/repo --all
Rispristino
git clone /backup/repo myrepo
Creare un repository bare
git clone --bare myrepo /backup/my-repo.git
Demo
Hook
Hooks Locali
● pre-commit
● post-commit
● post-checkout
● pre-push
Hooks Remoti
● pre-receive
● post-receive
● update
● post-update
CI : Continuos Integration
è una pratica che si applica in contesti in cui lo sviluppo del software avviene attraverso un sistema di versioning. Consiste
nell'allineamento frequente (ovvero "molte volte al giorno") dagli ambienti di lavoro degli sviluppatori verso l'ambiente
condiviso (wikipedia)
● Travis CI
● Circle Ci
● TeamCity
● Drone.io
Effettua la build per ogni push
Effettua test per la build
Effettua il deploy in ambienti di produzione
Certezza che tutto l’ambiente e build sia replicabile
“Ma sul mio computer compila….”
Demo
Pipeline
Personal
PC
Git locale
GIT
Hosting
CI
Spazio
Web
Docker
Docker automatizza il deployment
(consegna o rilascio al cliente, con
relativa installazione e messa in
funzione o esercizio, di una
applicazione o di un sistema software
tipicamente all'interno di un sistema
informatico aziendale) di applicazioni
all'interno di container software,
fornendo un'astrazione aggiuntiva
grazie alla virtualizzazione a livello di
sistema operativo.
Docker
Vantaggi
● Gestione semplificata (non devo
gestire una VM)
● Prototipazione veloce e semplice
(docker hub)
● Sviluppo semplificato
● Isolamento
● Controllo di versione (ho bisogno
di mysql 5.4.x, php 6.2.1,etc)
● oltre 10000 immagini su Docker
Hub
docker run -d -p 80:80 --name
my-apache-php-app -v
"$PWD":/var/www/html php:7.0-apache
Docker
Docker Compose
Git/Continuous Integration/Docker: la terna dello sviluppo moderno.
Risorse
Repository di esempio
Sito web devdayci.newshell.it
https://github.com/arete/devdayci.newshell.it
Sito web devday.newshell.it
https://github.com/arete/devday.newshell.it
Fine
Don't ask to ask, just ask
@gdiiorio
@arete

More Related Content

PDF
Introduction to docker
PPTX
Introduzione a Docker
ODP
ansible why ?
PDF
Dockerfile
PDF
DCEU 18: Dockerfile Best Practices
PDF
Introduction to docker
PDF
Docker (Compose) 활용 - 개발 환경 구성하기
PPTX
Docker Basics
Introduction to docker
Introduzione a Docker
ansible why ?
Dockerfile
DCEU 18: Dockerfile Best Practices
Introduction to docker
Docker (Compose) 활용 - 개발 환경 구성하기
Docker Basics

What's hot (20)

PPTX
Getting started with Docker
PDF
Introduction to Docker storage, volume and image
PPTX
Docker introduction (1)
PPTX
Containers and Docker
PPTX
Introduction To Docker, Docker Compose, Docker Swarm
ODP
Introduction to Version Control
PPTX
Understanding GIT and Version Control
PDF
Course 102: Lecture 13: Regular Expressions
PDF
CSS workshop @ OutSystems
PDF
MySQL Monitoring with Zabbix
PDF
Introduction to Docker Compose
PDF
Docker introduction
PDF
Course 102: Lecture 7: Simple Utilities
PDF
Alphorm.com Support de la Formation Git
PDF
Docker Introduction
PPT
Docker introduction
PPTX
Containerization & Docker - Under the Hood
PDF
Introduzione a Git (ITA - 2017)
PDF
Jenkins CI
PDF
Docker and the Linux Kernel
Getting started with Docker
Introduction to Docker storage, volume and image
Docker introduction (1)
Containers and Docker
Introduction To Docker, Docker Compose, Docker Swarm
Introduction to Version Control
Understanding GIT and Version Control
Course 102: Lecture 13: Regular Expressions
CSS workshop @ OutSystems
MySQL Monitoring with Zabbix
Introduction to Docker Compose
Docker introduction
Course 102: Lecture 7: Simple Utilities
Alphorm.com Support de la Formation Git
Docker Introduction
Docker introduction
Containerization & Docker - Under the Hood
Introduzione a Git (ITA - 2017)
Jenkins CI
Docker and the Linux Kernel
Ad

Similar to Git/Continuous Integration/Docker: la terna dello sviluppo moderno. (20)

PDF
Git e GitHub
ODP
Controllo di versione e Git
PDF
PDF
Introduzione a Git
PDF
Emerasoft Git quickstart
PDF
Introduzione a git
PDF
GIT commands version control system and collaboration
PDF
GITT (part 1 of 2)
PDF
Revisionare, tracciare, collaborare. Version control con git
PPTX
Git Flow - Un modello di branching che funziona
PDF
Introduzione a Git
PDF
Git – lo stupido gestore di contenuti
PDF
Git best practices
PDF
Development process
PDF
Git gestione comoda del repository
PDF
Git: un'introduzione pratica
PDF
NuIEEE - Workshop de Git
PDF
Git for dummies
Git e GitHub
Controllo di versione e Git
Introduzione a Git
Emerasoft Git quickstart
Introduzione a git
GIT commands version control system and collaboration
GITT (part 1 of 2)
Revisionare, tracciare, collaborare. Version control con git
Git Flow - Un modello di branching che funziona
Introduzione a Git
Git – lo stupido gestore di contenuti
Git best practices
Development process
Git gestione comoda del repository
Git: un'introduzione pratica
NuIEEE - Workshop de Git
Git for dummies
Ad

More from Gerardo Di Iorio (7)

PDF
Docker & DevOps
PDF
Caratterizzazione di un rivelatore a piatti resistivi (RPC)
PPT
Scan Back and Vertex Analysis
PDF
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
PDF
Think open IoT
PDF
Privacy e sicurezza
PDF
Cubie board
Docker & DevOps
Caratterizzazione di un rivelatore a piatti resistivi (RPC)
Scan Back and Vertex Analysis
Ricostruzione di interazioni di pioni nelle Emulsion Cloud Chamber di OPERA
Think open IoT
Privacy e sicurezza
Cubie board

Git/Continuous Integration/Docker: la terna dello sviluppo moderno.

  • 1. Git - Continuous Integration - Docker la terna dello sviluppo moderno Gerardo Di Iorio @arete
  • 2. Chi Sono Gerardo Di Iorio Programmatore presso Organizzatore DevDay AV Linux dal 1992 ( potevo utilizzare UNIX su x86)
  • 3. Cosa è Git Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di comando, creato da Linus Torvalds nel 2005. Fonte Wikipedia Per controllo di versione intendiamo un software che ci permette di mantenere diverse versioni di uno stesso progetto, in modo da facilitare il suo sviluppo. ● Sviluppo Distribuito ● Gestione di progetti con moltissimi file ● Merge complessi ● Gestione delle branch semplici ● Veloce ● Robusto ● ….. lo usano tutti!
  • 4. Importanza di un VCS “Il controllo versione ingegneristico si è sviluppato dai processi formali basati sui disegni cartacei. Le modifiche a questi documenti sono identificate incrementando un numero o un codice associato ad essi, denominato "numero di versione", "etichetta di versione", o semplicemente "versione", e sono etichettate con il nome della persona che ha apportato la modifica. Una semplice forma di controllo versione, per esempio, assegna il numero 1 alla prima versione di un progetto. Quando viene apportata la prima modifica, il numero identificativo di versione passa a 2 e così via.” fonte wikipedia
  • 5. Importanza di un VCS ● Il codice funziona, provo ad aggiungere questa modifica ● Ho sempre lo zip di ieri ● Ho l’undo ● Commento queste due linee ?? ● Potrei fare anche migliorare quest’altra funzione…. ● Bug risolto da un collega ● Quale modifiche devo mantenere ? ● Non Funziona piu’ nulla !!!! ● Particolarmente urgentissimo !!
  • 6. NO Problem! ● Ho il controllo delle modifiche ● Ho la storia di tutte le mie modifiche ● Posso ripristinare lo stato di ogni singola modifica ● Branch di sviluppo ● Posso collaborare con altre persone
  • 7. Installare Git https://git-scm.com/ ➔ Windows (32/64 bit) ➔ Linux (repo distro) ➔ OSX CLI/GUI ● Gitk,giggle,ungit,gitg ● GitExtensions(Windows) ● Gitkraken(Mac,Windows)
  • 8. Controllo dei Sorgenti Centralizzato Centralized Version Control Systems - CVCS CVS,Subversion Perfoce Unico repository con tutte le informazioni e la storia del progetto. Localmente si ha solo uno snapshot della versione (sincronizzata) Localmente si ha tutta la storia del progetto(repository) Decentralizzato Distribuited Version Control Systems - DVCS Git, Mercurial, Bazzars,Darcs Locale VCS RCS,Cartelle,Patch Il progetto viene gestito con copie locali del progetto,in modo da avere uno storico dello sviluppo.
  • 9. Storia di GIT ● Sviluppo del kernel (1991-2005) Patch e File Compressi ● Uso di BitKeeper (2002) ● Reverse Engineering (Telnet BitKeeper Port ->help) ● Linus Torvalds inizia lo sviluppo di Git Caratteristiche ● Velocità ● Design semplice ● Ottimo supporto allo sviluppo non-lineare (migliaia di rami paralleli) ● Completamente distribuito ● Capacità di gestire, in modo efficiente (velocità e dimensione dei dati), progetti grandi come il kernel Linux
  • 10. Funzionamento di GIT ● Git tiene traccia solo dei file che gli indichiamo esplicitamente ● Un file può essere untracked o unmodified ● Applichiamo le modifiche che vogliamo aggiungere ● Spostiamo il file nella staging area ● Quando si crea un commit vengono salvate tutte le modifiche presenti nella staging area ● Continuiamo le nostre modifiche ● Tutto ciò viene svolto in locale
  • 11. git init Inizializza un repository Git in locale ● Creare una directory ● >git init (inizializza il repository nella directory corrente) ● >git init <folder> (inizializza il repository nella directory <folder>) >git config --global user.email “Gerardo Di Iorio” >git config --global user.email “arete74@gmail.com”
  • 12. git status Stato del repository ● Branch corrente (default master) ● Stato del repo “avanti” o “indietro” rispetto al branch remoto ● I file modificati non ancora nella staging area ● I file nuovi non ancora tracciati I file tracciati ma rimossi o rinominati >git status
  • 13. git add Aggiunge i file nella staging area ● Serve per spostare le modifiche nella staging area ● Per re a tracciare file non tracciati ● Va fatto con i file che volete siano compresi nel prossimo commit ● Se è una cartella, aggiunge i file ricorsivamente >git add <file1> <file2> ...<filen>
  • 14. git add Aggiunge i file nella staging area ● >git add -a – aggiunge tutte le modifiche sui file già tracciati ● >git add -A – come sopra ma aggiunge anche i file non ancora tracciati ● git add non aggiunge le modifiche correnti alla staging area!
  • 15. .gitignore File con elenco di file che vogliamo esplicitamente ignorare nel repository ● Il file accetta sia nomi completi che globbing ● Supporta la negazione *.o (escludi tutti i file che finiscono con .o) !main.o (...ma non main.o) Best Pactrick ● Non includere i file che sono generati dal processo di build ● Utilizzare template da https://gitignore.io
  • 16. git commit >git commit ● Crea un commit con le modifiche nella staging area ● Di default apre un editor di testo per permettere di digitare il messaggio di commit ● E’ possibile aggiungere il messaggio come parametro direttamente dalla cli >git commit -m”Initial Commit” ● Linux kernel >git commit -s Best practice ● i messaggi di commit devono avere un senso “Versione quasi stabile” ←Nope. ● I commit in Git sono velocissimi, non si pagano ● Evitare MegaCommit “Riscritta tutta la funzione A e aggiunta funzione B e migliorata funzione C” ● Facilità successiva nell’individuare bug
  • 17. Commit Struttura del commit ● Ogni commit è identificato univocamente e630e1fafacccdb8008555b63724058c6c5e8918 ● Ha id l’ID è generato facendo un hash (SHA1) di un po’ di “roba” ● In genere (date le proprietà degli hash) possiamo utilizzare i primi 6/8 caratteri del commit, per identificare uno specifico commit ● Puo’ avere 1 o 2 genitori (solo il primo commit non ha nessun genitore) ● I commit possono essere “taggati”, versioni,etc Assegna il nome all’ultimo commit >git tag <nome> assegna il nome al commit specificato >git tag <nome> <commit> Crea un tag annotato, vengono riportate anche le info relative a chi ha creato il tag >git tag -a <nome> <commit>
  • 18. Comandi ● git rm – rimuove un file nel repository ● git rm --cached – rimuove il file dal tree ma non lo elimina ● git mv – sposta un file del repository ● git log – mostra la history dei commit ● git show <commit> – mostra uno specifico commit ● git diff – mostra il diff tra la staging area e quello lo stato corrente ● git diff --staged – mostra il diff tra l’ultimo commit e la staging area ● git reset – toglie tutto dalla staging area (le modifiche restano) ● git reset --hard <commit> – riporta tutti i file nello stato del commit ● git blame <file> – visualizza le modifiche riga per riga con il commit e autore ● git checkout <commit> -- <file1> <file2> … <fileN> riporta il singolo/i file alla stato del commit ● git stash crea un salvataggio temporaneo dei file nella stage area
  • 19. Demo
  • 20. Collaboriamo Rami di sviluppo parallelo ● Ramo di produzione ● Ramo/i di personale di sviluppo ● Ramo/i personale di un altro sviluppatore
  • 22. git branch Quando creare una branch ? ● branch per il ramo stabile ● un branch per il ramo di sviluppo ● per introdurre nuove funzionalità, per la localizzazione ● particolarmente urgentissimo git branch Mostra tutte le branch locali git branch -r Mostra tutte le branch remote git branch <branch> crea una branch git branch -D <branch> cancella la branch
  • 23. git merge Quando si effettua un merge di due branch possiamo trovare due possibili casi: 1. Fast Foward 2. 3-Way Merge
  • 24. git merge fast-forward Nel caso in cui non sia stato fatto nessun nuovo commit sul branch master da quando è stato creato il branch develop. git checkout master git merge develop Non viene creato un nuovo commit per il merge. Nei merge fast forward non ci possono essere conflitti
  • 25. git merge 3-way (comando) Git risale il grafo fino a trovare un parente comune (B).Quindi, dopo aver svolto il diff tra il parente e i 2 nodi coinvolti nel merge, svolge il cosiddetto 3-way merge. ● Se i due commit hanno introdotto la stessa modifica nella stessa sezione, la modifica viene introdotta ● Se i due commit hanno introdotto una modifica in una sezione e l’altro non ha modificate quella sezione, la modifica viene introdotta ● Se tutti e due hanno modificato in modo diverso la stessa sezione, si viene creato un conflitto ● Risolti i conflitti, viene creato un commit di merge, e’ speciale perchè ha due puntatori ai predecessori commit
  • 27. git rebase Eseguiamo un rebase di feature su master git checkout feature; git rebase master Partendo dall’ultimo commit di master tenta di applicare, un commit alla volta, tutti i commit che sono sul ramo feature.Si possono ottenere piu conflitti, per commit. Riscrive la storia della branch!!!!!
  • 28. git rebase -i Esegue un rebase interattivo git rebase -i master Viene aperto un editor, in cui vengono mostrati tutti i commit che devono essere applicati.Per ogni singolo commit e’ possibile specificare l’azione che deve compiere: # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # These lines can be re-ordered; they are executed from top to bottom.
  • 29. Conflitti Durante un merge o un rebase potrebbero esserci dei conflitti I conflitti vengono segnalati con questa sintassi: <<<<<<< HEAD <-Modifiche relative al branch corrente ……. ======= …… …. >>>>>>> <commit-id> -Modifiche relative al commit del branch remoto
  • 30. Conflitti I conflitti possono essere risolti anche “a mano” con un editor di testo Esistono però dei tool visuali meld,kdiff3,... git mergetool avvia il vostro tool di risoluzione conflitti Dopo aver risolto i conflitti, potete continuare con il vostro merge/rebase
  • 32. Hosting Git repository Per condividere il nostro repository con altre persone abbiamo bisogno di un hosting Github - free solo per repository pubblici Gitlab - free per repository pubblici e privati, self hosting Bitbucket - free per repository pubblici e privati gitea - self hosting, solo un exe https://git.wiki.kernel.org/index.php/GitHosting lista completa Potete condividere il vostro branch via patch (linux kernel) git format-patch [BASE_BRANCH_NAME]: $ git format-patch master 0001-<commit message>.patch $ git send-email --to <your mail> ~/patches/*.patch $ git apply 0001-<commit message>.patch
  • 33. git remote I repository remoti possono essere sincronizzati: local file system,ssh,https,git git remote add <nome> <url> git remote add origin https://github.com/git/git.git git remote add originssh git@github.com:git/git.git git remote show Mostra la lista dei repo remoti
  • 34. git push,fetch,pull Sincronizziamo i repo remoti git fetch origin Sincronizza il repo remoto con il locale, scarica solo le branch e commit remoti...non viene modificata la branch locale git pull origin Effettua il fetch, e cerca anche di fare il merge. git push origin test:test Sincronizza la branch locale con la branc remoto. Se la branch remota non esiste la crea git push origin -f test:test Effettua il push forzata, nel caso che la storia del branch remota sia differente
  • 35. git cherry-pick cherry-pick <commit> applica i cambiamenti introdotti da un commit in altro branch ● Bug fix da altre branch ● Singole Implementazioni ● Test di una nuova api ● …..
  • 36. git non solo codice etckeeper ● e’ una collezione di script bash che consentono di tenere sotto controllo tramite un sistema di revisione distribuito directory /etc/ ● Dobbiamo ricordarci che è fondamentale mantenere per ogni file, oltre i permessi anche il proprietario ed il gruppo nonche tutta la struttura di directory comprese quelle vuote. git-lfs ● estensione per gestire grandi file, presenti su non sul repository locale,ma su cloud esterni,github,gilab,aws etc Backup di filesystem ● bup Gestione dei documenti per presentazioni scientifiche… latex,tex….
  • 37. Backup Come effettuo il backup di un repo git ? git bundle create /backup/repo --all Rispristino git clone /backup/repo myrepo Creare un repository bare git clone --bare myrepo /backup/my-repo.git
  • 38. Demo
  • 39. Hook Hooks Locali ● pre-commit ● post-commit ● post-checkout ● pre-push Hooks Remoti ● pre-receive ● post-receive ● update ● post-update
  • 40. CI : Continuos Integration è una pratica che si applica in contesti in cui lo sviluppo del software avviene attraverso un sistema di versioning. Consiste nell'allineamento frequente (ovvero "molte volte al giorno") dagli ambienti di lavoro degli sviluppatori verso l'ambiente condiviso (wikipedia) ● Travis CI ● Circle Ci ● TeamCity ● Drone.io Effettua la build per ogni push Effettua test per la build Effettua il deploy in ambienti di produzione Certezza che tutto l’ambiente e build sia replicabile “Ma sul mio computer compila….”
  • 41. Demo
  • 43. Docker Docker automatizza il deployment (consegna o rilascio al cliente, con relativa installazione e messa in funzione o esercizio, di una applicazione o di un sistema software tipicamente all'interno di un sistema informatico aziendale) di applicazioni all'interno di container software, fornendo un'astrazione aggiuntiva grazie alla virtualizzazione a livello di sistema operativo.
  • 44. Docker Vantaggi ● Gestione semplificata (non devo gestire una VM) ● Prototipazione veloce e semplice (docker hub) ● Sviluppo semplificato ● Isolamento ● Controllo di versione (ho bisogno di mysql 5.4.x, php 6.2.1,etc) ● oltre 10000 immagini su Docker Hub docker run -d -p 80:80 --name my-apache-php-app -v "$PWD":/var/www/html php:7.0-apache
  • 48. Risorse Repository di esempio Sito web devdayci.newshell.it https://github.com/arete/devdayci.newshell.it Sito web devday.newshell.it https://github.com/arete/devday.newshell.it
  • 49. Fine Don't ask to ask, just ask @gdiiorio @arete