¿Cómo soluciono un conflicto de fusión debido a la eliminación de un archivo en una rama?

208

He creado una dialograma y cuando trato de fusionarla con la masterrama. Hay 2 conflictos. No se como resolverlo CONFLICT (delete/modify). ¿Me puede decir qué hacer?

$ 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.

Abrí src/DialogAdapter.java, arreglé el conflicto e hice un git add src/DialogAdapter.java. ¿Qué más necesito hacer?

BuZZ-dEE
fuente
Puede leer esta publicación sobre Desbordamiento de pila: - ¿Cómo soluciono los conflictos de fusión en Git? La respuesta aceptada hace referencia al manual de git .
heavyd

Respuestas:

271

El mensaje de conflicto:

CONFLICTO (eliminar / modificar): res / layout / dialog_item.xml eliminado en el diálogo y modificado en HEAD

significa que res/layout/dialog_item.xmlse eliminó en la rama 'diálogo' que está fusionando, pero se modificó en HEAD (en la rama a la que se está fusionando).

Entonces tienes que decidir si

  • eliminar el archivo usando " git rm res/layout/dialog_item.xml"

o

  • acepte la versión de HEAD (quizás después de editarla) con " git add res/layout/dialog_item.xml"

Luego finaliza la fusión con " git commit".

Tenga en cuenta que git le advertirá que está creando una confirmación de fusión, en el caso (raro) de que sea algo que no desea. Probablemente permanezca de los días en que dicho caso era menos raro.

Jakub Narębski
fuente
22
Intenté el primero ( git rm …) pero me sale …: needs mergey rm '…'me cuesta interpretarlo. Y luego, si intento comprometerme, stackoverflow.com/questions/19985906/… aparece nuevamente.
Jesse Glick
17
No importa la segunda mitad de ese comentario. La salida de Git es algo alarmante, pero parece ser inofensiva.
Jesse Glick
44
¿Hay un enfoque masivo? Tengo un proyecto a mano que se basa en cosas externas que no quiero conservar. Por lo tanto, hay muchos archivos que se modificaron en sentido ascendente y quiero eliminar en mi sucursal que estoy cambiando el nombre sin importar nada. Es tedioso hacerlo uno por uno.
mlt
2
@mit: puede usar git ls-files --stagey / o git status --porcelainy / o git diff-files <something>para obtener la lista de archivos modificados y generar un script para eliminarlos o aceptar su versión o la de ellos.
Jakub Narębski
1
@Honey: el mensaje CONFLICT incluye una descripción sobre qué cambio se realizó en cada rama. Puede verificarlo más tarde con git statuso git diff --cc. También hay algo git log --mergeque puede ayudar ...
Jakub Narębski
74

Normalmente solo ejecuto git mergetooly me preguntará si deseo mantener el archivo modificado o mantenerlo eliminado. Esta es la forma más rápida en mi humilde opinión, ya que es un comando en lugar de varios por archivo.

Si tiene un montón de archivos eliminados en un subdirectorio específico y desea que todos se resuelvan eliminando los archivos, puede hacer esto:

yes d | git mergetool -- the/subdirectory

Se dproporciona para elegir eliminar cada archivo. También puede usar mpara mantener el archivo modificado. Tomado del aviso que ves cuando corres mergetool:

Use (m)odified or (d)eleted file, or (a)bort?
void.pointer
fuente
1
@BrianMinton yo también, las otras cosas eran solo un círculo vicioso
Nate L
2
Esto se vuelve molesto cuando hay muchos archivos, ¿hay alguna forma de dar una respuesta para todos?
ideasman42
2
@ ideasman42 He actualizado mi respuesta para mostrar una solución de eliminación por lotes.
void.pointer
1
Realmente no sabía sobre la herramienta de fusión. Me salvaste el día amigo!
Mert
6

Si está utilizando Git Gui en Windows,

  1. Abortar la fusión
  2. Asegúrate de estar en tu rama objetivo
  3. Eliminar el archivo conflictivo del explorador
  4. Volver a buscar cambios en Git Gui (F5)
  5. Observe que se elimina el archivo en conflicto
  6. Seleccione Stage Changed Files to Commit (Ctrl-I) en el menú Confirmar
  7. Ingrese un comentario de confirmación como "archivo conflictivo eliminado"
  8. Comprometerse (ctrl-enter)
  9. Ahora, si reinicia la fusión, funcionará (con suerte).
salihcenap
fuente
55
Al chico simplemente no le gusta su forma de manejar Git con GUI, probablemente. Una forma de línea de comandos es mejor.
Souris