Cos’è Git
Git è un sistema di controllo versione distribuito, sviluppato da Linus Torvalds nel 2005 per la gestione del kernel Linux. Mantenendo traccia di ogni modifica effettuata, è sempre possibile ripristinare una versione precedente del progetto, permettendo inoltre a più persone di lavorare contemporaneamente sullo stesso in remoto, gestendo automaticamente i conflitti più banali, e delegando agli sviluppatori la risoluzione di quelli più complessi, con un’interfaccia a riga di comando intuitiva e potente.
Linea di comando
Inizializzare un repository
git init
# Esempio
# git init
Clonare un repository
Clonando una repository si crea una copia locale del repository remoto. Si può clonare un repository tramite HTTPS o SSH. Il metodo HTTPS è più semplice per i neofiti, ma richiede la gestione delle credenziali usate per l’autenticazione al server remoto. IL secondo richiede la creazione di una chiave SSH e la sua configurazione sul server remoto.
git clone <url>
# Esempio
# HTTPS
# git clone https://github.com/UNICT-DMI/Telegram-SpottedDMI-Bot.git
# SSH
# git clone git@github.com:UNICT-DMI/Telegram-SpottedDMI-Bot.git
Aggiungere file al repository
Aggiungere file al repository significa inserirli nell’area di staging, pronti per essere committati.
git add <file>
# Esempio
# git add README.md
Committare le modifiche
Una volta soddisfatti con le modifiche effettuate, è possibile committarle, creando un nuovo snapshot del progetto. Si potrà sempre tornare a questo snapshot in futuro.
git commit -m "<messaggio>"
# Esempio
# git commit -m "Aggiunto README.md"
Pushare le modifiche
Le modifiche effettuate in locale vanno condivise con il repository remoto tramite il comando push
.
Il flag -u
permette di impostare il branch locale come upstream del branch remoto, in modo da poter utilizzare git pull
e git push
senza specificare il branch in futuro.
git push [-u] [remote] [branch]
# Esempio
# git push -u origin master
Non è necessario che il branch remoto abbia lo stesso nome di quello locale. In questo caso, però, bisogna essere specifici nel momento del push.
git push <remote> <local branch>:<remote branch>
# Esempio
# git push gitlab main:prescan
Fetchare le modifiche
Per scaricare le modifiche effettuate da altri collaboratori sul repository remoto, è possibile utilizzare il comando fetch
.
git fetch
# Esempio
# git fetch
Pullare le modifiche
Oltre a scaricare le modifiche dal repository remoto, è possibile unirle con quelle locali immediatamente tramite il comando pull
.
git pull
# Esempio
# git pull
Rimuovere un branch remoto
Per eliminare un branch remoto, è possibile utilizzare il comando push
con il flag --delete
.
git push origin --delete <branch>
# Esempio
# git push origin --delete feature
Tags
I tag sono utilizzati per indicare dei punti specifici nella storia del progetto. Vengono comunemente impiegati per segnalare una nuova release del software.
git tag <tag>
# Esempio
# git tag v1.0
# Sincronizza i tag con il repository remoto
git push --tags
# Esempio
# git push --tags
Smettere di tracciare un file
Può capitare di dover modificare un file (magari temporaneamente) senza che queste vengano tracciate da Git.
git update-index --assume-unchanged <file>
# Esempio
git update-index --assume-unchanged some_file
Per annullare questo trattamento speciale, si può utilizzare il comando --no-assume-unchanged
.
git update-index --no-assume-unchanged <file>
# Esempio
git update-index --no-assume-unchanged some_file
File di configurazione
Visualizzare la configurazione
git config --list
# Esempio
# git config --list
Impostare un parametro
git config [--global] <parameter> <value>
# Esempio
# git config --global user.name "Mario Rossi"
Rimuovere un parametro
git config [--global] --unset <parameter>
# Esempio
# git config --global --unset user.name
.gitconfig
Il file .gitconfig
contiene la configurazione globale di Git.
Questo è il file che utilizzo di solito.
# .gitconfig
[core] # Editor di default, Visual Studio Code
editor = code --wait
[user]
name = Ernesto Casablanca
email = casablancaernesto@gmail.com
username = TendTo
signingkey = F506E4A645EE7355 # Chiave GPG per firmare i commit
[alias] # Alias per i comandi più comuni
aliases = !git config --get-regexp alias | sed -re 's/alias\\.(\\S*)\\s(.*)$/\\1 = \\2/g'
lg = log --graph --date=relative --pretty=tformat:'%C(auto)%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
graph = log --all --decorate --oneline --graph --date=relative --pretty=tformat:'%C(auto)%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
oops = commit --amend --no-edit
uncommit = reset --soft HEAD~1
[diff] # Diff tool, Visual Studio Code
tool = vscode
[difftool "vscode"]
cmd = "code --wait --diff $LOCAL $REMOTE"
[commit] # Firma i commit di default
gpgSign = true
[init]
defaultBranch = main
[color]
ui = auto
[tag]
sort = version:refname
[mergetool]
keepBackup = false
keepTemporaries = false
writeToTemp = true
[gpg] # Utilizza GPG2 invece di GPG
program = gpg2
.gitignore
Il file .gitignore
permette di specificare i file e le cartelle che non devono essere tracciati da Git.
Sono ammesse wildcards e percorsi relativi o assoluti.
Questi ultimi vengono considerati relativi alla root del repository.
I pattern possono essere negati tramite il prefisso !
.
Generalmente conviene procurarsi un file .gitignore
preconfigurato, adatto al linguaggio di programmazione utilizzato.
# .gitignore
node_modules/ # Cartella node_modules
/.vscode/ # Cartella .vscode, solo nella root
*.log # File con estensione .log
*kee* # File con 'kee' nel nome
!.gitkeep # Sovrascrive le regole precedenti, tracciando il file .gitkeep
.gitattributes
Il file .gitattributes
permette di specificare le regole per il tracciamento dei file.
Permette di specificare le regole per il tracciamento dei file, come la fine linea, il merge, il diff e l’encoding.
# .gitattributes
# Normalizza la fine linea in base al sistema operativo
* text=auto
# Normalizza la fine linea in CRLF per i file con estensione .cmd e .bat
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
# Normalizza la fine linea in LF per i file con estensione .sh
*.sh text eol=lf
# Ignora il linguaggio di programmazione per i file con estensione .mps
# Utile per rendere accurate le statistiche prodotte da linguist
*.mps linguist-vendored
.git-blame-ignore-revs
Il file .git-blame-ignore-revs
permette di specificare i commit che non devono essere tracciati da git blame
.
Utile per non rendere inutilmente illegibile il blame del progetto con commit di formattazione o di refactoring che coinvolgono molte righe di codice.
# .git-blame-ignore-revs
# Format
db9124f1de0478dcac525009b6f1589b44a7edd8
# Rename internal function
c6378bdd46cb9fbeb4e7a0fbb37d820f8b82232d
# Lint
1795070c67cd08f5c5437b4e0d3ae6e5d3e5fd13