Git è un sistema di gestione delle revisioni creato da Linus Torvalds per ovviare alle carenze degli RCV (Revision Control System) liberi allora esistenti (CVS, SVN, Monotone)
Git fa parte della moderna famiglia dei sistemi di controllo delle revisioni distribuiti, ovvero non prevede un server centralizzato al quale gli sviluppatori devono avere accesso, ma fornisce un repository completo ad ogni sviluppatore, in modo che possa effettuare localmente qualunque operazione, offrendo poi strumenti appositi per la raccolta dei contributi e la gestione unitaria del progetto.
Git favorisce un modello di sviluppo non lineare nel quale le modifiche non sono in un semplice ordine cronologico, ma si suddividono in più rami intrecciati tra di loro, in modo da favorire la collaborazione tra più persone e la libera sperimentazione. Per farlo permette la creazione economica di branch e fornisce degli ottimi strumenti per la loro gestione con merge efficaci e cherry picking.
Git è stato sviluppato con l'obiettivo esplicito di raggiungere buone velocità di funzionamento.
Git è abbastanza semplice da essere adatto già per progetti di dimensioni minime, ma è stato creato per essere adatto allo sviluppo del kernel Linux e non ha quindi problemi ad adattarsi a complessità e dimensioni di tutto riguardo.
L'interfaccia di git segue la tradizione unix dell'uso di numerosi piccoli programmi, ciascuno dedicato ad un solo compito.
Un DVCS come git permette di lavorare in modo molto meno rigido rispetto ad un VCS centralizzato: in particolare rende semplici e naturali operazioni che con un VCS centralizzato sarebbero problematici.
Le principali alternative a git sono gli altri DCVS oggi esistenti; vale la pena di segnalarne alcuni in particolare degni di nota.
Monotone è un DCVS preesistente a git che ne implementava gia` buona parte delle funzionalità: non è stato scelto per lo sviluppo del kernel a causa del suo più grosso difetto, l'estrema lentezza. È ora in un periodo di calo , soppiantato dai DCVS piu` recenti.
Bitkeeper è il DCVS usato per un breve periodo per lo sviluppo del kernel; il suo principale difetto è il non essere software libero. Molte delle sue caratteristiche sono state implementate in git.
Le caratteristiche fondamentali di questi DCVS sono fondamentalmente comparabili a quelle di git, quello che fa la diferenza sono la comodità d'uso, anche rispetto alle proprie abitudini, e la diffusione nei vari progetti ai quali si può essere interessati a partecipare. In particolare bazaar e` usato da launchpad, e quindi da molti progetti correlati ad ubuntu.
Git sta riscuotendo un discreto successo tra gli sviluppatori di software libero; oltre ad essere usato per il suo stesso sviluppo ed ovviamente per il kernel Linux, e` stato adottato da numerosi progetti, tra cui alcuni degni di nota per dimensioni o importanza.
Essendo git distribuito, ogni copia di un progetto è un repository completo, nel quale sono salvate tutte le informazioni relative ai contenuti e alla loro storia. In questo repository sono salvate delle immagini dello stato del progetto in vari momenti della sua storia, chiamati commit e correlati tra di loro da rapporti di parentela non lineare, ma organizzata su linee di sviluppo, dette branch, che possono procedere parallelamente, unirsi o divergere.
Ogni commit è univocamente identificato in ogni repository che lo contenga da un hash di 40 cifre esadecimali, calcolato sui contenuti del commit stesso. I vari branch, dotati di un nome, sono rappresentati ciascuno da un'head, che punta all'ultimo commit di quel branch. Un ulteriore riferimento a particolari commit può essere dato dai tag, usati per riferirsi ad una versione specifica del progetto.
La maggior parte dei repository contengono poi una working directory, una copia della versione corrente dei file del progetto; inoltre git mantiene un index, dove sono salvate tutte le modifiche che andranno a comporre il prossimo commit.
Più repository contenenti lo stesso progetto sono generalmente in una relazione paritaria per la quale ciascuno può scambiare commit, branch e tag con gli altri, tramite operazioni di push e pull. In pratica, si usa in realtà una struttura parzialmente gerarchica nella quale ogni sviluppatore ha uno o più repository per uso personale dal quale invia periodicamente (push) le modifiche ad un repository "bare", ovvero privo di working copy" ed accessibile in lettura a tutti gli altri sviluppatori ed eventualmente al pubblico, che possono scaricare (pull) tali modifiche nei loro repository personali. Alcuni sviluppatori centrali avranno poi il ruolo di integratori e si occuperanno di scaricare le modifiche dai repository pubblici dei vari sviluppatori e pubblicarle in un repository considerato autorevole, dal quale generalmente verranno prese le release.
Git permette comunque, pur senza incoraggiarla, una gestione più tradizionale nella quale gli sviluppatori hanno accesso diretto al repository centrale, al quale possono inviare i commit direttamente dai loro repository privati di uso personale.
Per dichiarare la propria identità a git, perché possa attribuire correttamente i successivi commit:
git config --global user.name "Nome Cognome" git config --global user.email "nome.cognome@example.org"
Per creare la copia locale di un repository pubblicato online o disponibile sul disco locale, rispettivamente:
git clone git://git.kernel.org/pub/scm/git/git.git git clone /home/$COLLEGA/$REPOSITORY ~/repo/$REPOSITORY
Per creare invece un nuovo repository nella directory $MY_REPOSITORY:
cd $MY_REPOSITORY git init
Per visualizzare i branch attualmente presenti sul repository, rispettivamente locali, remoti o tutti:
git branch git branch -r git branch -a
Per passare ad un branch già esistente:
git checkout $BRANCH
Per creare un branch e cominciare a lavorarci:
git checkout -b $BRANCH
Dopo aver modificato alcuni file si può aggiungere il loro stato corrente all'index con il comando:
git add $FILES
contrariamente ad altri VCS, questo non fa sì che ulteriori modifiche a quel file vengano automaticamente inserite nei commit futuri.
I contenuti dell'index possono poi essere trasformati in un commit:
git commit
Authors: | Elena ``of Valhalla'' Grandi <valhalla@lifolab.org> |
---|---|
Version: | 2009-02-16 |