Capire meglio il contenuto dei commit durante un conflitto di merge in Git


Lezione 44 / 53

Capire meglio il contenuto dei commit durante un conflitto di merge in Git

Di Luca Ferretti


git guida git guida git italiano

Durante la risoluzione di un conflitto di merge in Git è particolarmente rilevante capire cosa è successo nelle due diverse versioni e se e come i due diversi contenuti possono essere riconciliati.

Le due versioni potrebbero, infatti, contenere codice che si comporta in maniera molto diversa ed è importante capire cosa si sta approvando prima di procedere.

Un primo suggerimento è quello di configurare il proprio Git per usare lo stile “diff3” per i conflitti di merge.

Se torniamo all’esempio precedente, eseguendo git config merge.conflictstyle diff3 prima di lanciare git merge, i marker aggiunti da Git per evidenziare i contenuti in conflitto cambiano:

$ git config merge.conflictstyle diff3
$ git merge new_branch_to_merge_later
$ cat merge.txt
<<<<<<< HEAD
initial content to edit later
content added to previous
||||||| 0a99708
initial content to edit later
=======
new content to merge later
>>>>>>> merge-me

Rispetto alla versione precedente abbiamo:

  • tra ||||||| e ======= il contenuto nel commit genitore comune ai due commit in conflitto
  • tra <<<<<<< e ||||||| la versione nel branch “current”
  • tra ======= e >>>>>>> la versione nel branch “incoming”

Sempre nell’ottica del capire su cosa si sta mettendo mano, potrebbe risultare anche utile controllare i messaggi di commit dei rispettivi branch tramite git log --merge, magari usando l’opzione -p che mostra anche i diff dei due commit

$ git log --merge -p merge.txt
commit 90640eb2ecab9ec63fcad24817a314df344e024c (HEAD -> main)
Author: Frank <frank@example.com>
Date:   Sat Jan 14 23:33:22 2023 +0100

    appended content to merge.txt

diff --git a/merge.txt b/merge.txt
index 3480007..c560b6f 100644
--- a/merge.txt
+++ b/merge.txt
@@ -1 +1,2 @@
initial content to edit later
+content added to previous

commit 15416df402028b78858105c84d49a86fee59e2e3 (merge-me)
Author: Me <me@example.com>
Date:   Sat Jan 14 23:31:09 2023 +0100

    edited the content for conflict

diff --git a/merge.txt b/merge.txt
index 3480007..202af08 100644
--- a/merge.txt
+++ b/merge.txt
@@ -1 +1 @@
-initial content to edit later
+new content to merge later


Da non dimenticare, poi, che molti IDE, editor di testo per web developers e applicazioni GUI per Git offrono modalità visive più accattivanti per capire le esatte differenze tra due commit in conflitto.

Modificare file in conflitto con VSCode

Modificare file in conflitto con VSCode

Aprendo un file che è in conflitto, l’editor VSCode riconosce ed evidenzia i marker di conflitto e offre varie opzioni per risolvere il conflitto.

Modificare file in conflitto con VSCode

Modificare file in conflitto con VSCode
 

È anche disponibile una speciale vista che permette di avere davanti sia le due versioni “originali”, sia la versione che si sta riscrivendo.

NOTA: è interessante notare come mentre Git usa ours e their , alcune UI di Git hanno optato per l’uso rispettivo di “current” e “incoming”, che abbiamo preso in prestito per questa guida. Non dimenticare che l’azione di merge di due branch ha un “verso”. Da questo punto di vista la nomenclatura current/incoming risulta più esplicita nel caso in cui, per esempio, si sta facendo un merge su main di un branch su cui ci sono commit “nostri” e il conflitto è con commit fatti da altri sviluppatori: in tal caso infatti per Git sarebbero ours i commit di altri già su main e theirs i propri commit sul branch.

Una volta risolto il conflitto, il risultato sarà una nuova versione del file e, in particolare, una nuova versione di quel gruppo di righe e, alla fine del merge, si dovrà controllare che il codice sia ancora corretto e funzionante.

È sempre importante capire, quindi, cosa si sta accettando durante la risoluzione di un conflitto di merge, ma soprattutto è anche importante sapere quando è opportuno interrompere il merge e tornare sui propri passi, magari consultando il collega o i colleghi per capire insieme quale versione delle modifiche sarà alla fine quella che andrà inclusa nel repository

Guida Git in italiano 1 Che cos'è Git? 2 Nascita di Git 3 Principali caratteristiche di Git 4 Riga di comando e UI in Git 5 Come Installare Git 6 5 comandi Git per sviluppatori singoli 7 5 comandi Git per sviluppare collaborando 8 Repository in Git 9 Commit in Git 10 Working Copy in Git 11 Staging Area in Git 12 Branch in Git 13 Remote in Git 14 Inizializzare un nuovo repository con git init 15 Creare una copia di un repository remoto in Git con git clone 16 Configurare le opzioni di Git con git config 17 Il comando Git add in Git 18 Il comando Git commit in Git 19 Il comando Git diff in Git 20 Il comando Git stash in Git 21 .gitignore : i file ignored in Git 22 Il comando Git status in Git 23 il comando Git log in Git 24 Il comando Git tag in Git 25 Il comando Git blame in Git 26 Il comando Git checkout in Git 27 Il comando Git revert in Git 28 Il comando Git reset in Git 29 Il comando Git rm in Git 30 L'opzione Git commit –amend in Git 31 Git rebase –interactive in Git 32 Scorciatoie per comandi frequenti in Git 33 Repository condiviso in Git 34 Il modello Fork & pull 35 Il comando Git remote in Git 36 I principali repository remote di Git: Github, Gitlab e Bitbucket 37 Il comando Git fetch in Git 38 Il comando Git push in Git 39 Il comando Git pull in Git 40 Il comando Git branch in Git 41 Il comando Git checkout in Git 42 Il comando Git merge in Git 43 Risolvere un merge conflict in Git 44 Capire meglio il contenuto dei commit durante un conflitto di merge in Git 45 Workflow Git centralizzato 46 Workflow Git feature branching 47 Workflow Git trunk-based 48 Approccio “forking” in Git 49 Gitflow in Git 50 Messaggi di commit in Git 51 Tagging & Versioning in Git 52 L’opzione merge in Git 53 L’opzione rebase in Git
Scopri i corsi

Le nostre guide possono essere molto utili per muovere i primi passi nel mondo della programmazione, ma se vuoi iniziare una nuova carriera in ambito digital & tech con il supporto costante dei docenti e tantissime esercitazioni pratiche, ti consigliamo di frequentare uno dei corsi della nostra Hackademy!

Scopri i corsi