Insieme a git status
e git log
c’è un terzo comando molto comune che è git diff
. Come gli altri due, se si utilizzano strumenti con Visual Studio Code che forniscono un’integrazione con Git, allora forse l’uso non è così frequente, ma qualora non vi sia il supporto di una GUI, il comando git git diff
ci permette di confrontare due file (e non solo) mostrandoci il risultato di una funzione diff.
Il comando multiuso git diff
Come già anticipato, git diff
è un comando che permette di confrontare file, branch, commit, file e altro ancora. Ci aiuta ad individuare le differenze tra gli elementi messi a confronto, un’attività molto comune, soprattutto prima di effettuare un merge, cercando di evitare quanto più possibile i conflitti.
L’output del comando e alcune sue flag di configurazione non sono nuove, le abbiamo già incontrate in passato quando abbiamo visto la modalità patch, la quale accetta tutte le configurazioni possibili di diff.
L’output del comando git diff
1$ git diff
2diff --git a/testodiprova.txt b/testodiprova.txt
3index 6b0c6cf..b37e70a 100644
4--- a/testodiprova.txt
5+++ b/testodiprova.txt
6@@ -1 +1 @@
7-questo è un testo di esempio per git diff
8+questo è un testo di esempio
Questo è il classico output che viene presentato quando si esegue il comando git diff
. Di default confronterà le modifiche in repository con quelle della working directory.
Ma cosa vogliono dire tutte quelle informazioni? Vediamole una per una.
1diff --git a/testodiprova.txt b/testodiprova.txt
La prima riga ci indica quali sono le sorgenti del confronto. In questo caso la versione a
è quella salvata in repo, mentre b
è quella in working directory.
1index 6b0c6cf..b37e70a 100644
Ormai non ci stupisce più la onnipresenza degli hash in Git e per quanto sappiamo che si tratta degli identificatori interni di Git relativi agli oggetti comparati, questa informazione non ci interessa nel 99.99% dei casi.
1--- a/testodiprova.txt
2+++ b/testodiprova.txt
Una legenda che ci dice che con il -
sono indicate le modifiche di a
, mentre con il +
le modifiche di b
.
1@@ -1 +1 @@
La parte racchiusa tra le doppie chiocciole è l’intestazione che identifica il blocco di modifiche. -1 e +1 è il riepilogo delle modifiche, significa che la prima riga presenta delle modifiche.
1@@ -10,3 +10,5 @@
In questo caso significa che sono state estratte 3 righe a partire dalla 10 e che sono state aggiunte 5 righe a partire dalla riga 10.
1-questo è un testo di esempio per git diff
2+questo è un testo di esempio
La parte finale del blocco mostra le modifiche. Ogni riga preceduta di modifica è preceduta da +
e -
indica da dove vengono le modifiche (file a
o file b
, in base alla legenda precedente). Per comprendere invece se un elemento è stato aggiunto o rimosso il colore rosso indica la rimozione, mentre il verde l’aggiunta.
Confrontare due file con git diff
1$ git diff HEAD ./percorso/file
o
1$ git diff ./percorso/file
Ci permette di vedere le differenze di un file specifico confrontando la versione salvata con ciò che c’è nella directory di lavoro. Qualora invece usassimo la flag --cached
il confronto verrà fatto con i file in staging area.
1$ git diff --cached ./percorso/file
Per vedere tutte le modifiche che sono state fatte senza focalizzarsi su un file specifico, il comando git diff
senza nessuna flag o ulteriori informazione ci restituisce una lista completa di tutte le differenze.
Confrontare due commit con git diff
1$ git diff cb84ce3 dd5b044
Passando due hash (vanno bene anche HEAD, il nome di un tag o di una branch) verranno confrontate le due commit. Gli hash sono ottenibili attraverso git log
Confrontare due branch con git diff
Come già detto in precedenza si possono confrontare due branch semplicemente scrivendo i nomi delle branch.
1$ git diff testdiff main
Questo è un comando più che valido e se volessimo confrontare un solo file presente nelle due branch, basterà far seguire il percorso del file in questo modo:
1$ git diff testdiff main ./percorso/file
Ma con il confronto tra branch ci sono un paio di operatori che possiamo usare per modificare il tipo di confronto che sono l’operatore a doppio punto e triplo punto
Gli operatori a doppio e triplo punto in git diff
1$ git diff main..testdiff
2$ git diff main...testdiff
Producono, per un occhio meno esperto, un output molto simile o praticamente identico. In alcuni casi è vero, soprattutto se non sono state fatte grosse attività in termini di modifiche (e quindi di commit).
C’è però una differenza sostanziale tra il doppio e il triplo punto. Partiamo con il dire che il doppio punto se viene omesso non è un problema git diff main testdiff
si comporta nello stesso modo.
La differenza sostanziale tra i due operatori è il cosa viene confrontato, perché con il doppio punto noi confrontiamo la HEAD di entrambe le branch, mentre nel caso del triplo punto il confronto avviene tra le HEAD delle branch a destra (testdiff nel nostro caso) con l’antenato comune delle due branch.
Quando abbiamo parlato delle branch abbiamo visto la storia divergente
Nell’esempio qui sopra la commit f30ab
è l’antenato comune tra la branch master e la branch testing, quindi qualora dovessi scrivere git diff master…testing
il confronto avverrebbe tra la commit 87ab2
e f30ab
. Mentre nel caso dell’operatore a doppio punto il confronto avverrebbe tra la commit 87ab2
e c2b9e
.
Conclusioni
Nella prossima lezione parleremo di blame, un’altro comando di risoluzione dei problemi, prima di passare a merge. Ci siamo quasi, per quanto manchino ancora dei concetti fondamentali per il lavoro in team, arrivati a questo punto Git dovrebbe aver perso la sua aurea spaventosa.
Caricamento...
Diventiamo amici di penna? ✒️
Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.
Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!