Git erroneous no-op merge

Estoy viendo una falla de combinación extraña en Git después de una combinación "aplastada" de maestro a maestro.

Creé un pequeño repository de GitHub para reproducir el problema.

Esencialmente, el process es el siguiente:

  • Creé dos twigs.
  • En una twig, hice dos commits .
  • Fusioné estos commits en una segunda twig.
  • Me merge --squash 'd estos commits en maestro .
  • Eliminé un file directamente en la twig principal .
  • Luego fusioné los cambios en el maestro de nuevo en la twig original .
    • Aquí es donde ocurre el problema. Esta fusión no produce cambios en la twig. El file que se eliminó en el maestro todavía está presente.
  • Saqué todo en esta twig actualizada en la segunda twig.
  • Abrí una request de extracción para demostrar que la fusión de la segunda twig en el maestro volverá a introducir el file eliminado previamente.

¿Que está pasando aqui? ¿Por qué la fusión del maestro de vuelta a la twig no incluye el cambio realizado directamente a la twig principal? ¿Es esto un error o un error de uso?

Esto no es un error. El problema es que tu compromiso de squash no es una fusión, por lo que git no sabe que está conectado a Branch-1 . Lo ve como un compromiso ordinario. Cuando fusionas master en Branch-1 , git ve que hubo siguientes cambios ya que esas twigs divergieron:

  • en master : file1 agregado1 y file2 , luego file1 eliminado1. Diferencia general: file2 agregado2.
  • en Branch-1 : file1 agregado1, file2 agregado. Diferencia general: file1 agregado1 y file2 .

Git fusiona las sucursales usando esas diferencias generales. Agregaste el file2 en ambas twigs, pero no hay conflicto de fusión, porque los file2 de ambas twigs son idénticos. Entonces, el resultado de la fusión es una confirmación, que contiene tanto el file1 como el file2 .

Por el mismo motivo, su request de extracción agregará el file1 al master .

Pero si ha realizado una fusión real en lugar de una calabaza, el resultado será el esperado.


En realidad, esto incluso se menciona en la fusión de ayuda git :

Con las estrategias que usan combinación de 3 vías (incluida la pnetworkingeterminada, recursiva ), si se realiza un cambio en ambas twigs, pero luego se revierte en una de las twigs, ese cambio estará presente en el resultado fusionado; algunas personas encuentran este comportamiento confuso. Ocurre porque solo se consideran las cabeceras y la base de fusión al realizar una combinación, no el individuo se compromete. Por lo tanto, el algorithm de fusión considera el cambio revertido como ningún cambio y sustituye la versión modificada.

    Intereting Posts