Skip to content

Confronta due testi — Diff

Confronta due testi all'istante nel browser. Vista affiancata, evidenziazione parola per parola, esportazione diff unificato, opzioni per ignorare maiuscole/spazi/righe vuote. 100 % browser — nessun upload.

Niente tracciamento Funziona nel browser Gratuito
Tutto il confronto avviene localmente nel tuo browser. Il testo non lascia mai questo dispositivo.
Opzioni da ignorare
Revisionato per parità con l'output di `diff -u`, correttezza dell'LCS intra-riga e accessibilità (ruoli ARIA, annunci di modifica per screen reader, gestione RTL/LTR). — Team Strumenti Testuali di Go-Tools · May 21, 2026

Cos'è il diff di testo?

Il diff di testo è un confronto strutturato fra due documenti testuali che trova il più piccolo insieme di inserimenti e rimozioni capaci di trasformare uno nell'altro. L'output rende visibile il cambiamento: verde per le righe aggiunte, rosso per quelle rimosse, in vista affiancata o nel formato patch unificato (il formato `---/+++/@@` usato da `git`, GitHub e dal comando Unix `patch`).

Sotto il cofano, ogni diff moderno è un algoritmo di sottosequenza comune più lunga (LCS). L'articolo di Eugene Myers del 1986 in O((N+M)D) è l'implementazione canonica efficiente; la programmazione dinamica classica (usata qui, con potatura del prefisso/suffisso comune) è più semplice e funziona benissimo per gli input web tipici. Una volta allineate le righe, le coppie vicine di rimozione + aggiunta passano per un secondo LCS a livello di token, in modo che il renderer evidenzi solo le parole effettivamente cambiate dentro una riga — quello che i revisori chiamano diff intra-riga o parola per parola.

Perché non confrontare le stringhe carattere per carattere? Perché le modifiche raramente sono piatte: inserire una riga a metà di un file da 200 righe sposta tutte quelle sotto. Un `===` ingenuo dichiarerebbe diverse tutte le 199 righe. Il LCS dice la verità: una riga aggiunta, 199 invariate.

Questo strumento esegue tutto il confronto nel tuo browser. Nessun upload, nessun file temporaneo, nessun log. Sicuro per codice proprietario, contratti annotati, log privati e tutto ciò che non vorresti incollare in un server di terze parti. Devi confrontare JSON? Usa il JSON Diff strutturale così l'ordine delle chiavi e gli spazi smettono di essere rumore. Confronto di due config in YAML o CSV? Converti prima con YAML a JSON o JSON a CSV, poi confronta con lo strumento giusto per il formato.

// Two strings that look 'mostly the same' but a naïve check disagrees
const a = 'hello world';
const b = 'hello, world!';

// Character equality
a === b; // false — but only 3 characters actually changed.

// LCS-style diff (this tool, at line + word granularity)
// → 1 line modified, inline highlight: 'hello[, ]world[!]'
// → unified patch:
//   --- original
//   +++ modified
//   @@ -1 +1 @@
//   -hello world
//   +hello, world!

Funzionalità chiave

Affiancato + Unificato

Passa fra la vista visiva a due colonne (per la review umana) e il formato canonico di patch unificato (per `git apply`, strumenti di code review, bug report).

Evidenziazione inline parola per parola

Quando due righe sono appaiate come modificate, solo i token cambiati portano lo sfondo colorato. L'occhio trova la modifica subito invece di scorrere 80 caratteri.

Ignora maiuscole / spazi / righe vuote

Quattro interruttori indipendenti: maiuscole, tutti gli spazi, solo spazi finali, righe vuote. Replica `git diff -i -w -b` in due clic.

Esportazione in diff unificato

Copia un patch `---/+++/@@` pulito con tre righe di contesto. Si incolla diretto in un commento di PR, in un bug report o in `patch -p1`.

100 % nel browser

Gli input non lasciano il dispositivo. Nessun upload, nessuna analitica sul testo. Funziona offline una volta caricata la pagina. Sicuro per codice proprietario e prosa riservata.

Unicode + RTL

Tokenizza sui confini di parola Unicode. Arabo, ebraico e CJK si confrontano puliti; le varianti di fine riga (CRLF, LF, CR) sono tutte normalizzate.

Esempi

Code review — rinominata una variabile

function getUser(id) {
  const u = db.users.find(x => x.id === id);
  return u;
}
function getUser(userId) {
  const u = db.users.find(x => x.id === userId);
  return u;
}

