Git, un sistema per il controllo di versione
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, breve storia
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.
Comandi di base a riga di comando
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.
Creare il repository per un proprio progetto
git init
Eseguendo 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.
Scaricare (clonare) un repository già esistente
git clone git://url/nome-progetto.git
Aggiungere file da inserire nella prossima versione
git add
Ci 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 |
Ignorare file e/o cartelle
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 |
Visualizzare lo stato
git status
Visualizza 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 |
Vedere i dettagli delle modifiche effettuate sui file git diff
Con 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 |
Abbandonare le modifiche fatte ad un file nella cartella di lavoro
git checkout -- nomeFile
Lanciando il comando git checkout -- nomeFile
il file nomeFile presente nella cartella di lavoro viene cancellato e sovrascritto con quello presente nell'ultima versione.
Inviare le modifiche
git commit
Una 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)
Visualizzare lo storico dei commit
git log
git 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.
Creare un branch
git checkout
Lanciando git checkout -b nomeDelBranch
si crea un nuovo brach chiamo nomeDelBranch.
I successivi comandi (status, commit) vengono riferiti a questo branch
Tornare al ramo principale
git checkout master
Per tornare al ramo principale, chiamato master.
Sincronizzarsi con le ultime modifiche
git pull
Eventuali modifiche effettuate da altre persone possono essere scaricate con git pull
Fondere un ramo secondario con il principale
git merge
Per 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
Aggiornare il repository remoto
git push
Programmi con interfaccia grafica
Di seguito elenchiamo alcuni programmi con interfaccia grafica. Tramite questi è possibile eseguire alcune tra le operazioni più comuni, utilizzando una interfaccia grafica.
Per Linux
- git-cola
A highly caffeinated git gui - gitg
interfaccia grafica scritta in gtk+/GNOME
Il programma è esteticamente piacevole e ben ordinato, ma la versione 0.0.5 da me testata è assolutamente inaffidabile per quanto riguarda la stabilità - Git Gui
Interfaccia grafica realizzata in Tcl/Tk
Nel momento in cui scrivo questo programma sembra il più completo ed efficace, ed è incorporato in Git dalla versione 1.5.0 e successive. Si lancia da menu o da riga di comando congit gui
.
Per Windows
- Git Extensions
Si integra con Windows Explorer e aggiunge un menu contestuale su file e cartelle. Inoltre include anche un plugin per utilizzare Git con Visual Studio (2005/2008) - TortoiseGit
Porting di TortoiseSVN a TortoiseGit
Per Mac OS X
Documentazione
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.
Glossario
Branch | Ramo di sviluppo |
---|---|
Commit | Il nome di una revisione particolare |
Merge | Fusione |
Revision | Revisione |