essentials
cos'è?
"Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency." by git-scm.com
perché?
è utile per la gestione di progetti (sia piccoli, che grandi), poiché fornisce:
- backup: crea versioni del software (files) basato su differenze (minimizzazione del peso associato ai metadati)
- isolamento: ogni membro del progetto ha accesso ad un ambiente isolato, sia locale che (potenzialmente) remoto [branch]
- revert: annullamento delle modifiche (si può "viaggiare nel tempo" con un semplice comando)
quando?
git fetch
quando?
git fetch
quando?
come?
Le funzionalità di git sono usufruibili attraverso comandi testuali da terminale (approccio fortemente consigliato).
È tuttavia possibile usufruirne attraverso tool grafici (https://git-scm.com/downloads/guis)
ed integrazioni con diversi IDE
(Eclipse, Visual Studio, XCode)
hello world
git init
Inizializza l'ambiente git all'interno della cartella corrente (solitamente la root del progetto).
Il prodotto di tale operazione è la creazione di una sottocartella .git, ove sono memorizzate tutte le informazioni necessarie a git per operare.
git init
NB: nessun file è tracciato in questo momento!
git status
Visualizza le differenze con il commit precedente.
In particolare, mostra:
- nuovi file tracciati
- file tracciati modificati
- file non tracciati
- file tracciati rimossi
git status
git add files
Aggiunge i file passati come parametro al tracking interno di git.
Per questi sarà mantenuto uno storico temporale di tipo non lineare (vedere i branch più avanti).
git add file1 file2
git add *.java
git add folder
git add --all
demo
demo
git commit
Crea un "checkpoint" all'interno del branch corrente.
Questo può essere utilizzato per "tornare indietro nel tempo", pertanto ha senso effettuare un commit se:
- lo stato del sistema è funzionante
- esistono modifiche sensate da salvare
Nel dubbio meglio un commit in più che in meno :)
git commit [params]
- -a: "by using the -a switch with the commit command to automatically "add" changes from all known files (i.e. all files that are already listed in the index) and to
automatically "rm" files in the index that have been removed from the working tree, and then perform the actual commit;" (by man git-commit) - -m: permette di inserire un messaggio identificativo del commit corrente
git commit -am "new features added"
git log
Mostra il log associato al branch corrente
NB: log eccessivamente lunghi possono essere navigati tramite i tasti 'j' (direzione giù) e 'k' (direzione su)
git diff
Mostra le differenze tra due commit
git push
Sincronizza le informazioni locali associate al branch corrente con la destinazione remota (origin) scelta.
git push origin branch
NB: il normale flusso di lavoro prevede che si invii da un branch locale al medesimo branch remoto.
Se così non fosse, si forzerebbe una operazione di merging, rischiando di compromettere l'attuale stato del sistema.
git pull
Sincronizza le informazioni remote (origin) associate ad un branch col branch locale corrente.
git pull origin branch
NB: il normale flusso di lavoro prevede che si prelevi un branch remoto dopo essersi spostato nel medesimo branch locale.
Se così non fosse, si forzerebbe una operazione di merging, rischiando di compromettere l'attuale stato del sistema.
git fetch
Analizza le differenze tra il progetto attuale e la repository remota, riportandone i cambiamenti.
Questa operazione è utile per sincronizzare le
meta-informazioni del progetto con quanto contenuto nella repository remota.
git fetch
git clone
Copia un progetto git remoto all'interno del nostro sistema.
Contrariamente a quanto effettuato con git init, ove si inizializza un nuovo ambiente, si riprende un progetto attualmente esistente (e tracciato con git).
git clone https://github.com/Itseez/opencv.git
advanced
git branch
Gestione del progetto secondo un flusso non lineare
git branch
Mostra l'elenco dei branch di lavoro per la repository locale (è possibile che alcuni siano disponibili eclusivamente da remoto), evidenziando in verde quello corrente.
git branch
git checkout
Permette di spostarsi tra diversi branch.
Il branch denominato master individua il flusso principale
ed in quanto tale deve essere sempre pulito (no commit che individuano uno stato del sistema non funzionante).
In particolare esistono diversi casi d'uso utili.
NB: prima di poter operare con questo comando è necessario trovarsi in uno stato di commit, altrimenti l'operazione non andrà a buon fine (poiché git non sa come gestire i cambiamenti non salvati)
git checkout
Creazione di un nuovo branch
git checkout -b nome_branch
è una macro composta dai seguenti comandi:
git branch nome_branch
git checkout nome_branch
NB: per aggiornare la repository remota della creazione
sarà necessario effettuare il push dell'attuale branch
git checkout
Creazione di un nuovo branch locale,
a partire da un branch remoto esistente
git checkout origin/nome_branch
git checkout -b nome_branch
Prima dell'ultimo comando l'ambiente git si trova in uno stato/branch temporaneo e pertanto non persistito.
git merge
Permette di fondere un branch sorgente (quello corrente), all'interno di un branch destinazione (passato come parametro).
L'uso di questo comando è fortemente sconsigliato, poiché Bitbucket permette di effettuare i merge in maniera organizzata e semplifcata attraverso il processo di pull request (discusso in seguito)
git reset
Annulla tutte le modifiche effettuate, ripristinando la repository locale ad un dato commit (l'ultimo se evocato privo di argomenti).
Esistono diverse tipologie di reset. La più utilizzata/consigliata è quella hard, la quale effettua un ripristino totale (comprensivo di cambiamenti ed indici).
git reset --hard hash_commit
È possibile prelevare l'hash del commit desiderato tramite il comando git log
git stash
Simile a quanto effettuato dal precedente comando, con la differenza che salva l'attuale stato di lavoro all'interno di una stack, riportando lo stato al commit precedente. È quindi possibile ripristinare lo stato attuale attraverso procedure di tipo pop.
ripristino + salvataggio dell'attuale stato
git stash
recupero delle informazioni
git stash pop
NB: da usare con cautela. Può generare conflitti ed occorre gestire la struttura a pila.
.gitignore
A differenza di quanto presentato finora, .gitignore non è un comando, ma un file detenente tutte le espressioni regolari che permettono di filtrare in maniera automatica file indesiderati.
Esempio: stiamo lavorando su un progetto in Java e vogliamo portarci dietro esclusivamente i sorgenti e non i compilati (che dipendono dalla macchina in questione).
È sufficiente inserire la riga *.javac all'interno del file affinché questi non siano automaticamente tracciati con comandi simili a git add --all
+
Demo
consigli
- Il branch master deve detenere sempre (e solo!) commit funzionanti
- Non si lavora mai sul master direttamente: funge da container per i merge con gli altri branch
- I merge si effettuano esclusivamente mediante le pull request offerte da Bitbucket
- Si effettua sempre un git fetch ad inizio lavoro (giornata) per controllare se si debba aggiornare il branch corrente dal remoto (stesso branch e/o master), altrimenti si rischiano conflitti, che occorre gestire a mano
- Si crea un branch per feature/ambiente: demo, bugfix, funzionalità1, funzionalità2, ecc...
consigli
workflow
git fetch
workflow
git fetch
workflow
configurazione
Installazione + configurazione git:
Configurazione chiave SSH Bitbucket:
risorse utili
Corso GIT:
Tutorial con (anche) aspetti più avanzati:
Documentazione:
- lanciare dal terminale il comando:
man nome_comando
per ottenerne una completa descrizione (es: man git-push) - sito ufficiale git: https://git-scm.com/doc
Domande?
GIT Essentials
By Andrea Iuliano
GIT Essentials
- 614