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

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