Vai al contenuto

Git cheatsheet

Pubblicato:

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