web-dev-qa-db-fra.com

Comment résoudre un conflit de fusion suite à la suppression d'un fichier dans une branche?

J'ai créé une branche dialog et lorsque j'essaie de la fusionner avec la branche master. Il y a 2 conflits. Je ne sais pas comment résoudre CONFLICT (delete/modify). Pouvez-vous s'il vous plaît me dire quoi faire?

$ git checkout master
$ git merge dialog
CONFLICT (delete/modify): res/layout/dialog_item.xml deleted in dialog and modified in HEAD. Version HEAD of res/layout/dialog_item.xml left in tree.
Auto-merging src/com/DialogAdapter.Java
CONFLICT (content): Merge conflict in src/DialogAdapter.Java
Automatic merge failed; fix conflicts and then commit the result.

J'ai ouvert src/DialogAdapter.Java, réglé le conflit et fait un git add src/DialogAdapter.Java. Que dois-je faire d'autre?

174
n179911

Le message de conflit:

 CONFLICT (supprimer/modifier): res/layout/dialog_item.xml supprimé dans la boîte de dialogue et modifié dans HEAD 

signifie que res/layout/dialog_item.xml a été supprimé dans la branche de la boîte de dialogue que vous fusionnez, mais a été modifié dans HEAD (dans la branche avec laquelle vous effectuez la fusion).

Donc vous devez décider si

  • supprimer le fichier en utilisant "git rm res/layout/dialog_item.xml"

ou

  • accepte la version de HEAD (peut-être après l'avoir modifiée) avec "git add res/layout/dialog_item.xml"

Ensuite, vous finalisez la fusion avec "git commit".

Notez que git vous avertira que vous créez une validation de fusion, dans le cas (rare) où il s'agit de quelque chose que vous ne voulez pas. Reste probablement de l'époque où ledit cas était moins rare.

224
Jakub Narębski

Normalement, je ne fais que lancer git mergetool et il me demandera si je souhaite conserver le fichier modifié ou le supprimer. C'est le moyen le plus rapide à mon humble avis puisqu'il s'agit d'une commande au lieu de plusieurs par fichier.

Si vous avez plusieurs fichiers supprimés dans un sous-répertoire spécifique et que vous souhaitez qu'ils soient tous résolus en supprimant les fichiers, procédez comme suit:

yes d | git mergetool -- the/subdirectory

La d permet de supprimer chaque fichier. Vous pouvez également utiliser m pour conserver le fichier modifié. Extrait de l'invite que vous voyez lorsque vous exécutez mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
58
void.pointer

Si vous utilisez Git Gui sous Windows,

  1. Abandonner la fusion
  2. Assurez-vous que vous êtes sur votre branche cible
  3. Supprimer le fichier en conflit de l'explorateur
  4. Réanalyser les modifications dans Git Gui (F5)
  5. Notez que le fichier en conflit est supprimé
  6. Sélectionnez l'étape de modification des fichiers à valider (Ctrl-I) dans le menu Valider
  7. Entrez un commentaire de validation tel que "fichier en conflit supprimé"
  8. Commit (ctrl-enter)
  9. Maintenant, si vous redémarrez la fusion, cela fonctionnera (espérons-le).
4
salihcenap