Aggiungi 'docs/06-gestione-conflitti-merge.md'

This commit is contained in:
2025-12-05 10:25:37 +01:00
parent 83dc58640a
commit 724ac65cf6
+203
View File
@@ -0,0 +1,203 @@
<!-- File: 06-gestione-conflitti-merge.md -->
# Gestione dei conflitti di merge (Git Meridiana)
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:
```bash
git checkout development
git merge feature/nuovo-report
```
Oppure:
```bash
git pull # (equivalente a fetch + merge)
```
2. Git mostra qualcosa del genere:
```text
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:
```text
<<<<<<< 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:
```python
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**
```bash
git status
```
Esempio:
```text
Unmerged paths:
both modified: src/report.py
```
2. **Apri i file in conflitto** con il tuo editor/IDE
(es. VS Code, IntelliJ, ecc. spesso hanno strumenti grafici per i merge).
3. **Riscrivi il codice nei blocchi segnati**:
* scegli una versione
* oppure integra le due versioni in qualcosa di coerente
* **rimuovi i marker** (`<<<<<<<`, `=======`, `>>>>>>>`)
4. **Segna il conflitto come risolto** aggiungendo il file allo staging:
```bash
git add src/report.py
```
5. **Completa il merge con un commit** (se Git non lo fa automaticamente):
```bash
git commit
# oppure (se Git ha già un messaggio pronto)
git commit --no-edit
```
6. Infine, se serve, **push**:
```bash
git push
```
---
## Se qualcosa va storto: annullare il merge
Se durante il merge ti accorgi che stai combinando guai:
```bash
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`.
```bash
# 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:
```bash
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 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