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.txtSe 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.
$:> echo "this is a diff example" > diff_test.txtL'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 exampleEsaminiamo ora una suddivisione piรน dettagliata dell'output delle differenze.
1. Input comparativo
diff --git a/diff_test.txt b/diff_test.txtQuesta 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 100644Questa 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.txtQueste 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 exampleLa 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 exampleOra 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 exampleOra 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 differGit 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 -stdoutQuindi 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=pdfconvUna 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/fileQuesto 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/fileQuando 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 diffConfronto 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 ce489262a1ee34340440e55a0b99ea6918e19e7aConfronto 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-branchQuesto 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-branchL'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.txtRiepilogo
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.