La vista affiancata evidenzia ogni riga toccata dalla rinomina, mentre il diff parola per parola attenua i token invariati così il revisore vede esattamente quale identificatore è cambiato.

Modifica contratto — clausola aggiunta

1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
3. Disputes are resolved in California courts.
1. The service is provided as-is.
2. Either party may terminate with 30 days notice.
2a. Termination notice must be in writing.
3. Disputes are resolved in California courts.

Una sola clausola inserita (riga 2a) è l'unica differenza. Le righe di contesto attorno restano pulite — utile per le revisioni con segno rosso di contratti o policy.

Indagine sui log — tempi di richiesta variati

GET /api/users 200 14ms
POST /api/orders 201 88ms
GET /api/orders/42 200 21ms
GET /api/users 200 14ms
POST /api/orders 201 4200ms
GET /api/orders/42 500 21ms

Cambiano due righe. L'evidenziazione inline mostra la deriva di latenza 88ms → 4200ms e lo status code 200 → 500. Una timeline d'incident già pronta.

Spazi a fine riga — opzione « Ignora spazi finali »

  margin: 0;  
  padding: 0;
  border: none;
  margin: 0;
  padding: 0;
  border: none;

Senza l'opzione, la riga 1 segnala una differenza (spazi finali). Attiva « Ignora spazi / tab finali » e il diff va a zero — lo stesso trucco di `git diff -b`.

Come si usa

  1. 1

    Incolla entrambe le versioni

    Testo originale a sinistra, modificato a destra. Il diff live si renderizza mentre digiti; gli input grandi (>200 KB combinati) passano a un bottone Diff manuale.

  2. 2

    Attiva le opzioni da ignorare che ti servono

    Ignora maiuscole, ignora tutti gli spazi, ignora spazi finali o ignora righe vuote — ognuna indipendente e mantenuta tra le visite.

  3. 3

    Leggi il diff o prendi il patch

    Affiancato per la review umana, Unificato per il formato patch `---/+++/@@`. « Copia diff unificato » manda un patch pulito negli appunti per code review o `patch -p1`.

Trappole comuni del diff

Tutto il file 'modificato' dopo una copia Windows ↔ Unix

Se incolli da Notepad su Windows in un originale editato su Unix, ogni riga mostrerà differenze a causa di \r. Attiva « Ignora spazi / tab finali » per silenziare i caratteri CR.

✗ Errato
Diff: 200 modifications (all because of trailing \r)
✓ Corretto
Ignore trailing spaces / tabs → 2 real changes

Diff di indentazione che urla

Riformattare tab ↔ spazi fa esplodere i diff riga per riga. « Ignora tutti gli spazi » comprime il diff sulle vere modifiche semantiche.

✗ Errato
Diff: 87 modifications (all are indent changes)
✓ Corretto
Ignore all whitespace → 4 actual changes

Paragrafi identici segnalati per via di una riga vuota

Aggiungere o togliere una sola riga vuota in prosa può disallineare un'intera area. « Ignora righe vuote » lo risolve senza toccare i contenuti.

✗ Errato
Diff: paragraph 2 'completely changed' (one blank line moved)
✓ Corretto
Ignore blank lines → no changes in paragraph 2

Il diff dice « identici » ma i file sono diversi

Quasi sempre è un'opzione « Ignora » di maiuscole o spazi rimasta attiva da una sessione precedente. Apri il pannello « Opzioni da ignorare » — ogni interruttore è lì. Disattivali tutti se vuoi un confronto byte-strict.

✗ Errato
0 differences shown, but `cmp` says the files differ
✓ Corretto
Disable all Ignore options → real diff appears

JSON incollato sembra 'tutto cambiato'

Il diff di testo tratta l'ordine delle chiavi come significativo; JSON no. Per payload JSON usa lo strumento dedicato JSON Diff — ignora l'ordine delle chiavi e rispetta la strettezza dei tipi.

✗ Errato
Text diff on JSON: 100% of lines changed (just a key reorder)
✓ Corretto
<a href="/it/tools/json-diff">JSON Diff</a>: 0 differences

Avviso di diff troncato ignorato

Oltre le 5.000 righe per lato l'input viene tagliato. Se compare l'avviso, passa alla riga di comando `diff -u file1 file2` o `git diff --no-index` — entrambi fanno streaming e gestiscono gigabyte.

✗ Errato
Pasted a 20,000-line log — only first 5,000 lines diffed
✓ Corretto
`diff -u a.log b.log` in terminal handles full file

Casi d'uso comuni

