"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
è utile per la gestione di progetti (sia piccoli, che grandi), poiché fornisce:
git fetch
git fetch
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)
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!
Visualizza le differenze con il commit precedente.
In particolare, mostra:
git status
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
Crea un "checkpoint" all'interno del branch corrente.
Questo può essere utilizzato per "tornare indietro nel tempo", pertanto ha senso effettuare un commit se:
Nel dubbio meglio un commit in più che in meno :)
git commit -am "new features added"
Mostra il log associato al branch corrente
NB: log eccessivamente lunghi possono essere navigati tramite i tasti 'j' (direzione giù) e 'k' (direzione su)
Mostra le differenze tra due commit
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.
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.
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
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
Gestione del progetto secondo un flusso non lineare
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
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)
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
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.
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)
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
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.
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
git fetch
git fetch
Installazione + configurazione git:
Configurazione chiave SSH Bitbucket:
Corso GIT:
Tutorial con (anche) aspetti più avanzati:
Documentazione: