Git è un software per il controllo di versione distribuito utilizzabile da interfaccia a riga di comando, creato da Linus Torvalds nel 2005. (Wikipedia)

Intro

GIT è uno strumento fondamentale per lo sviluppo di qualsiasi software/progetto in qualsiasi linguaggio di programmazione, perchè ci permette di tenere traccia dei progressi fatti nel corso del tempo, consultare lo storico, diramare il codice su più versioni, suddividere i compiti tra più sviluppatori, tenere il codice sincronizzato tra più postazioni, e tanto altro.

Tutti i progetti del nostro laboratorio li trovi in GIT repository pubblici sul nostro GitHub.

Abbiamo già visto come installare GIT ed integrarlo nel nostro ambiente di sviluppo, e questo articolo non è una guida o tutorial su GIT, ce ne sono già un’infinità in rete e molto più esaustive di quanto potrei essere io.

Qui riporto semplicemente una raccolta di comandi che è indispensabile conoscere (o tenere a portata di mano) per lavorare con GIT da riga di comando. Questo è il foglio dei trucchi (cheat sheet) tutto sgualcito che ho da secoli sul tavolo :sunglasses:

Clone

Per scaricare e lavorare in locale sul proprio pc su un progetto ospitato su un server remoto è necessario clonarlo:

 $ git clone URL
 
# Esempio:
$ git clone https://github.com/ZioTester/ESP32-DevKitC-LAN8720

In questo articolo trovi un esempio dettagliato su come clonare un repository da GitHub.

Init

Per inizializzare una directory locale e trasformarla in un repository git:

$ git init

Status

Ci mostra lo stato del repository:

$ git status
On branch dev
Your branch is up to date with 'origin/dev'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md

no changes added to commit (use "git add" and/or "git commit -a")

In questo esempio, lo status ci riporta che nel repository c’è un file modificato (not staged, index.html) ed un nuovo file (utracked, README.md).

Add

I nuovi files e quelli modificati vanno aggiunti all’area di staging, che è uno stato “intermedio” prima del commit. Tutti i files e relative modifiche, prima di essere tracciati nel nostro repository, devono passare per lo staging tramite il comando add. Una spiegazione più esaustiva dello staging la trovi qui.

# aggiunge il file index.html
$ git add index.html

# aggiunge tutto il contenuto della directory corrente:
$ git add .

Commit

Le modifiche, dopo essere state aggiunte allo stage, vengono definitivamente tracciate tramite il commit.

# effettua il commit dei files aggiunti allo stage
# con relativo commento
$ git commit -m "questa è una modifica del file index.html"

Branch

Restituisce una lista dei rami (branches) presenti nel repository. Il ramo contrassegnato con l’asterisco è il ramo corrente sul quale stiamo lavorando.

$ git branch
* dev
  master

In questo esempio, il nostro repository contiene due rami, dev (quello corrente) e master.

Checkout

Per passare da un ramo all’altro utilizziamo il comando checkout:

# fa il checkout del ramo "master"
$ git checkout master

# crea un nuovo ramo "test" dal ramo corrente e ne fa il checkout
$ git checkout -B test

Merge

Due rami possono essere uniti (merge)

# fa il merge del ramo "test" nel ramo corrente
$ git merge test

Branch delete

Eliminazione dei rami:

# elimina un ramo locale
$ git branch --delete test

# elimina i riferimenti in locale a rami già eliminati in remoto
git fetch -p

# imposta l'eliminazione automatica in locale dei rami eliminati in remoto:
git config --global fetch.prune true

Remote

Il repository locale può essere associato ad una copia remota

# mostra il repository remoto 
$ git remote -v

#imposta "new.git.url/here" come repository remoto
$ git remote set-url origin new.git.url/here

Push/Pull

Se abbiamo settato una remote origin per il nostro repository, possiamo sincronizzarlo periodicamente con i comandi di push (upload delle modifiche) pull (download delle modifiche)

# sincronizza le modifiche locali con il repository remoto
$ git push

# sincronizza le modifiche remote con il repository locale
$ git pull

remove commits

Se per errore abbiamo committato delle modifiche che vogliamo rimuovere, usiamo il reset.

# rimuove l'ultimo commit dal repository locale (incrementare HEAD~n per tornare ancora più indietro)
git reset --hard HEAD~1

# siccessivamente è possibile forzare il reset anche sul remote
git push origin HEAD --force

Please tell me who you are.

La prima volta che usiamo git e proviamo a fare un commit, è necessario settare alcune informazioni obbligatorie quali il nostro nome ed il nostro indirizzo email, utili quando a lavorare sul repository sono più sviluppatori.

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"