Vai al contenuto
LeedyBox
Sostieni

Come funziona il confronto di testi

Un diff risponde a una domanda: che cosa bisogna cambiare per trasformare il primo testo nel secondo? Questa guida spiega come uno strumento diff trova la risposta, come leggere il risultato e come preparare due versioni perché il risultato mostri le modifiche che contano e non il rumore.

Che cosa mostra un diff

La maggior parte degli strumenti diff, compreso Confronto testi di LeedyBox, confronta il testo riga per riga. Ogni riga del risultato è di uno di tre tipi: invariata (presente in entrambe le versioni), rimossa (solo nell’originale) o aggiunta (solo nella nuova versione). Non esiste un tipo «modificata» a parte, quindi una riga in cui hai cambiato una parola compare due volte, una come rimossa e una come aggiunta:

  Dear customer,
- Your order ships on Monday.
+ Your order ships on Tuesday.
  Kind regards

I segni seguono una vecchia convenzione: - per rimossa, + per aggiunta e uno spazio per le righe invariate. I colori, di solito rosso e verde, ripetono la stessa informazione.

Come vengono abbinate le righe

Uno strumento diff cerca la sequenza più lunga di righe che compare in entrambi i testi nello stesso ordine, la sottosequenza comune più lunga. Quelle righe restano invariate; tutte le altre sono segnate come rimosse o aggiunte. Se l’originale è A, B, C, D e il nuovo testo A, C, B, D, la sequenza comune più lunga ha tre righe, per esempio A, B, D, quindi C appare spostata: rimossa in un punto e aggiunta in un altro.

Spesso esistono più risposte ugualmente lunghe, e ogni strumento sceglie a modo suo. Per questo la stessa coppia di file può dare diff leggermente diversi in due programmi. Git usa per impostazione predefinita l’algoritmo di Myers e offre patience e histogram come alternative, che spesso danno risultati più leggibili per il codice con molte righe contenenti solo una parentesi graffa di chiusura.

Trovare la sequenza comune più lunga richiede un lavoro che cresce con il numero di righe di un testo moltiplicato per quello dell’altro. Lo strumento LeedyBox mette prima da parte le righe identiche all’inizio e alla fine, confronta il resto e si ferma con un messaggio se quel prodotto supera 4.000.000, per esempio circa 2.000 contro 2.000 righe diverse.

Leggere l’unified diff di git e delle revisioni del codice

I sistemi di controllo versione mostrano solo le parti modificate di un file, nel formato unified diff:

--- a/config.yml
+++ b/config.yml
@@ -12,4 +12,5 @@
 server:
-  port: 8080
+  port: 8081
+  timeout: 30
 database:

Le righe --- e +++ indicano il vecchio e il nuovo file. L’intestazione del blocco @@ -12,4 +12,5 @@ significa: questo blocco inizia alla riga 12 e copre 4 righe nel vecchio file, e inizia alla riga 12 e copre 5 righe nel nuovo. Alcune righe invariate intorno a ogni modifica, tre per impostazione predefinita, danno il contesto. Gli strumenti che mostrano tutto il testo, come quello di LeedyBox, non hanno intestazioni di blocco perché ogni riga è visibile; per lo stesso motivo il loro risultato non si può applicare come patch.

Preparare i testi per un confronto utile

Un diff confronta caratteri, non significati. Piccole differenze invisibili rendono diverse le righe e possono sommergere le modifiche reali:

  • Spazi e tabulazioni a fine riga, oppure tabulazioni in una versione e spazi nell’altra. Elimina gli spazi finali e usa la stessa indentazione in entrambe.
  • Caratteri invisibili come lo spazio unificatore o lo spazio a larghezza zero, comuni nel testo copiato da pagine web ed elaboratori di testo.
  • Forme Unicode. Una lettera accentata come é può essere memorizzata come un solo carattere o come e più un accento combinante. Il testo proveniente dai nomi dei file di macOS o da alcuni PDF usa spesso la seconda forma.
  • Virgolette tipografiche e lineette. Gli elaboratori di testo sostituiscono " con “ ” e - con –, quindi una copia incollata non corrisponde più al testo semplice originale.
  • Fine riga. Windows termina le righe con CR LF, macOS e Linux con LF. I browser convertono ogni a capo di un campo di testo in LF, quindi questa differenza non compare nello strumento LeedyBox, ma compare negli strumenti che confrontano direttamente i file.
  • Formattazione di dati e codice. Un JSON reindentato o con le chiavi in un altro ordine rende diversa quasi ogni riga. Formatta prima entrambe le versioni allo stesso modo, per esempio con le chiavi ordinate e la stessa indentazione.

Confrontare testi in prosa

In un documento normale un intero paragrafo è spesso una sola riga lunga, quindi una parola modificata segna l’intero paragrafo come rimosso e aggiunto. Aiutano due abitudini. Prima del confronto, metti ogni frase su una riga propria, così risaltano solo le frasi modificate. Oppure usa uno strumento che confronta le parole all’interno delle righe, come git diff --word-diff o la funzione di confronto con revisioni dell’elaboratore di testo.

Il testo copiato da un PDF ha le sue trappole: le righe si interrompono dove le spezzava l’impaginazione e le parole possono essere sillabate a fine riga. Ricomponi le righe di ogni paragrafo prima di confrontarlo con il documento di partenza.

Che cosa un diff per righe non può mostrare

  • Spostamenti. Un paragrafo spostato altrove appare come rimosso in un punto e aggiunto in un altro. Alcuni strumenti, come git con --color-moved, segnano a parte i blocchi spostati.
  • Il significato. Due testi che dicono la stessa cosa con parole diverse risultano completamente diversi, e la modifica di un solo carattere, come un «non» che manca, sembra piccola ma può ribaltare il senso di una frase.
  • Contenuti binari. Documenti Word, PDF e immagini non sono testo semplice. Estrai prima il testo, oppure usa la funzione di confronto del programma che li ha creati.

Privacy quando confronti documenti

Contratti, file di configurazione e log contengono spesso nomi, chiavi o password. Alcuni servizi di confronto online salvano il testo incollato sui loro server, a volte con un link condivisibile. Confronto testi di LeedyBox funziona nel tuo browser e non invia né salva il testo, ma è comunque buona abitudine rimuovere i segreti prima di incollare un file di configurazione in qualsiasi posto.

Domande frequenti

Perché tutto il paragrafo risulta modificato se ho cambiato una sola parola?

Il paragrafo è una sola riga, e un diff per righe confronta righe intere. Dividi il testo in frasi o righe più brevi prima del confronto, oppure usa un confronto per parole.

Posso ignorare le differenze negli spazi?

Lo strumento LeedyBox confronta le righe esattamente. Pulisci prima entrambi i testi, per esempio eliminando gli spazi finali e trasformando le tabulazioni in spazi; per i file, git offre opzioni come --ignore-space-change.

Come confronto due documenti Word?

Word ha una funzione Confronta integrata che mostra anche le modifiche di formattazione. Per confrontare solo il testo, copia il testo dei due documenti in uno strumento di confronto testi.

Che cos’è un merge a tre vie?

Quando due persone modificano lo stesso originale, uno strumento di merge confronta ogni versione con l’originale comune. Le modifiche in punti diversi vengono unite automaticamente; quelle sulla stessa riga vengono segnalate come conflitto, che qualcuno deve risolvere.