2012-08-16 19 views
5

Mi repositorio de Git tiene dos archivos, alpha y beta, con contenido idéntico.Git rebase después de la fusión confundido sobre el archivo eliminado

Si elimino alpha en mi rama principal y lo edito en mi rama de características, cuando fusiono el maestro en función, me advierten acerca de un conflicto. Supongamos que resuelvo esto eliminando alpha.

si yo rebase mi rama de la característica en maestro usando git rebase master, alpha es borrado, pero los cambios que he realizado a alpha en la rama de la característica se aplican ahora a beta! Recibo una advertencia de conflicto pero se resuelve felizmente con una fusión automática sin que la confirmación se bloquee para que la revise.

Curiosamente, si hago un git rebase -i y acepto el valor predeterminado, beta no se edita y puedo resolver el mismo conflicto que resolví en el momento de la fusión.

Tres preguntas relacionadas a continuación:

  1. ¿Por qué Git que el cambio me presenté a un archivo debe ser aplicado a otro, cuando el otro no ha sido editado por cualquier comprometerse?
  2. ¿Cómo puedo evitar este tipo de situación?
  3. ¿Por qué el comportamiento es diferente para una base de datos interactiva, incluso cuando tomo las opciones predeterminadas?

Estoy ejecutando Git 1.7.9 en Cygwin en Win7. He puesto un transcript on pastebin mostrando esto comenzando con un git init en un directorio vacío, si alguien quiere ver los detalles por sí mismo (no lo estoy publicando aquí debido a la longitud).

Respuesta

10

Desde el documentation for git-rebase:

-m
--merge
Uso fusión de las estrategias para el cambio de base. Cuando se usa la estrategia de fusión recursiva (predeterminada), esto permite que la rebase tenga conocimiento de los cambios de nombre en el lado ascendente.

Cuando se elimina un archivo, Git considera que es un candidato para un cambio de nombre, y trata de aplicar el parche rebase al correspondiente archivo renombrado. Parece que podría haber hecho una mala suposición en tu caso.

Puede usar la opción -m para seleccionar una estrategia de combinación diferente. Por ejemplo, la estrategia de combinación resolve puede evitar este problema con el cambio automático de nombre de los nombres (consulte git-merge para obtener detalles sobre las estrategias de fusión).

+1

Otra posible solución sería jugar con la opción 'rename-threshold' de la estrategia' recursive'. Ajustándolo a 'M100%', debería resolver el problema con la mala suposición. –

+0

Gracias @GabrielePetronella. Eso me lo resolvió – thehouse