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

208

J'ai créé une dialogbranche et quand j'essaye de la fusionner en masterbranche. Il y a 2 conflits. Je ne sais pas comment résoudre CONFLICT (delete/modify). Pouvez-vous 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ésolu le conflit et fait un git add src/DialogAdapter.java. Que dois-je faire d'autre?

BuZZ-dEE
la source
Vous pouvez lire cet article sur Stack Overflow: - Comment résoudre les conflits de fusion dans Git? La réponse acceptée fait référence au manuel git .
heavyd
Conflit
IMSoP

Réponses:

271

Le message de conflit:

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

signifie qu'il a res/layout/dialog_item.xmlété supprimé dans la branche «boîte de dialogue» que vous fusionnez, mais a été modifié dans HEAD (dans la branche vers laquelle vous fusionnez).

Vous devez donc décider si

  • supprimer un fichier à l'aide de " git rm res/layout/dialog_item.xml"

ou

  • accepter 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 un commit de fusion, dans le cas (rare) où c'est quelque chose que vous ne voulez pas. Reste probablement du temps où ledit cas était moins rare.

Jakub Narębski
la source
22
git rm …J'ai essayé l'ancien ( ) mais je comprends …: needs mergeet rm '…'j'ai du mal à interpréter. Et puis si j'essaie de valider, stackoverflow.com/questions/19985906/… revient.
Jesse Glick
17
Peu importe la deuxième moitié de ce commentaire. La sortie de Git est quelque peu alarmante mais semble inoffensive.
Jesse Glick
4
Existe-t-il une approche de masse? J'ai un projet à portée de main qui repose sur des trucs externes que je ne veux pas garder. Il y a donc beaucoup de fichiers qui ont été modifiés en amont et je veux supprimer dans ma branche que je rebase quoi qu'il arrive. Il est fastidieux de le faire un par un.
mlt
2
@mit: vous pouvez utiliser git ls-files --stageet / ou git status --porcelainet / ou git diff-files <something>pour obtenir la liste des fichiers modifiés et piloter un script pour les supprimer ou accepter votre ou leur version.
Jakub Narębski
1
@Honey: Le message CONFLICT comprend une description de la modification sur quelle branche. Vous pouvez le vérifier plus tard avec git statusou git diff --cc. Il y a aussi git log --mergece qui peut aider ...
Jakub Narębski
74

Normalement, je viens de lancer git mergetoolet il me demandera si je souhaite conserver le fichier modifié ou le supprimer. C'est le moyen le plus rapide à mon humble avis car il s'agit d'une seule commande au lieu de plusieurs par fichier.

Si vous avez un tas de fichiers supprimés dans un sous-répertoire spécifique et que vous souhaitez tous les résoudre en supprimant les fichiers, vous pouvez procéder comme suit:

yes d | git mergetool -- the/subdirectory

Le dest fourni pour choisir de supprimer chaque fichier. Vous pouvez également utiliser mpour conserver le fichier modifié. Tiré de l'invite que vous voyez lorsque vous exécutez mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
la source
1
@BrianMinton moi aussi, les autres trucs n'étaient qu'un cercle vicieux
Nate L
2
Cela devient ennuyeux lorsque ses nombreux fichiers existent, existe-t-il un moyen de donner une réponse pour tous?
ideasman42
2
@ ideasman42 J'ai mis à jour ma réponse pour afficher une solution de suppression par lots.
void.pointer
1
Je ne connaissais pas vraiment l'outil de fusion. Tu as sauvé mon jour mec!
Mert
6

Si vous utilisez Git Gui sur Windows,

  1. Annuler la fusion
  2. Assurez-vous que vous êtes sur votre branche cible
  3. Supprimer le fichier en conflit de l'explorateur
  4. Nouvelle recherche de modifications dans Git Gui (F5)
  5. Notez que le fichier en conflit est supprimé
  6. Sélectionnez Stage Changed Files To Commit (Ctrl-I) dans le menu Commit
  7. Entrez un commentaire de validation tel que "fichier en conflit supprimé"
  8. Valider (Ctrl-Entrée)
  9. Maintenant, si vous redémarrez la fusion, cela fonctionnera (espérons-le).
salihcenap
la source
5
Le gars n'aime tout simplement pas la façon dont vous gérez Git avec GUI, probablement. Une méthode en ligne de commande est meilleure.
Souris