Snippet di code review
Butta due versioni di una funzione nei riquadri per vedere d'un colpo una rinomina, un ramo rimosso o una nuova guard clause. L'evidenziazione parola per parola è più veloce di uno scorrimento del diff GitHub per una modifica di una riga.
Redline contratto / policy
Incolla il contratto di ieri contro la revisione di oggi. Le clausole inserite saltano fuori; i paragrafi invariati collassano in grigio. Esporta il patch unificato per la pista di revisione legale.
Indagine timeline log
Confronta la fetta di log pre-incident di un SRE con quella durante l'incident. Latenza, status code e deriva di frequenza emergono subito senza `awk`.
Revisione prosa / bozza
Incolla una bozza e la versione del tuo editor. Il diff parola per parola mostra esattamente quali frasi sono state riscritte — preziosissimo per accettare o rifiutare i cambiamenti uno per uno.
Review di traduzioni
Confronta una vecchia traduzione con una ri-traduzione per verificare che la nuova copia preservi senso, struttura e placeholder. Attiva « Ignora spazi finali » per silenziare il rumore che i traduttori introducono spesso.
Audit di .env / file di config
Confronta due `.env`, `docker-compose.yaml` o file rc di shell. Con « Ignora righe vuote » attiva, il diff si concentra sulle differenze funzionali invece che sul rumore di formattazione.

Dettagli tecnici

LCS con potatura prefisso/suffisso
Le righe comuni in testa e in coda vengono rimosse prima di eseguire l'LCS per programmazione dinamica. Un diff fra 'due config da 2.000 righe con una sola riga cambiata' collassa in una tabella DP 1×1 e si renderizza in meno di un millisecondo.
Diff intra-riga a livello di token
Le hunk adiacenti di rimozione + aggiunta vengono appaiate e tokenizzate tramite sequenze Unicode di parola/non-parola/spazio. Un secondo passaggio di LCS produce le porzioni verdi/rosse che rendono leggibili le righe modificate.
Diff unificato compatibile git/patch
L'output segue il formato `---/+++/@@ -L,C +L,C @@` definito per GNU patch e usato da Git, GitHub e ogni strumento di code review. Si applica con `pbpaste | patch -p0`.
Tetto di input 5.000 righe per lato
Oltre il tetto il diff tronca e avvisa. Per input da diversi MB usa `diff -u` da riga di comando o `git diff --no-index` — fanno streaming e gestiscono gigabyte.

Buone pratiche

Scegli le opzioni da ignorare prima di leggere
Rumore da spazi finali, CRLF e maiuscole affoga il segnale. Attiva subito le opzioni giuste; il diff diventa molto più leggibile e smetti di allenarti a saltare modifiche 'finte'.
Unificato per condividere, Affiancato per revisionare
Le colonne visive sono per i tuoi occhi. I patch unificati sono per i terminali altrui. Un diff unificato copiato si infila in un messaggio Slack, in un commento Jira o in `patch -p1` senza traduzioni.
Verifica con il % di somiglianza
Se due file sono 'quasi uguali' ma la somiglianza marca 30 %, hai un problema di fine riga o di spazi. Attiva « Ignora tutti gli spazi » e ricontrolla prima di leggere il diff.

Domande frequenti

