Git, è un sistema per il controllo di versione. Ma cosa significa? Significa che tramite git è possibile tenere traccia delle modifiche effettuate su un insieme di file. Modifiche ai singoli file, aggiunte e cancellazione di file vengono memorizzate in uno storico. E' possibile lavorare in più persone sugli stessi file, o su una loro copia (clonatura) e poi fondere le modifiche tramite un sistema che aiuta nella soluzione di eventuali conflitti.
L'utilizzo più frequente per questo tipo di programmi è quello della gestione di progetti software di programmi e applicativi web. In un discorso più generale, possiamo dire che è utile quando si deve tenere traccia delle varie versioni di file di testo e relative modifiche.
Git a differenza di precedenti sistemi per il controllo di versione come CVS e Subversion, non ha bisogno di un server centrale. Questo perché utilizza un sistema distribuito, in cui lo sviluppatore può scaricare una completa copia in locale dove c'è la storia di tutte le modifiche e lavorare in piena autonomia. Rispetto ad altri sistemi concorrenti come Mercurial, git è avvantaggio sotto l'aspetto della velocità perché è stato scritto in linguaggio C, che rispetto ad altri linguaggi di alto livello, permette una migliore ottimizzazione delle prestazioni.
Git è stato creato nel 2005 da Linus Torvalds, l'inventore del sistema operativo Linux. Inizialmente è stato creato per la scarsa capacità di progetti datati come CVS e Subversion nel gestire grossi progetti come quello del Kernel di Linux e per problemi di diritti con il software proprietario utilizzato fino ad allora, chiamato BitKeeper.
Di seguito potete trovare una mini guida con i comandi principali di git, che vi permetterà di iniziare ad esplorare le possibilà di questo potente strumento.
git initEseguendo git init dentro alla cartella principale di un progetto, verrà creato il repository locale. A differenza di svn che crea cartelle nasconde dentro a ciascuna cartella del vostro progetto, git crea una sola cartella .git nella radice del progetto. Questo è un vantaggio perchè mantiene più "pulite" le vostre cartelle.
git clone git://url/nome-progetto.gitgit addCi sono varie modalità per aggiungere i file.
git add . |
per aggiungere tutti i file, comprese le sotto cartelle |
|---|---|
git add nomeCartella |
per aggiungere una singola cartella |
git add percorso/nomeFile |
per aggiungere un singolo file |
Spesso all'interno di un singolo progetto ci sono cartelle e file che non devono mai essere messe nel repository, si pensi ad esempio alla cartella con la cache, oppure a quella dei log, ecc. Lasciarle visibili, oltre ad essere fastidioso fornisce una possibilità in più per compiere degli errori ed inserirli erroneamente in qualche versione.
Proprio per questo scopo, esiste la possibilità di non fare comparire tali file e cartelle nell'elenco del nostro progetto. Basta creare nella radice del progetto un file chiamato .gitignore. All'interno è possibile elencare una serie di pattern con i file da escludere. Di seguito riporto alcuni esempi:
| # | Il simbolo di cancelletto inizia un commento e i caratteri successivi vengono ignorati |
|---|---|
| *.tmp | Ignora i file con estensione .tmp |
| cache/ | Ignora i file della cartella cache |
| log.txt | Ignora il file log.txt |
git statusVisualizza lo stato dei file, dividendoli in 3 gruppi. Modifiche non preparate Modifiche preparate (saranno nella nuova revisione)
| Changes to be committed | Mostra i file modificati (rispetto alla commit precedente), che sono stati aggiunti tramite git add e che quindi sono pronti per il commit |
|---|---|
| Changed but not updated | Mostra i file modificati (rispetto alla commit precedente), che non sono stati aggiunti tramite git add e che quindi non verranno inseriti nel prossimo commit |
| Untracked files | Mostra i file che non sono mai stati inseriti nel controllo versione di git |
git diffCon git status vediamo i file che sono stati modificati, mentre per entrare nei dettagli delle righe modificate è necessario utilizzare git diff
git diff |
Mostra le righe che sono state cambiate nei file che non sono ancora stati preparati per la commit, confrontati con la copia presente nell'ultima commit |
|---|---|
git diff –-staged |
Mostra le righe che sono state cambiate nei file che sono stati preparati per la commit, confrontati con la copia presente nell'ultima commit |
git checkout -- nomeFileLanciando il comando git checkout -- nomeFile il file nomeFile presente nella cartella di lavoro viene cancellato e sovrascritto con quello presente nell'ultima versione.
git commitUna volta che sono state effettuate le modifiche e che sono stati aggiunti i file da inserire nel prossimo blocco di modifiche tramite il comando git add, è possibile inviare effettivamente le modifiche utilizzando:
git commit -m "Descrizione delle modifiche"
-m è l'opzione per inserire il messaggio (che per altro è obbligatorio)
git loggit log --color mostra lo storico dei commit. Tramite qusto comando è possibile generare anche delle patch.
Di questo comando esiste anche una versione grafica; si lancia con gitk e permette anche di vedere le modifiche apportate ai singoli file.
git checkoutLanciando git checkout -b nomeDelBranch si crea un nuovo brach chiamo nomeDelBranch.
I successivi comandi (status, commit) vengono riferiti a questo branch
git checkout masterPer tornare al ramo principale, chiamato master.
git pullEventuali modifiche effettuate da altre persone possono essere scaricate con git pull
git mergePer fondere un ramo secondario nomeDelBranch con il principale (master), portarsi su master se non ci si è già, con:
git checkout master
Per effettuare la fusione:
git merge nomeDelBranch
git pushDi seguito elenchiamo alcuni programmi con interfaccia grafica. Tramite questi è possibile eseguire alcune tra le operazioni più comuni, utilizzando una interfaccia grafica.
git gui. Una interessante fonte di documentazione è il libro Pro Git, acquistabile su web, ma presente anche online in lingua inglese. Questo libro è pubblicato sotto licenza Creative Commons, ed esistono varie traduzioni, ma non in italiano. Sarebbe quindi interessante iniziare una traduzione nella nostra lingua.
| Branch | Ramo di sviluppo |
|---|---|
| Commit | Il nome di una revisione particolare |
| Merge | Fusione |
| Revision | Revisione |