Comment résoudre les conflits de fusion dans Git

Comment résoudre les conflits de fusion dans Git ?

Solution

Essayez : git mergetool

Il ouvre une interface graphique qui vous guide à travers chaque conflit, et vous pouvez choisir comment fusionner. Parfois, cela nécessite un peu d'édition manuelle par la suite, mais en général, cela se suffit à lui-même. C'est certainement beaucoup mieux que de faire tout cela à la main.

Comme pour le commentaire de @JoshGlover :

La commande n'ouvre pas nécessairement une interface graphique à moins que vous n'en installiez une. L'exécution de git mergetool pour moi a eu pour résultat l'utilisation de vimdiff. Vous pouvez installer l'un des outils suivants pour l'utiliser à la place : meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Voici un exemple de procédure pour utiliser vimdiff pour résoudre les conflits de fusion. Basé sur [ce lien][1]

Etape 1 : Exécutez les commandes suivantes dans votre terminal

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

Cela fera de vimdiff l'outil de fusion par défaut.

Etape 2 : Exécutez la commande suivante dans le terminal

git mergetool

Etape 3 : Vous verrez un affichage de vimdiff dans le format suivant

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

Ces 4 vues sont

LOCAL - il s'agit du fichier de la branche actuelle

BASE - ancêtre commun, comment était le fichier avant les deux changements.

REMOTE - fichier que vous fusionnez dans votre branche.

MERGED - résultat de la fusion, c'est ce qui est sauvegardé dans le repo

Vous pouvez naviguer entre ces vues en utilisant ctrl+w. Vous pouvez atteindre directement la vue MERGED en utilisant ctrl+w suivi de j.

Plus d'informations sur la navigation dans vimdiff [ici][2] et [ici][3].

Étape 4. Vous pouvez modifier la vue MERGED de la manière suivante

Si vous voulez obtenir les modifications de REMOTE

:diffg RE  

Si vous voulez obtenir des changements de BASE

:diffg BA  

Si vous voulez obtenir les changements de LOCAL

:diffg LO 

Etape 5. Sauvegarder, quitter, valider et nettoyer

:wqa sauvegarder et sortir de vi

git commit -m "message"

git clean Supprime les fichiers supplémentaires (par exemple *.orig) créés par l'outil diff.

[1] : http://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/#fromHistor [2] : https://stackoverflow.com/questions/4556184/vim-move-window-left-right [3] : https://stackoverflow.com/questions/27151456/how-do-i-jump-to-the-next-prev-diff-in-git-difftool

Commentaires (20)
  1. Identifiez les fichiers qui sont en conflit (Git devrait vous le dire).

  2. Ouvrez chaque fichier et examinez les diffs ; Git les délimite. Avec un peu de chance, il sera évident de savoir quelle version de chaque bloc il faut conserver. Vous devrez peut-être en discuter avec les autres développeurs qui ont commis le code.

  3. Une fois que vous avez résolu le conflit dans un fichier git add the_file.

  4. Une fois que vous avez résolu tous les conflits, faites git rebase --continue ou n'importe quelle commande que Git vous a dit de faire quand vous avez terminé.

Commentaires (7)

Si vous faites souvent de petits commits, alors commencez par regarder les commentaires des commits avec git log --merge. Ensuite, git diff vous montrera les conflits.

Pour les conflits qui impliquent plus de quelques lignes, il est plus facile de voir ce qui se passe dans un outil GUI externe. J'aime opendiff -- Git supporte également vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge en sortie de boîte et vous pouvez en installer d'autres : git config merge.tool "your.tool" définira l'outil de votre choix et ensuite git mergetool après une fusion ratée vous montrera les différences dans le contexte.

Chaque fois que vous modifiez un fichier pour résoudre un conflit, git add filename mettra à jour l'index et votre diff ne le montrera plus. Lorsque tous les conflits sont gérés et que leurs fichiers ont été git add, git commit terminera votre fusion.

Commentaires (1)