Come risolvere i conflitti di fusione in Git

Come si risolvono i conflitti di fusione in Git?

Soluzione

Prova: git mergetool.

Apre una GUI che ti guida attraverso ogni conflitto, e puoi scegliere come unire. A volte richiede un po' di editing a mano dopo, ma di solito è sufficiente da solo. È molto meglio che fare tutto a mano, certamente.

Come da commento di @JoshGlover:

Il comando non apre necessariamente una GUI a meno che tu non ne installi una. L'esecuzione di git mergetool per me ha portato all'utilizzo di vimdiff. Puoi installare uno dei seguenti strumenti per usarlo al suo posto: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Di seguito è riportata la procedura di esempio per utilizzare vimdiff per risolvere i conflitti di fusione. Basato su questo link

Passo 1: Esegui i seguenti comandi nel tuo terminale

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Questo imposterà vimdiff come strumento di fusione predefinito.

Passo 2: Esegui il seguente comando nel terminale

git mergetool

Passo 3: Vedrai una visualizzazione di vimdiff nel seguente formato

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Queste 4 viste sono

LOCAL - questo è il file del ramo corrente

BASE - antenato comune, come appariva il file prima di entrambe le modifiche

REMOTE - file che stai fondendo nel tuo ramo

MERGED - risultato della fusione, questo è ciò che viene salvato nel repo

Puoi navigare tra queste viste usando ctrl+w. Puoi raggiungere direttamente la vista MERGED usando ctrl+w seguito da j.

Maggiori informazioni sulla navigazione vimdiff qui e qui

Passo 4. Potreste modificare la vista MERGED nel seguente modo

Se volete ottenere le modifiche da REMOTE

:diffg RE  

Se vuoi ottenere i cambiamenti da BASE

:diffg BA  

Se vuoi ottenere le modifiche da LOCAL

:diffg LO 

Passo 5. Salva, Esci, Impegna e Pulisci

:wqa salva ed esci da vi

git commit -m "messaggio"

git clean Rimuove i file extra (ad esempio *.orig) creati dallo strumento diff.

Commentari (20)
  1. Identificate quali file sono in conflitto (Git dovrebbe dirvelo).

  2. Aprire ogni file ed esaminare le differenze; Git le delimita. Si spera che sia ovvio quale versione di ogni blocco mantenere. Potrebbe essere necessario discuterne con i colleghi sviluppatori che hanno commesso il codice.

  3. Una volta che hai risolto il conflitto in un file git add the_file.

  4. Una volta risolti tutti i conflitti, fai git rebase --continue o qualsiasi comando Git ha detto di fare quando hai completato.

Commentari (7)

Se stai facendo frequenti piccoli commit, allora comincia a guardare i commenti di commit con git log --merge. Poi git diff ti mostrerà i conflitti.

Per i conflitti che coinvolgono più di poche righe, è più facile vedere cosa sta succedendo in uno strumento grafico esterno. Mi piace opendiff -- Git supporta anche vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge fuori dalla scatola e puoi installarne altri: git config merge.tool "your.tool" imposterà lo strumento scelto e poi git mergetool dopo un merge fallito ti mostrerà le differenze nel contesto.

Ogni volta che si modifica un file per risolvere un conflitto, git add filename aggiornerà l'indice e il tuo diff non lo mostrerà più. Quando tutti i conflitti sono gestiti e i loro file sono stati git add-ed, git commit completerà il tuo merge.

Commentari (1)