Git, un sistema per il controllo di versione

Pubblicato il 08/01/2010

Argomento: Informatica

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 con git 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