Close

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.

Branch Git
materiale correlato

Branch Git

Logo di Bitbucket
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.

Le persone collaborano utilizzando una parete piena di strumenti

Blog di Bitbucket

Illustrazione su Devops

Percorso di apprendimento DevOps

Funzione Demo Den per demo con esperti Atlassian

Come Bitbucket Cloud funziona con Atlassian Open DevOps

Iscriviti alla nostra newsletter DevOps

Thank you for signing up