4.6 KiB
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
developmentviene aggiornato da un collega - Tu lavori su
feature/nuovo-reportpartendo da una versione vecchia didevelopment - Quando fai il merge di
developmento il merge della feature, Git non sa quale versione tenere → conflitto
Quando si verificano i conflitti
Situazioni classiche:
- Stai facendo un merge:
git checkout development
git merge feature/nuovo-report
Oppure:
git pull # (equivalente a fetch + merge)
- 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 dell’altra 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
- Vedi quali file sono in conflitto
git status
Esempio:
Unmerged paths:
both modified: src/report.py
-
Apri i file in conflitto con il tuo editor/IDE (es. VS Code, IntelliJ, ecc. – spesso hanno strumenti grafici per i merge).
-
Riscrivi il codice nei blocchi segnati:
- scegli una versione
- oppure integra le due versioni in qualcosa di coerente
- rimuovi i marker (
<<<<<<<,=======,>>>>>>>)
-
Segna il conflitto come risolto aggiungendo il file allo staging:
git add src/report.py
- 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
- 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
development→master - nei
hotfix/*che partono damastere poi vanno riportati sudevelopment
La logica di risoluzione rimane sempre la stessa:
- controlli con
git status - sistemi i file
git addgit commitper 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
Mergetool visuale git mergetool: apre uno strumento esterno configurato
Per iniziare:
- va benissimo risolvere a mano nei file
- oppure usare l’editor grafico che già usi per sviluppare