Diff e Merge: Confrontare Codice Efficacemente

THEJORD Team1 min di lettura
diffmergegitsviluppotools

Diff e merge: come confrontare codice efficacemente. Git diff, tool visuali, risoluzione conflitti. Guida pratica per developer e team di sviluppo oggi.

Diff e Merge: Confrontare Codice Efficacemente

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.