Il testo che incollo viene inviato al vostro server?
No. Ogni confronto gira in JavaScript dentro il tuo browser. Il testo non viene caricato, registrato, salvato su disco né inviato a terze parti. Nel localStorage finiscono solo le preferenze di interfaccia (modalità di vista e opzioni « Ignora »), così la pagina le ricorda alla visita successiva — mai il testo. Puoi verificarlo aprendo DevTools → Rete: zero richieste quando clicchi Diff.
Qual è la differenza tra diff di testo e diff JSON?
Il diff di testo confronta riga per riga — perfetto per prosa, codice, log, contratti, file di configurazione. JSON Diff capisce il modello dati di JSON: l'ordine delle chiavi è irrilevante, i tipi sono stretti, gli array si possono appaiare per chiave. Se incolli JSON in un diff di testo, riordini di chiavi e differenze di spazi verranno segnalati come modifiche; JSON Diff li ignora. Usa il diff di testo per contenuto non strutturato e JSON Diff per risposte API e payload di configurazione.
Come ignoro spazi, maiuscole o righe vuote?
Clicca sul pannello « Opzioni da ignorare » sopra il diff. « Ignora maiuscole/minuscole » rende A e a equivalenti. « Ignora tutti gli spazi » comprime ogni spazio, tab e a-capo prima del confronto. « Ignora spazi / tab finali » rimuove solo lo spazio a fine riga — comportamento standard di `git diff -b`. « Ignora righe vuote » scarta righe vuote o con soli spazi prima del diff. Ogni opzione è indipendente e si conserva tra le visite.
Cos'è un diff unificato (e quando lo si copia)?
Un diff unificato è il formato testuale `---/+++/@@` usato da `patch`, `git apply`, dalle PR di GitHub e dalla maggior parte degli strumenti di code review. Clicca « Copia diff unificato » per ottenere un patch con tre righe di contesto attorno a ogni modifica — incollalo in un bug report, in un commento di code review o in un comando `patch -p1` e si applica pulito. La vista affiancata è per gli umani, il diff unificato è per le macchine (e per i revisori che ragionano come macchine).
Perché il diff mostra righe intere modificate se ho cambiato una sola parola?
Non è così — guarda meglio. L'intera riga è evidenziata perché qualcosa al suo interno è cambiato, ma dentro l'evidenziazione solo i token modificati portano lo sfondo vivace (verde per aggiunti, rosso barrato per rimossi). È il diff intra-riga parola per parola: il contesto resta leggibile mentre l'occhio si posa sulla modifica esatta. Se due righe consecutive sono state modificate, entrambe mostreranno l'evidenziazione inline.
Come vengono gestiti i fine riga CRLF e LF?
Entrambi sono riconosciuti. Il diff divide su \r\n, \n e \r isolato, quindi CRLF di Windows, LF di Unix e CR del vecchio Mac si allineano correttamente. Se vuoi segnalare specificamente cambi di fine riga, lascia disattiva « Ignora spazi / tab finali » — il \r affiorerà come carattere finale. Per eliminare del tutto il rumore dei fine riga attiva « Ignora tutti gli spazi ».
Quanto possono essere grandi i due input?
Il diff gira sul thread principale, quindi il limite pratico è circa 5.000 righe o 1 MB per lato; oltre questo soglia troncamento e avviso. Il diff live si disattiva sopra i 200 KB combinati e passa a un bottone Diff manuale. Per file da diversi MB, usa `diff -u` da riga di comando o `git diff --no-index` — fanno streaming e gestiscono gigabyte.
E per il diff di codice? Riconosce il mio linguaggio?
Il diff è agnostico rispetto al linguaggio: vede righe e token, non sintassi. È un vantaggio per snippet di review, edit di configurazione e patch incollati. Se vuoi un diff semantico di codice (funzione rinominata tra file, livello AST) usa git, la vista PR di GitHub o uno strumento dedicato di diff strutturale. Per il 90 % delle situazioni di code review — esaminare una funzione, confrontare due snippet — il diff riga + parola è quello che ti serve.
Perché una singola modifica appare a volte come una riga rimossa più una riga aggiunta?
Quando una riga è cambiata troppo perché l'evidenziazione parola per parola sia utile, il diff la riporta come righe separate di rimozione + aggiunta per mantenere pulita la struttura. La stessa euristica produce output leggibile per riscritture in prosa e blocchi di codice riscritti invece che modificati. Passa alla vista Unificato per vedere la classica coppia `-`/`+` usata nei patch.
Come si calcola la percentuale di somiglianza?
È il numero di righe invariate (dopo aver applicato le opzioni « Ignora ») diviso per il maggiore dei due conteggi di righe, limitato al 100 %. Due input identici fanno 100 %. Aggiungere una nuova riga a un file di 100 righe dà 99 %. Sostituire ogni riga dà 0 %. Utile per giudicare al volo se è « una piccola modifica o una riscrittura completa » prima ancora di leggere il diff.
Posso condividere un diff con un collega?
Sì, in due modi. (1) Clicca « Copia diff unificato » e incolla il patch in chat, su Slack o in un commento di PR — chiunque abbia un terminale può fare `patch < clip`. (2) Fai uno screenshot del pannello affiancato per la review visiva. Deliberatamente non offriamo un bottone « condividi via URL »: richiederebbe l'upload del testo, cosa che non facciamo.
Il diff gestisce lingue da destra a sinistra come arabo o ebraico?
Sì per il contenuto testuale — righe e token sono Unicode-aware. L'interfaccia usa direzioni CSS logiche, perciò nei locale RTL la canalina e le colonne delle righe si invertono in modo naturale. Dentro una cella di diff la direzione del testo segue il contenuto, quindi le stringhe in arabo ed ebraico vengono rese correttamente mentre i marcatori +/- restano allineati alla canalina.

Strumenti correlati

Vedi tutti gli strumenti →