Git - Appunti di riferimento

Git è un software di controllo versione distribuito utilizzabile da interfaccia a riga di comando, creato da Linus Torvalds nel 2005, ispirato da strumenti come BitKeeper e Monotone. Git nacque per essere un semplice strumento per facilitare lo sviluppo del kernel Linux ed è diventato lo strumento di controllo versione più diffuso.

Installare Git

GitHub offre un client desktop con interfaccia grafica per svolgere le principali funzioni sui repository. È inoltre presente una versione auto-aggiornante di Git da linea di comando, per gli scenari più avanzati.

Git per tutte le piattaforme

http://git-scm.com

Comandi Principali

Configurazione globale

Configurazione dell’utente valida per tutti i repository

$ git config --global user.name "[name]"

Imposta il nome che vuoi mostrare sulle tue commit

$ git config --global user.email "[email address]"

Imposta l’email che vuoi mostrare sulle tue commit

Creare repository

Crea un nuovo repository o clonane uno esistente da un URL

$ git init [project-name]

Crea un nuovo repository locale con il nome specificato

$ git clone [url]

Scarica un progetto esistente e il suo storico di cambiamenti

Effettuare modifiche

Rivedi i cambiamenti al codice e prepara una commit

$ git status

Elenca tutti i file nuovi o modificati

$ git diff

Mostra le differenze non ancora nell’area di staging

$ git add [file]

Crea uno snapshot del file in preparazione al versioning

$ git diff --staged

Mostra le differenze tra staging e ultima modifica

$ git reset [file]

Rimuovi un file dall’area di staging, ma mantieni le modifiche

$ git commit -m"[descriptive message]"

Salva gli snapshot dei file in maniera permanente nello storico

Modifiche di gruppo

Aggrega una serie di commit all’interno di un branch

$ git branch

Elenca tutti i branch nel repository corrente

$ git branch [branch-name]

Crea un nuovo branch

$ git checkout [branch-name]

Passa al branch specificato e aggiorna la directory corrente

$ git merge [branch-name]

Unisci lo storico del branch specificato con quello corrente

$ git branch -d [branch-name]

Elimina il branch specificato

Refactoring dei nomi di file

Ricerca e rimuovi file dallo storico

$ git rm [file]

Rimuovi un file dalla directory e prepara l’eliminazione definitiva

$ git rm --cached [file]

Elimina il file dallo storico di versione ma mantieni il file locale

$ git mv [file-original] [file-renamed]

Modifica il nome del file in preparazione a una commit

Escludere file dallo storico

Escludi file e percorsi temporanei

   *.log
   build/
   temp-*

Un file di testo chiamato .gitignore previene il versioning accidentale di file o directory secondo un pattern specificato.

$ git ls-files --others --ignored --exclude-standard

Elenca tutti i file ignorati in questo progetto

Salvare frammenti

Archivia e ripristina cambiamenti incompleti

$ git stash

Archivia temporaneamente tutti i file modificati

$ git stash pop

Ripristina tutti i file modificati recentemente

$ git stash list

Elenca i set di cambiamenti archiviati

$ git stash drop

Elimina il set di cambiamenti più recente

Rivedere lo storico

Esplora l’evoluzione dei file del progetto

$ git log

Elenca lo storico di versione per il branch corrente

$ git log --follow [file]

Elenca lo storico di versione per il file specificato, incluse rinominazioni

$ git diff [first-branch]...[second-branch]

Mostra la differenza tra due branch

$ git show [commit]

Mostra i metadati e i cambiamenti della commit specificata

Annullare commit

Elimina errori e altera lo storico dei cambiamenti

$ git reset [commit]

Annulla tutte le commit effettuate dopo [commit], preservando i cambiamenti locali

$ git reset --hard [commit]

Elimina tutto lo storico e i cambiamenti fino alla commit specificata

Sincronizzare i cambiamenti

Collegati a un URL remoto e ottieni lo storico dei cambiamenti

$ git fetch [remote]

Scarica lo storico dei cambiamenti dal repository remoto

$ git merge [remote]/[branch]

Unisci il branch remoto con quello locale

$ git push [remote] [branch]

Carica tutti i cambiamenti al branch locale su GitHub

$ git pull

Scarica lo storico e unisci i cambiamenti

Tradotto ed adattato da https://services.github.com/on-demand/downloads/github-git-cheat-sheet/ a cura di GitHub Learning Lab

Altra utile guida lamp a git

