Come si risolvono i conflitti di fusione in Git?
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.
Identificate quali file sono in conflitto (Git dovrebbe dirvelo).
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.
Una volta che hai risolto il conflitto in un file git add the_file
.
Una volta risolti tutti i conflitti, fai git rebase --continue
o qualsiasi comando
Git ha detto di fare quando hai completato.
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.