Git è un software per il controllo versione creato da Linus Torvalds nel 2005. E’ uno strumento indispensabile per un programmatore perché gli permette di salvare tutte le versioni del programma su cui sta lavorando, di tenere sotto controllo tutte le modifiche effettuate dall’ultimo salvataggio, di recuperare una qualsiasi versione precedentemente salvata e di tornare rapidament all’ultima versione funzionante del programma. In questo modo è incentivato un modo di lavorare basato su piccoli step progressivi e consolidati.
E’ oggi il sistema di versionamento più usato perché, rispetto ai suoi predecessori (svn e cvs), è più completo e più performante.
Il suo funzionamento è però un po’ più complicato e richiede la conoscenza di un numero maggiore di comandi.
L’Immagine1 rappresenta bene e in modo semplice la struttura di un repository GIT e riassume in modo conciso i comandi principali. Possiamo quindi dire che:
- Git fornisce al programmatore un ambiente di lavoro costituito da una copia locale del repository (Local repository) e da una copia remota (Remote repository).
- La copia locale è costituita da tre “alberi”:
- La Directory di lavoro che contiene i files attuali,
- l’Index che fa da spazio di transito per i files,
- l’HEAD che punta all’ultimo commit fatto.
- I comandi principali sono:
- git clone nomeutente@host:/percorso/del/repository: Per creare la copia locale di un repository remoto.
- git init: Per inizializzare un repository locale nella cartella corrente.
- git status: Mostra lo stato della working directory ed elenca i file modificati, aggiunti e cancellati.
- git add <nomefile> o git add .: Per proporre delle modifiche aggiungendole all’index di un file o di tutti i file modificati.
- git commit -m “Messaggio per il commit”: Per salvare le modifiche sull’HEAD del repository locale.
- git push origin master: Per inviare le modifiche al repository origin sul branch master.
- git checkout <nomefile> o git checkout: Sostituisce i cambiamenti locali di un file o di tutti i file modificati con la versione presente nell’HEAD.
- git pull: Scarica in locale l’ultima versione presente nel repository remoto.
- git diff <nomefile> o git diff: Mostra le differenze tra il file modificato o tutti i file modificati nella working directory e la loro versione in HEAD.
- git log: Elenca i commit mostrando l’id e il messaggio di commit.
- git reset –hard: Elimina tutti i cambiamenti
- git stash: Mette da parte, momentaneamente, tutte le modifiche fatte e non committate.
- git stash pop: Ripristina tutte le modifiche messe da parte in precedenza.
- git fetch –all: Recupera tutti i branch da tutti i repository remoti.
- git branch -v: Elenca tutti i branch.
Ci sono tre concetti molto importanti su cui spesso si fa confusione:
- Head: Indica il commit corrente al quale punta il repository: può puntare all’ultimo commit del repository, ma non è detto. Il suo significato può essere riassunto in: “Quello a cui sta puntando il mio repository in questo momento”.
- Master: E’ il nome del branch di default definito da Git al momento della creazione del repository. Un repository può avere più branch, ma master, di solito, è considerato il branch principale.
- Origin: E’ il nome di default che Git assegna al repository remoto principale (e spesso unico).
Una funzionalità molto utile è quella del branching, il cui funzionamento base è ben spiegato in questa guida. Altre funzionalità molto utili e molto usate sono la possibilità di inserire tag, fare il rebase, fare lo stash delle modifiche correnti (metterle momentaneamente da parte per poi recuperarle successivemnte o cancellarle definitivamente), collegarsi a più repository remoti, creare sottoalberi e di creare dei sottomoduli. Nei riferimenti dei documenti che spiegano queste funzionalità.
Fonti e riferimenti:
- Git, la guida tascabile.
- Spiegazione dei concetti master, head e origin su StackOverflow:
- A visual GIT reference.
- Git for scientists.
- GIT su Wikipedia.
- GIT: Guida ufficiale.
- GIT: Push su StackOverflow.
- My GIT WorkFlow.
- Come usare più repository remoti.
- Come usare i Subtrees.
- Come usare i sottomoduli.
- Subtrees vs submodules.
- A cosa serve e come si usa il rebase.