creazione di un nuovo repository

crea una nuova directory, entraci ed esegui git init per creare un nuovo repository git.

checkout di un repository

crea una copia di un repository locale eseguendo il comando
git clone /percorso/del/repository

usando invece un server remoto, il comando sarà
git clone nomeutente@host:/percorso/del/repository

ambiente di lavoro

la tua copia locale del repository è composta da tre “alberi” mantenuti da git. Il primo è la tua Directory di lavoro che contiene i files attuali. Il secondo è l’Index (o Stage) che fa da spazio di transito per i files e per finire l’HEAD che punta all’ultimo commit fatto.

aggiungere & validare

Puoi proporre modifiche (aggiungendole all’Index) usando
git add <nomedelfile>
git add *
Questo è il primo passo nel flusso di lavoro in git. Per validare queste modifiche fatte si usa
git commit -m "Messaggio per la commit"
Ora il file è correttamente nell’HEAD, ma non ancora nel repository remoto.

invio delle modifiche

Quello che hai cambiato ora è nell’HEAD della copia locale. Per inviare queste modifiche al repository remoto, esegui
git push origin master

Cambia master nel branch al quale vuoi inviare i cambiamenti.

Se non hai copiato un repository esistente, e vuoi connettere il tuo repository ad un server remoto, c’e’ bisogno che tu lo aggiunga con
git remote add origin <server>
Ora sarai in grado di inviare le tue modifiche al server remoto specificato

branching

I branch (‘ramificazioni’) sono utilizzati per sviluppare features che sono isolate l’una dall’altra. Il branch master è quello di default quando crei un repository. Puoi usare altri branch per lo sviluppo ed infine incorporarli (‘merge’) nel master branch una volta completati.

crea un nuovo branch chiamato “feature_x” e passa al nuovo branch usando
git checkout -b feature_x
ritorna di nuovo su master
git checkout master
e cancella il branch creato in precedenza
git branch -d feature_x

il branch non sarà disponibile agli altri fino a quando non verrà inviato al repository remoto
git push origin <branch>

aggiorna & incorpora

per aggiornare il tuo repository locale alla commit più recente, esegui
git pull
nella tua directory corrente per fare una fetch (recuperare) ed incorporare(merge) le modifiche fatte sul server remoto.

per incorporare un altro branch nel tuo branch attivo (ad esempio master), utilizza
git merge <branch>

in entrambi i casi git prova ad auto-incorporare le modifiche. Sfortunatamente, a volte questa procedura automatizzata non è possibile, ed in questo caso ci saranno dei conflitti. Sei tu il responsabile che sistemerà questi conflitti manualmente modificando i file che git mostrerà. Dopo aver cambiato questi files, dovrai marcarli come ‘correttamente incorporati’ tramite
git add <nomedelfile>
prima di immettere le modifiche, potrai anche visualizzarne un’anteprima eseguendo :w

git diff <branch_sorgente> <branch_target>

tags

È raccomandato creare dei tags nel caso in cui il software venga rilasciato. Puoi creare un tag chiamato 1.0.0 eseguendo
git tag 1.0.0 1b2e1d63ff
la sequenza 1b2e1d63ff sta per i primi 10 caratteri del commit che si vuol referenziare tramite questo tag. Puoi ottenere l’id della commit tramite
git log
puoi anche utilizzare meno caratteri per l’id della commit, basta che sia unico.

sostituire i cambiamenti locali

Nel caso tu abbia fatto qualcosa di sbagliato (ma non capita mai, sicuro ;) puoi sostituire i cambiamenti fatti in locale con il comando
git checkout -- <nomedelfile>
questo rimpiazza le modifiche nell’albero di lavoro con l’ultimo contenuto presente in HEAD. I cambiamenti fatti ed aggiunti all’index, così come i nuovi files, verranno mantenuti.

Se vuoi in alternativa eliminare tutti i cambiamenti e commits fatti in locale, recupera l’ultima versione dal server e fai puntare il tuo master branch a quella versione in questo modo
git fetch origin
git reset --hard origin/master

suggerimenti utili

colora gli output di git
git config color.ui true
mostra il log in una riga per commit
git config format.pretty oneline
utilizza l’aggiunta interattiva
git add -i

Tradotto ed adattato da git - the simple guide

Altre guide utili

Git Community E-Book
Professional Git
Think like a git (forse è meglio di no, git nello slang americano vuol dire idiota)
GitHub Help
Visual Git