Files
git-cheatsheet-ita/docs/06-gestione-conflitti-merge.md
T

4.6 KiB
Raw Blame History

Gestione dei conflitti di merge

I conflitti di merge in Git capitano quando due branch hanno modificato le stesse righe dello stesso file in modo diverso.

Esempio tipico:

  • Branch development viene aggiornato da un collega
  • Tu lavori su feature/nuovo-report partendo da una versione vecchia di development
  • Quando fai il merge di development o il merge della feature, Git non sa quale versione tenere → conflitto

Quando si verificano i conflitti

Situazioni classiche:

  1. Stai facendo un merge:
git checkout development
git merge feature/nuovo-report

Oppure:

git pull       # (equivalente a fetch + merge)
  1. Git mostra qualcosa del genere:
Auto-merging src/report.py
CONFLICT (content): Merge conflict in src/report.py
Automatic merge failed; fix conflicts and then commit the result.

Come appaiono i conflitti nel file

Aprendo il file in conflitto (es. src/report.py) troverai blocchi tipo:

<<<<<<< HEAD
def calcola_totale(dati):
    # versione su development
    totale = sum(dati)
    return totale
=======
def calcola_totale(dati):
    # versione sulla tua feature branch
    totale = sum(dati) + 10  # aggiunta bonus
    return totale
>>>>>>> feature/nuovo-report
  • <<<<<<< HEAD → la versione della branch su cui sei (es. development)
  • ======= → separatore
  • >>>>>>> feature/nuovo-report → la versione dellaltra branch (es. feature/nuovo-report)

Devi modificare a mano questo blocco, scegliendo cosa tenere (o unendo le due versioni) e poi rimuovere i marker <<<<<<<, =======, >>>>>>>.

Esempio di risultato finale dopo la risoluzione:

def calcola_totale(dati):
    # unisco le logiche: somma + bonus solo in alcuni casi
    totale = sum(dati)
    if len(dati) > 10:
        totale += 10  # bonus
    return totale

Passi base per risolvere un conflitto

  1. Vedi quali file sono in conflitto
git status

Esempio:

Unmerged paths:
  both modified:   src/report.py
  1. Apri i file in conflitto con il tuo editor/IDE (es. VS Code, IntelliJ, ecc. spesso hanno strumenti grafici per i merge).

  2. Riscrivi il codice nei blocchi segnati:

    • scegli una versione
    • oppure integra le due versioni in qualcosa di coerente
    • rimuovi i marker (<<<<<<<, =======, >>>>>>>)
  3. Segna il conflitto come risolto aggiungendo il file allo staging:

git add src/report.py
  1. Completa il merge con un commit (se Git non lo fa automaticamente):
git commit
# oppure (se Git ha già un messaggio pronto)
git commit --no-edit
  1. Infine, se serve, push:
git push

Se qualcosa va storto: annullare il merge

Se durante il merge ti accorgi che stai combinando guai:

git merge --abort

Questo comando:

  • annulla il merge in corso
  • riporta la working directory allo stato precedente al git merge

Funziona finché non hai completato il merge con un commit.


Esempio completo: integrare development in una feature

Scenario: stai lavorando su feature/nuovo-report e vuoi allinearti agli ultimi cambi di development.

# 1. Assicurati di essere sulla feature
git checkout feature/nuovo-report

# 2. Scarica le ultime modifiche dal server
git fetch origin

# 3. Fai il merge della branch remote development nella tua feature
git merge origin/development

Se ci sono conflitti:

git status           # vedi i file in conflitto
# apri e risolvi i file
git add file1 file2  # marca i conflitti come risolti
git commit           # completa il merge
git push             # aggiorna la feature sul server

Master vs Development

  • master

    • branch di produzione (codice rilasciato)
  • development

    • branch di integrazione dello sviluppo

Conflitti possono capitare:

  • nel merge di feature/*development
  • nel merge di developmentmaster
  • nei hotfix/* che partono da master e poi vanno riportati su development

La logica di risoluzione rimane sempre la stessa:

  1. controlli con git status
  2. sistemi i file
  3. git add
  4. git commit per chiudere il merge

Strumenti grafici (facoltativo)

Molti IDE/editors aiutano coi conflitti:

  • VS Code: evidenzia i blocchi e ti offre pulsanti “Accept Current / Accept Incoming / Accept Both”
  • IDE JetBrains (IntelliJ, PyCharm, ecc.): hanno Merge tool visuale
  • git mergetool: apre uno strumento esterno configurato

Per iniziare:

  • va benissimo risolvere a mano nei file
  • oppure usare leditor grafico che già usi per sviluppare