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