Introduzione
Il git merge
comando aiuta un collaboratore ad aggiungere a un progetto da un ramo. Il concetto è una delle idee centrali della programmazione collaborativa, poiché consente a più persone di lavorare sulla propria parte del codice senza alcun conflitto.
Quando più contributori lavorano sulla stessa parte di un codice o lavorano con numerosi rami, è inevitabile che si verifichino conflitti di unione. L'obiettivo principale di git merge
è risolvere o avvisare automaticamente su questi conflitti.
Questa guida spiega cos'è un conflitto di unione e offre soluzioni per quando non si risolve automaticamente. L'articolo fornisce anche suggerimenti utili per prevenire i conflitti di unione di Git.
Prerequisiti
- Git installato e configurato (su Windows, Mac e Ubuntu).
- Un conflitto di git merge tra un ramo locale e uno remoto.
- Accesso a un terminale oa una riga di comando
- Editor di Vim per il tutorial (Per installare Vim, segui una delle nostre guide:Come installare Vim 8.2 su Ubuntu 18.04 o Come installare Vim 8.2 su CentOS 7)
Che cos'è un conflitto Git Merge?
Quando si lavora con sistemi di controllo della versione come Git, la maggior parte dei conflitti di unione si risolvono automaticamente. Tuttavia, ci sono situazioni in cui git merge
non è in grado di risolvere un problema.
Alcuni esempi di conflitti di unione includono:
- Cambiare le stesse righe di codice in un file.
- Rimozione dei file mentre le modifiche avvengono in un altro luogo.
Poiché il problema si verifica localmente e il resto dei membri del progetto non è a conoscenza del problema, la risoluzione del conflitto ha una priorità assoluta e richiede una soluzione immediata.
Tipi di conflitti di unione di Git
I tipi generali di conflitti di unione dipendono da quando viene visualizzato il problema. I conflitti si verificano:
- Prima dell'unione , indicando che ci sono modifiche locali non aggiornate. Il messaggio di errore di conflitto viene visualizzato prima dell'inizio dell'unione per evitare problemi.
- Durante l'unione , che indica un problema di sovrascrittura. Viene visualizzato il messaggio di errore e interrompe il processo di unione per evitare di sovrascrivere le modifiche.
Come risolvere i conflitti di unione in Git
Esistono tre modi per risolvere un conflitto di unione in Git:
1. Accetta la versione locale . Per accettare tutte le modifiche su un file dalla versione locale, esegui:
git checkout --ours <file name>
In alternativa, per accettare la versione locale per tutti file in conflitto, utilizzare:
git merge --strategy-option ours
2. Accetta la versione remota . Per aggiornare le modifiche su un file dal ramo remoto, eseguire:
git checkout --theirs <file name>
Accetta la versione remota per tutti file in conflitto con:
git merge --strategy-option theirs
3. Esamina le modifiche individualmente . L'ultima opzione è quella di rivedere ogni modifica separatamente. Questa opzione è anche il percorso migliore da intraprendere, soprattutto quando si lavora con più file e persone. Per rendere questo lavoro più gestibile, usa strumenti speciali per aiutare a rivedere i conflitti individuali.
In definitiva, la scelta di quali parti del codice rimangono e quali no dipende dalla decisione dello sviluppatore per il progetto corrente.
Come ottenere un conflitto di unione in Git
Il conflitto di unione in Git si verifica quando il comando git merge
genera un errore.
Il messaggio di errore stampa le informazioni su dove è presente il conflitto. Controlla il file dal messaggio di errore e guarda il contenuto in cui si è verificato il conflitto di unione:
Git aggiunge automaticamente tre indicatori accanto alle righe di codice in conflitto:
- <<<<<<< (sette caratteri "minore di") seguiti da HEAD , che è un alias per il ramo corrente. I simboli indicano l'inizio delle modifiche all'interno di questa sezione.
- ======= (sette caratteri "segno di uguale"), che mostrano la fine delle revisioni all'interno del ramo corrente e l'inizio delle modifiche all'interno di uno nuovo.
- >>>>>>> (sette caratteri "maggiore di") seguito dal ramo in cui è avvenuto il tentativo di unione. I simboli aggiunti indicano la fine delle modifiche all'interno del ramo in conflitto.
La sintassi aggiunta aiuta a cercare nel codice per trovare la posizione del conflitto di unione. Tuttavia, un approccio molto più semplice consiste nell'utilizzare uno strumento di differenza/unione per scoprire i problemi e tenere traccia dei cambiamenti.
Impostazione di uno strumento differenziale predefinito in Git
Per impostare lo strumento diff predefinito per git mergetool
:
1. Esegui la seguente riga nel tuo terminale:
git mergetool --tool-help
L'output stampa tutti gli strumenti diff supportati per la configurazione corrente:
Sono disponibili diversi strumenti in base all'editor scelto. Ad esempio:
- Emacs strumenti diff:Ediff o emerge
- Vim strumenti diff:vimdiff, vimdiff2 o vimdiff3
Gli ulteriori passaggi mostrano un esempio di come impostare il vimdiff strumento per Vim.
2. Modificare il git config
per impostare lo strumento di unione predefinito:
git config merge.tool <tool name>
Ad esempio, se usi Vim, esegui:
git config merge.tool vimdiff
3. Imposta lo strumento diff per mostrare l'antenato comune per entrambi i file, che è la versione prima di qualsiasi modifica:
git config merge.conflictstyle diff3
4. Imposta l'opzione per non richiedere prima dell'esecuzione:
git config mergetool.prompt false
La configurazione dello strumento diff per Git è completa.
Utilizzare Mergetool per vedere le differenze
Per utilizzare lo mergetool
e vedere le differenze, eseguire:
git mergetool
L'output mostra una finestra con quattro viste:
1. LOCALE rappresenta la versione del file dal ramo corrente.
2. BASE ecco come appariva il file prima di qualsiasi modifica.
3. REMOTO mostra come appare il file nel ramo remoto in cui si trovano le informazioni in conflitto.
4. FUSIONE ha il file di unione finale. Questo risultato rappresenta ciò che viene salvato nel repository.
I comandi di navigazione principali tra queste finestre sono:
- CTRL+WW per spostarsi tra le finestre.
- CTLR+WJ per passare alla visualizzazione della finestra fusa.
- CTRL+WX per cambiare posizione delle finestre.
Per una navigazione avanzata, le informazioni sono disponibili con il comando :help window-moving
.
Aggiornamento e risoluzione di un conflitto di unione
Aggiorna il file MERGED per risolvere un conflitto. Alcune scorciatoie per l'aggiornamento della versione fusa includono:
- :diffg LOCALE aggiorna alla versione LOCALE.
- :diffg BASE aggiornamenti alla versione BASE.
- :diffg REMOTO aggiornamenti alla versione REMOTE.
Una volta aggiornate le informazioni, salva ed esci con :wqa
.
Impegna e ripulisci
Il passaggio finale è eseguire il commit e ripulire i file extra. Conferma la versione aggiornata eseguendo:
git commit -m "<your message>"
Lo strumento diff crea file aggiuntivi sul progetto per confrontare le versioni. Puliscili con:
git clean -f
Suggerimenti su come prevenire i conflitti di unione
I conflitti di unione si verificano solo quando il computer non è in grado di risolvere il problema automaticamente.
Ecco alcuni suggerimenti su come prevenire i conflitti di unione:
- Utilizza un nuovo file invece di uno esistente quando possibile.
- Evita di aggiungere modifiche alla fine del file.
- Push and pull delle modifiche il più spesso possibile.
- Non abbellire il codice o organizzare le importazioni da solo.
- Evita la mentalità del programmatore solista tenendo presente le altre persone che stanno lavorando sullo stesso codice.