# Code review e propagazione modifiche fra branch git

> Confronto online side-by-side di testi e JSON con algoritmo Myers: 4 modalità (linee, parole, caratteri, JSON struct), export patch diff -u.

Strumento gratuito nel browser (nessun upload): https://www.mauriziofonte.it/strumenti/diff-online

Confronto **side-by-side** di due testi o di due payload JSON con algoritmo di **Myers**. Quattro modalità di confronto: linee, parole, caratteri o struttura JSON parsata. Output disponibile anche come **patch unificato** in formato `diff -u`, applicabile con `git apply` o con il classico comando `patch -p0`: utile per code review, per propagare modifiche fra branch o per generare un changelog tecnico riusabile in pipeline.

## Come usare il diff tool

1. **Incolla i due testi** - Sinistra (Original/left) il testo di partenza, destra (Modified/right) la versione modificata. I campi accettano testo libero, JSON, log, output di comandi, qualsiasi cosa.
2. **Scegli la modalità** - Linee per file di codice o config. Parole per prose o documentazione (rivela meglio le modifiche frammentate). Caratteri per single-line tweaks. JSON per confronto strutturato (gestisce key reorder, nested objects).
3. **Leggi il diff** - Side-by-side: due colonne, sinistra con removed (rosso barrato), destra con added (verde). Inline: una colonna unica con + e - marcati. Stats in cima: caratteri aggiunti, rimossi, invariati.
4. **Esporta in patch** - Il formato patch unificato (`diff -u`) è compatibile con `git apply`, `patch -p0`, code review tool. Copia/scarica per applicare la diff a un repo o per revisione.

## Cosa lo distingue, in pratica

**JSON-aware.** Un diff a livello stringa fra due JSON formattati diversamente produce risultati poco utili: l'80% delle righe risulta cambiato per pure differenze di whitespace o di ordinamento delle chiavi, mentre la modifica logica è una sola. La modalità JSON di questo tool parsifica i due input prima di confrontarli, ignora whitespace e re-serializza il diff con indentazione consistente. Il risultato evidenzia solo le differenze logiche reali fra i due payload.

**Privacy operativa.** Codice, log applicativi, config e JSON di payload reali sono spesso confidenziali: contengono identificatori interni, password in commenti, struttura del modello dati, riferimenti a backend privati. Il calcolo del diff avviene direttamente nel browser sui due testi che incolli, senza che vengano trasferiti a un servizio terzo che potrebbe loggarli o archiviarli.

**Patch unificato standard.** L'output in formato `diff -u` rispetta lo standard POSIX con header `---/+++`, hunk `@@ -L,N +L,N @@` e righe di contesto. È applicabile direttamente con `git apply changes.patch` o con `patch -p0 < changes.patch`, ed è incollabile in qualsiasi code review tool. Niente formato proprietario, niente trial limit per l'export.

## Glossario

- **Myers algorithm**: Algoritmo per il calcolo della longest common subsequence (LCS) e quindi del minimum edit script tra due sequenze. Eugene Myers, 1986. Complessità O(N+M+D^2) con D = numero di edit. Standard de facto per text diff.
- **Patch unificato**: Formato testuale per esprimere le differenze tra due file. Header con nomi, hunk preceduti da `@@ -L,N +L,N @@`, righe modificate prefissate da +/-, righe context senza prefisso. Standard POSIX, applicabile con `patch` o `git apply`.
- **Side-by-side diff**: Visualizzazione a due colonne: sinistra l'originale, destra il modificato. Comune nei code review tool (GitHub, GitLab, Phabricator). Variante: 'inline' o 'split' (terminologia GitHub).
- **JSON structural diff**: Confronto JSON che parse i due input prima del diff, ignorando whitespace e key order. Dipende dall'implementazione: alcune library considerano `{a:1, b:2}` e `{b:2, a:1}` identici, altre no. jsdiff li tratta come diversi (ordine matters).
- **Hunk**: Sezione di un patch unificato che descrive un blocco contiguo di modifiche. Inizia con `@@` e contiene linee di context, +, -. File con molte modifiche distanti = molti hunk separati.

## Domande frequenti

### Posso fare diff di file binari (immagini, PDF, exe)?

No. Questo tool è text-only. Per file binari: `cmp -l a.bin b.bin` mostra i byte diversi a livello shell, oppure tool dedicati come `vbindiff` o `radiff2`. Per immagini: ImageMagick `compare` o tool grafici dedicati.

### Il diff JSON gestisce key order diverso come 'identico'?

No. Il modo JSON di jsdiff parse i due input ma poi serializza con stesso indent e ordine, mostrando le differenze incluso il riordino di chiavi. Per ignorare il key order: prima ordina le chiavi (es. con il JSON formatter del reame), poi confronta. Risultato pulito: solo differenze di valore, niente noise di ordering.

### Funziona offline dopo il primo caricamento?

Si. La libreria jsdiff è caricata via vendor, niente fetch al server. Una volta in cache, il tool funziona senza rete. Bookmark per uso air-gapped.

### Il patch generato è compatibile con git apply?

Si. createPatch() di jsdiff produce output formato unified standard (`diff -u`), con header, hunk, righe context. Direttamente applicabile via `git apply changes.patch` in un repo che ha la versione 'left' come stato corrente. Per altri tool: `patch -p0 < changes.patch` per patch in cima al file.

### C'è un limite di dimensione per gli input?

Il tool non impone un limite fisso. La memoria del tab del browser è il limite. File di 100KB-1MB sono comodi, oltre 5MB l'UI può diventare lenta (Myers è O(N+M+D^2), il D^2 cresce con il delta). Per file enormi: `diff -u file1 file2` a riga di comando è più efficiente.

### Posso fare diff a tre vie (3-way merge)?

Non in V1. jsdiff non implementa 3-way merge. Per quel caso: `git merge-file`, `kdiff3`, `meld` sono i tool standard. Lo aggiungerò come tool dedicato in futuro se la roadmap lo richiede.

### Il modo Words è adatto per documenti tecnici?

Si. È meglio del modo Lines per documentazione e prose (markdown, AsciiDoc) perché una modifica di una parola in mezzo a un paragrafo non viene mostrata come 'tutta la riga cambiata'. Per codice sorgente, Lines resta migliore (gli edit sono per riga).

### Differenze fra Myers e patience diff (git default in alcune config)?

Patience diff è una variante che parte dalle 'unique lines' (righe che appaiono una sola volta in ciascun file) e le usa come ancore. Tipicamente produce diff più leggibili in caso di refactor (riordinamento di blocchi). jsdiff implementa Myers classico. Per codice con grossi refactor, git diff con --patience o --histogram può essere preferibile a un diff Myers puro.

---
Uno strumento di Maurizio Fonte, senior backend engineer. Tutti gli strumenti: https://www.mauriziofonte.it/strumenti/
