git diff
Il controllo delle differenze è una funzione che accetta due set di dati di input e restituisce le modifiche tra di essi. git diff
è un comando Git multiuso che, quando eseguito, esegue una funzione diff sulle sorgenti dati Git. Queste sorgenti dati possono essere commit, branch, file e altro ancora. Questo documento illustrerà gli utilizzi comuni di git diff
e i diversi schemi di flusso di lavoro. Il comando git diff
viene spesso usato insieme a git status
e git log
per analizzare lo stato corrente di un repository Git.
Differenze di lettura: output
Formato di output raw
I seguenti esempi verranno eseguiti in un semplice repository. Il repository viene creato con i seguenti comandi:
$:> mkdir diff_test_repo
$:> cd diff_test_repo
$:> touch diff_test.txt
$:> echo "this is a git diff test example" > diff_test.txt
$:> git init .
Initialized empty Git repository in /Users/kev/code/test/.git/
$:> git add diff_test.txt
$:> git commit -am"add diff test file"
[main (root-commit) 6f77fc3] add diff test file
1 file changed, 1 insertion(+)
create mode 100644 diff_test.txt
Se eseguiamo git diff
a questo punto, non ci sarà alcun output. Questo è un comportamento previsto in quanto non ci sono modifiche nel repository a diff. Una volta creato il repository e aggiunto il file diff_test.txt
, possiamo modificare il contenuto del file per iniziare a sperimentare con l'output diff.
materiale correlato
Branch Git
Scopri la soluzione
Impara a utilizzare Git con Bitbucket Cloud
$:> echo "this is a diff example" > diff_test.txt
L'esecuzione di questo comando cambierà il contenuto del file diff_test.txt
. Una volta modificato, possiamo visualizzare un diff e analizzare l'output. Ora l'esecuzione di git diff
produrrà il seguente risultato:
diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example
Esaminiamo ora una suddivisione più dettagliata dell'output delle differenze.
1. Input comparativo
diff --git a/diff_test.txt b/diff_test.txt
Questa riga mostra le sorgenti di input del diff. Possiamo vedere che a/diff_test.txt
e b/diff_test.txt
sono stati passati al diff.
2. Metadati
index 6b0c6cf..b37e70a 100644
Questa riga mostra alcuni metadati Git interni. Molto probabilmente non avrai bisogno di queste informazioni. I numeri in questo output corrispondono agli identificatori hash della versione dell'oggetto Git.
3. Indicatori per le modifiche
--- a/diff_test.txt
+++ b/diff_test.txt
Queste righe sono una legenda che assegna simboli a ciascuna sorgente di input differenziale. In questo caso, le modifiche da a/diff_test.txt
sono contrassegnate da —
e le modifiche da b/diff_test.txt
sono contrassegnate dal simbolo +++
.
4. Blocchi di diff
Il risultato differenziale rimanente è un elenco di «blocchi» di diff. Un diff mostra solo le sezioni del file che sono state modificate. Nel nostro esempio attuale, abbiamo solo un blocco, poiché stiamo lavorando con uno scenario semplice. I blocchi hanno una propria semantica granulare di output.
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example
La prima riga è l'intestazione del blocco. Ogni blocco è preceduto da un'intestazione racchiusa tra i simboli @@
. Il contenuto dell'intestazione è un riepilogo delle modifiche apportate al file. Nel nostro esempio semplificato, abbiamo -1 +1, che significa che la prima riga presenta delle modifiche. In una differenza più realistica, vedrai un'intestazione del tipo:
@@ -34,6 +34,8 @@
In questo esempio di intestazione, sono state estratte 6 righe a partire dalla riga numero 34. Inoltre, sono state aggiunte 8 righe a partire dalla riga numero 34.
Il contenuto rimanente del blocco diff mostra le modifiche recenti. Ogni riga modificata è preceduta da un simbolo +
o -
che indica da quale versione dell'input diff provengono le modifiche. Come abbiamo detto in precedenza, -
indica le modifiche dal file a/diff_test.txt
e + indica le modifiche da b/diff_test.txt
.
Evidenziazione delle modifiche
1. git diff --color-words
git diff
presenta anche una modalità speciale per evidenziare le modifiche con una granularità molto migliore: ‐color-words
. Questa modalità tokenizza le righe aggiunte e rimosse in base agli spazi bianchi e poi le differenzia.
$:> git diff --color-words
diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
this is agit difftest example
Ora l'output mostra solo le parole con codice colore che sono cambiate.
2. git diff-highlight
Se cloni la sorgente git, troverai una sottodirectory chiamata contrib. Contiene numerosi strumenti relativi a git e altri elementi interessanti che non sono ancora stati promossi a git core. Uno di questi è uno script Perl chiamato diff-highlight. Diff-highlight accoppia le righe corrispondenti di output diff ed evidenzia i frammenti di sottoparole che sono cambiati.
$:> git diff | /your/local/path/to/git-core/contrib/diff-highlight/diff-highlight
diff --git a/diff_test.txt b/diff_test.txt
index 6b0c6cf..b37e70a 100644
--- a/diff_test.txt
+++ b/diff_test.txt
@@ -1 +1 @@
-this is a git diff test example
+this is a diff example
Ora abbiamo ridotto la nostra differenza alla minima modifica possibile.
File binari diversi
Oltre alle utilità per i file di testo che abbiamo finora dimostrato, git diff
può essere eseguito su file binari. Sfortunatamente, l'output predefinito non è molto utile.
$:> git diff
Binary files a/script.pdf and b/script.pdf differ
Git ha una funzione che ti consente di specificare un comando shell per trasformare il contenuto dei tuoi file binari in testo prima di eseguire il diff. Però richiede un po' di configurazione. Innanzitutto, devi specificare un filtro textconv che descriva come convertire un determinato tipo di file binario in testo. Stiamo usando una semplice utilità chiamata pdftohtml (disponibile tramite homebrew) per convertire i miei PDF in codice HTML leggibile dall'uomo. Puoi configurarlo per un singolo repository modificando il tuo file .git/config
, oppure a livello globale, modificando ~ /.gitconfig
[diff "pdfconv"]
textconv=pdftohtml -stdout
Quindi tutto ciò che devi fare è associare uno o più modelli di file al nostro filtro pdfconv. Puoi farlo creando un file .gitattributes
nella directory principale del repository.
*.pdf diff=pdfconv
Una volta configurato, git diff
eseguirà prima il file binario tramite lo script del convertitore configurato ed eseguirà la differenza dell'output del convertitore. La stessa tecnica può essere applicata per ottenere differenze utili da tutti i tipi di file binari, ad esempio: zip, jar e altri archivi: l'uso di unzip -l
(o simile) al posto di pdf2html ti mostrerà i percorsi che sono stati aggiunti o rimossi tra immagini di commit: exiv2 può essere usato per mostrare le modifiche ai metadati come i documenti delle dimensioni delle immagini: esistono strumenti di conversione per trasformare .odf, .doc e altri formati di documenti in testo normale. Se necessario, le stringhe spesso funzionano per i file binari in cui non esiste un convertitore formale.
Confronto di file: file git diff
Al comando git diff
può essere passata un'opzione esplicita per il percorso del file. Quando un percorso del file viene passato a git diff
, l'operazione diff verrà estesa al file specificato. Gli esempi seguenti dimostrano questo utilizzo.
git diff HEAD ./path/to/file
Questo esempio è incluso nell'ambito di . /path/to/file
quando richiamato, confronterà le modifiche specifiche nella directory di lavoro con l'indice, mostrando le modifiche che non sono ancora state eseguite. Per impostazione predefinita, git diff
eseguirà il confronto con HEAD
. Omettendo HEAD
nell'esempio precedente git diff. /path/to/file
ha lo stesso effetto.
git diff --cached ./path/to/file
Quando git diff
viene invocato con l'opzione —cached
, diff confronterà le modifiche temporizzate con il repository locale. L'opzione —cached
è sinonimo di —staged
.
Confronto di tutte le modifiche
Il richiamo di git diff
senza un percorso del file confronterà le modifiche nell'intero repository. Gli esempi specifici dei file riportati qui sopra possono essere richiamati senza l'argomento ./path/to/file
e hanno gli stessi risultati di output su tutti i file nel repository locale.
Modifiche dall'ultimo commit
Per impostazione predefinita, git diff
ti mostrerà tutte le modifiche non salvate dall'ultimo commit.
git diff
Confronto di file tra due commit diversi
Con git diff
si possono passare i riferimenti Git ai commit in diff. Alcuni riferimenti di esempio sono HEAD
, tag e nomi di branch. Ogni commit in Git ha un ID di commit che puoi ottenere quando esegui GIT LOG
. Puoi anche passare questo ID di commit a git diff
.
git log --pretty=oneline
957fbc92b123030c389bf8b4b874522bdf2db72c add feature
ce489262a1ee34340440e55a0b99ea6918e19e7a rename some classes
6b539f280d8b0ec4874671bae9c6bed80b788006 refactor some code for feature
646e7863348a427e1ed9163a9a96fa759112f102 add some copy to body
$:> git diff 957fbc92b123030c389bf8b4b874522bdf2db72c ce489262a1ee34340440e55a0b99ea6918e19e7a
Confronto tra branch
Confronto tra due branch
I branch vengono confrontati come tutti gli altri input di riferimento con git diff
git diff branch1..other-feature-branch
Questo esempio introduce l'operatore punto. I due punti in questo esempio indicano che il diff inserito è la punta di entrambi i branch. Lo stesso effetto si verifica se i punti vengono omessi e viene utilizzato uno spazio tra i branch. Inoltre, c'è un operatore a tre punti:
git diff branch1...other-feature-branch
L'operatore a tre punti avvia diff modificando il primo parametro di input branch1
. Cambia branch1
in un riferimento del commit predecessore comune condiviso tra i due input diff, il predecessore condiviso di branch1
e un altro branch di funzionalità. L'ultimo parametro di input del parametro rimane invariato come la punta di un altro branch di funzionalità.
Confronto di file di due branch
Per confrontare un file specifico tra branch, passa il percorso del file come terzo argomento a git diff
git diff main new_branch ./diff_test.txt
Riepilogo
In questa pagina abbiamo analizzato il processo diff di Git e il comando git diff
. Abbiamo parlato di come leggere l'output di git diff
e i vari dati inclusi nell'output. Sono stati forniti esempi su come modificare l'output di git diff
con evidenziazioni e colori. Abbiamo parlato di diverse strategie, ad esempio come distinguere i file in branch e commit specifici. Oltre al comando git diff
, abbiamo usato anche git log
e git checkout
.
Condividi l'articolo
Argomento successivo
Letture consigliate
Aggiungi ai preferiti queste risorse per ricevere informazioni sui tipi di team DevOps e aggiornamenti continui su DevOps in Atlassian.