Diff e Merge: Confrontare Codice Efficacemente
Diff e merge: come confrontare codice efficacemente. Git diff, tool visuali, risoluzione conflitti. Guida pratica per developer e team di sviluppo oggi.
Capire Diff e Merge
Confrontare codice e unire modifiche è fondamentale nello sviluppo software. Che tu stia revisionando pull request, debuggando problemi o risolvendo conflitti, capire come funzionano gli algoritmi diff e merge ti rende uno sviluppatore più efficace. Questa guida copre la teoria, gli strumenti e le tecniche pratiche per confrontare e unire codice efficacemente.
Come Funzionano gli Algoritmi Diff
La Longest Common Subsequence (LCS)
La maggior parte dei tool diff usa l'algoritmo LCS per trovare similarità tra file. L'algoritmo identifica la sequenza più lunga di righe che appaiono in entrambe le versioni, poi marca tutto il resto come aggiunte o eliminazioni.
Originale:
1. function hello() {
2. console.log("Hello");
3. return true;
4. }
Modificato:
1. function hello() {
2. console.log("Hello, World");
3. console.log("Goodbye");
4. return true;
5. }
Risultato Diff:
function hello() {
- console.log("Hello");
+ console.log("Hello, World");
+ console.log("Goodbye");
return true;
}
Tipi di Output Diff
Unified Diff
Il formato più comune, mostra il contesto con marcatori +/-:
--- a/file.js
+++ b/file.js
@@ -1,4 +1,5 @@
function hello() {
- console.log("Hello");
+ console.log("Hello, World");
+ console.log("Goodbye");
return true;
}
Diff Side-by-Side
Mostra le versioni vecchia e nuova in colonne parallele, rendendo più facile confrontare grandi modifiche visivamente.
Diff a Livello di Parola
Evidenzia modifiche specifiche di parole all'interno delle righe, utile per prose o file di configurazione:
- console.log("Hello");
+ console.log("Hello, [World]");
Comandi Git Diff
Confronti Base
# Confronta directory di lavoro con ultimo commit
git diff
# Confronta modifiche staged
git diff --staged
# Confronta due commit
git diff abc123..def456
# Confronta branch
git diff main..feature-branch
# Confronta file specifico
git diff HEAD~3 -- src/app.js
Opzioni Diff Utili
# Diff a livello di parola (utile per prose)
git diff --word-diff
# Mostra solo nomi file
git diff --name-only
# Mostra statistiche (file modificati, inserimenti, eliminazioni)
git diff --stat
# Ignora modifiche whitespace
git diff -w
# Mostra contesto funzione
git diff -p
Confrontare Branch Prima del Merge
# Vedi cosa sarà mergiato
git diff main...feature-branch
# Lista commit che saranno mergiati
git log main..feature-branch --oneline
# Mostra file che cambieranno
git diff main...feature-branch --name-only
Three-Way Merge
Capire il Three-Way Merge
Quando si mergiano branch, Git usa tre versioni:
- Base: L'antenato comune di entrambi i branch
- Ours: Il branch corrente (solitamente main)
- Theirs: Il branch che viene mergiato
Base (antenato comune)
/ \
Ours Theirs
(main) (feature-branch)
\ /
Risultato Merge
Come Avvengono i Conflitti di Merge
I conflitti avvengono quando entrambi i branch modificano le stesse righe diversamente dalla base:
// Versione Base
function greet(name) {
return "Hello, " + name;
}
// Ours (main)
function greet(name) {
return `Hello, ${name}!`; // Cambiato in template literal
}
// Theirs (feature)
function greet(name) {
return "Hi, " + name; // Cambiata parola di saluto
}
// Git non può mergiare automaticamente - entrambi hanno cambiato la stessa riga
Risolvere Conflitti di Merge
Marcatori di Conflitto
Git marca i conflitti con marcatori speciali:
<<<<<<< HEAD
return `Hello, ${name}!`;
=======
return "Hi, " + name;
>>>>>>> feature-branch
Strategie di Risoluzione
# Accetta versione branch corrente
git checkout --ours filename.js
# Accetta versione branch incoming
git checkout --theirs filename.js
# Modifica manuale (più comune)
# 1. Apri file, rimuovi marcatori conflitto
# 2. Tieni il codice che vuoi
# 3. Stage e commit
git add filename.js
git commit -m "Risolvi conflitto merge in filename.js"
Usare Merge Tool
# Configura merge tool
git config --global merge.tool vscode
# Lancia merge tool
git mergetool
# Merge tool popolari:
# - VS Code (built-in)
# - IntelliJ/WebStorm
# - Beyond Compare
# - Meld
# - KDiff3
Workflow Diff Pratici
Workflow Code Review
# Prima di revisionare una PR, vedi il diff completo
git fetch origin
git diff main..origin/feature-branch
# Revisiona tipi specifici di modifiche
git diff main..origin/feature-branch -- "*.js" # Solo file JS
git diff main..origin/feature-branch -- "*.test.js" # Solo test
Conclusione
Padroneggiare diff e merge è essenziale per qualsiasi sviluppatore che lavora in team. Capire come funzionano questi strumenti ti aiuta a revisionare codice più efficacemente, risolvere conflitti con sicurezza e mantenere una cronologia di progetto pulita.