Diff Checker: confronta due testi
Come funziona
Incolla il testo originale in Testo A e la versione modificata in Testo B. Lo strumento allinea le due versioni riga per riga e mostra un unico risultato: le righe presenti in A ma non in B sono in rosso con un meno davanti (rimozioni), quelle aggiunte in B sono in verde con un più davanti (aggiunte), quelle invariate restano neutre. Sopra il risultato un contatore riporta i totali. Il confronto lavora sulle righe intere, quindi una riga con una sola parola cambiata compare come una rimozione seguita da un'aggiunta, non come un'evidenziazione dentro la riga.
Il confronto è un diff LCS (longest common subsequence, la sottosequenza comune più lunga) calcolato con la classica tabella di programmazione dinamica. Produce lo stesso insieme minimo di modifiche di `git diff`, `diff -u` e della vista delle pull request di GitHub, che ci arrivano con l'algoritmo di Myers, più veloce. Se cambi una parola a metà di un paragrafo cambia solo quella riga, e il contesto intorno resta fermo.
Funziona allo stesso modo per: • Codice sorgente: vedi cosa è cambiato tra due versioni di una funzione prima del commit • Configurazioni JSON, YAML o TOML: trovi l'unica chiave diversa tra staging e produzione • Testi: confronti due bozze di un articolo, di un contratto o di una mail • Log: metti a confronto due estratti per trovare il punto in cui il comportamento cambia • CSV e TSV: vedi quali righe sono cambiate in un export da foglio di calcolo
Come si comporta nei casi limite: • Spazi finali e differenze CRLF/LF vengono segnalati, perché cambiano i caratteri della riga. Non c'è un'opzione per ignorare gli spazi: se ti interessano solo le modifiche vere, ripulisci il testo prima di incollarlo. • Le righe lunghe vanno a capo solo a video: per il diff restano una sola riga logica. • Indentazione mista (tab e spazi) risulta come differenza. Uniforma un lato all'altro se vuoi vedere solo le modifiche di contenuto. • L'a capo finale: se un testo termina con un a capo e l'altro no, l'ultima riga risulta diversa, come con `diff -u`.
Tutto il confronto gira in JavaScript nel tuo browser. Due file da 5.000 righe si confrontano in molto meno di un secondo su un portatile recente; su uno smartphone lo stesso confronto richiede 1–3 secondi.
Domande frequenti
Che algoritmo di diff usa?
- Un diff LCS (longest common subsequence), calcolato con la classica tabella di programmazione dinamica. Restituisce l'insieme minimo di modifiche tra i due testi, lo stesso risultato che `git diff`, `diff -u` di GNU e la vista delle pull request di GitHub ottengono con l'algoritmo di Myers, quindi quello che vedi qui corrisponde a quello che vedresti in locale.
Posso confrontare due file di codice?
- Sì. Lo strumento non guarda il linguaggio: incolla due versioni di un file JavaScript, Python, Go o SQL e le confronta riga per riga come fa `git diff`. Non è un diff sintattico (non sa che una riga è JSON e un'altra HTML), ma per rivedere il codice il confronto per righe è quasi sempre quello che serve.
Come ignoro le differenze di spazi?
- Ripulisci il testo prima di incollarlo: togli gli spazi a fine riga, uniforma tab e spazi e usa gli stessi a capo (LF o CRLF) su entrambi i lati. Lo strumento non ha un'opzione per ignorare gli spazi e confronta sempre i caratteri esatti di ogni riga.
Che differenza c'è tra diff per righe e diff per parole?
- Il diff per righe tratta ogni riga come un blocco unico, quindi basta un carattere diverso per segnare tutta la riga come cambiata. Il diff per parole (o per caratteri) evidenzia solo i pezzi diversi dentro la riga. Questo strumento fa un diff per righe: cambia un carattere e la riga risulta rimossa e poi aggiunta, senza evidenziazione interna.
Perché le righe vuote risultano diverse?
- Perché lo sono. Una riga vuota in una posizione di Testo A, dove in Testo B c'è una riga piena o nessuna riga, è una differenza reale e lo strumento la mostra. La prima volta sorprende, ma è corretto: i caratteri invisibili contano nell'indentazione di Python, nella struttura di un file YAML e nei messaggi di commit di Git.
Quanto possono essere grandi i testi da confrontare?
- Non c'è un limite fisso, perché tutto gira nel browser. La tabella LCS cresce come N×M per testi di N e M righe, quindi due testi da 100.000 righe richiedono un tempo sensibile (circa 30–60 secondi su un portatile recente). Per file enormi, come due log da 50 MB, usa uno strumento desktop: una scheda del browser non è il posto giusto.
Il testo che incollo viene inviato da qualche parte?
- No. L'algoritmo gira interamente nel tuo browser, e nella scheda Rete degli strumenti per sviluppatori non vedi nessuna richiesta mentre incolli e confronti. Conta quando confronti file di configurazione con credenziali, contratti o codice coperto da NDA.
Tipi di diff: a cosa risponde ogni confronto
Modi diversi di confrontare due testi. Il diff per righe di questo strumento è il più comune, ma conoscere le alternative aiuta a scegliere lo strumento giusto.
| Tipo | Unità di confronto | Ideale per | Esempio d'uso |
|---|---|---|---|
| Diff per righe (questo strumento) | Una riga alla volta | Codice, configurazioni, log strutturati | Rivedere un commit o una pull request |
| Diff per parole | Parole dentro una riga | Testi, modifiche a un solo paragrafo | Confrontare due versioni di un paragrafo |
| Diff per caratteri | Ogni carattere | Stringhe corte, nomi, ID | Trovare un refuso di una lettera |
| Diff affiancato | Righe su due colonne | Revisione del codice con tutto il contesto | git diff --side-by-side |
| Diff unificato | Una colonna con marcatori @@ | File di patch, revisione da terminale | git diff (predefinito), patch -p1 |
| Diff semantico | Conosce la struttura del linguaggio | Refactoring senza il rumore degli spazi | diff-so-fancy, difftastic |
| Merge a 3 vie | Originale più due modifiche | Risolvere i conflitti tra branch | Conflitti di git merge |
| Diff binario | Byte per byte | Eseguibili, immagini, archivi | bsdiff, xdelta (non testuali) |
I diff testuali si basano quasi sempre sull'algoritmo di Myers (1986) o su quello di Hunt-McIlroy (1976, il `diff` originale di Unix). Git usa Myers, con le euristiche patience e histogram per un risultato più leggibile su codice molto modificato.