tipos tag remove qué practices existen etiquetas crear commits best git merge branching-and-merging

tag - Git merge diff3 estilo necesita explicación



qué tipos de etiquetas existen en git (2)

Aquí hay un artículo sobre el estilo de fusión de git de diff3 . Indica que es difícil saber si las líneas se están agregando o eliminando en este estilo.

Le sugiero que refine su pregunta si está buscando información específica. Es difícil decir lo que estás preguntando.

He fusionado 2 ramas y aparecieron conflictos, necesitaría algunos consejos donde comienza donde termina, etc. He reemplazado el código con algunos datos falsos para que sea más fácil de leer y hablar.

<<<<<<< HEAD aaaaaa ||||||| merged common ancestors <<<<<<< Temporary merge branch 1 bbbbbb ======= cccccc >>>>>>> mybranch dddddd <<<<<<< HEAD eeeeee ||||||| merged common ancestors ffffff ||||||| merged common ancestors gggggg ======= >>>>>>> Temporary merge branch 2 ======= hhhhhh >>>>>>> mybranch


Lo que está viendo en este ejemplo (con marcadores de Temporary merge branch ) es el resultado de diff3 con un conflicto de combinación cruzado. Te lo explicaré con una secuencia de definiciones.

Definiciones

  • base de fusión : la confirmación donde las dos ramas que se fusionaron se separaron más recientemente. Cuando se produce un conflicto de combinación, se realizaron diferentes cambios en las mismas líneas en ambas ramas. La base de fusión contiene lo que eran esas líneas antes de que cualquiera de las ramas las cambiara.
  • antecesores comunes combinados : diff3 genera una sección "intermedia" adicional que muestra las líneas como estaban en la base de combinación . Este es el punto de partida para ambas ramas.
  • Combinación entrecruzada : un historial de combinación donde dos ramas se combinan entre sí de manera que uno no podría haber sido una combinación de avance rápido. Doy un ejemplo a continuación. En una situación de fusión cruzada, hay múltiples bases de fusión .
  • Rama de combinación temporal : cuando hay varias bases de combinación , diff3 intenta fusionarlas juntas (usando ramas de combinación temporales) para formar un ancestro común único para mostrar en la sección central de diff3. Esto funciona a la perfección cuando no hay conflictos, pero cuando hay conflictos, se ven los marcadores de conflicto de la rama de combinación temporal dentro de la sección de antepasados ​​comunes combinados del medio.

Ejemplo de escenario de conflicto de fusión cruzada

Una fusión entrecruzada se produce cuando dos ramas se fusionan entre sí en diferentes momentos en el tiempo.

m3 * |/ | / | * B1 | | m2 * * B0 |//| |//| m1 * * A | / |/ m0 *

Considera esta secuencia de eventos:

  • m0 existe como origen / m aster
  • Creo una rama de feature-A con un compromiso A
  • m1 se compromete a dominar por otra persona
  • Comienzo una nueva rama de feature-B que se basa en A
  • Combino origin/master ( m1 ) en la feature-B Confluye, y lo resuelvo. La confirmación de fusión es B0 .
  • Implemento la característica B y confío el trabajo como B1 .
  • feature-A está lista para ser enviada, así que alguien la fusiona con el master . Entra en conflicto Lo resuelven, pero su resolución difiere de la resolución en B0 . El commit de fusión es m2 .
  • feature-B está lista para ser enviada, así que alguien la fusiona con el master . git intenta determinar la base de fusión , pero m1 y A califican igualmente como bases de fusión. git fusiona m1 y A en una rama de combinación temporal , lo que resulta en un conflicto. Vemos la salida de diff3 en la sección de ancestros comunes combinados , similar a la pregunta del OP.

Leyendo la salida

Con diff3 desactivado, este conflicto de fusión se vería así:

<<<<<<< HEAD aaaaaa ======= hhhhhh >>>>>>> mybranch

Primero, con todos los marcadores adicionales, querrá determinar cuáles son las líneas en conflicto reales, para poder diferenciarlo de la salida del ancestro común diff3.

aaaaaahhhhhh, eso es un poco mejor. ;-)

En el caso donde dos resoluciones de conflicto son conflictivas, aaaaaa y hhhhhh son las dos resoluciones.

A continuación, examine el contenido del ancestro común fusionado.

Con este historial de combinación en particular, había más de 2 bases de fusión, que requerían múltiples ramas de fusión temporales que luego se fusionaban. El resultado cuando hay muchas bases de fusión y conflictos puede ser bastante complicado y difícil de leer. Algunos dicen que no te molestes, simplemente apaga diff3 para estas situaciones.

También tenga en cuenta que git internamente puede decidir utilizar diferentes estrategias de fusión para resolver conflictos automáticamente, por lo que la salida puede ser difícil de entender. Dale sentido a esto si puedes, pero debes saber que no fue destinado al consumo humano. En este caso, se produjo un conflicto al fusionar mybranch en la Temporary merge branch 1 entre bbbbbb y cccccc . La línea dddddd no tuvo conflictos entre las ramas de combinación temporales. Luego se produjo un conflicto separado al Temporary merge branch 2 en HEAD , con varios ancestros comunes. HEAD resolvió el conflicto fusionando ffffff y gggggg como eeeeee , pero la Temporary merge branch 2 resolvió ese mismo conflicto al eliminar (o mover) la línea (por lo tanto, no hay líneas entre ====== y la Temporary merge branch 2 .

¿Cómo resuelves un conflicto como este? Si bien el análisis técnico puede ser posible, su opción más segura generalmente es regresar y revisar el historial de todas las ramas involucradas alrededor del conflicto, y elaborar manualmente una resolución basada en su comprensión.

Evitando todo esto

Estos conflictos son los peores, pero hay algunos comportamientos que ayudarán a prevenirlos.

  1. Evite las combinaciones entrecruzadas . En el ejemplo anterior, la feature-B fusionó el origin/master como B0 . Es posible que esta combinación para mantenerse al día con el maestro no fuera necesaria (aunque a veces lo sea). Si el origin/master nunca se fusionó en la feature-B , no habría habido una fusión de fusión, y m3 habría sido un conflicto normal con A como la única base de fusión.

    m3 * m3 * |/ |/ | / | / | * B1 | * B1 | | | | m2 * * B0 VS m2 * | |//| |/ | |//| | /| m1 * * A m1 * * A | / | / |/ |/ m0 * m0 *

  2. Sea consistente con las resoluciones de conflicto . En el ejemplo, el conflicto de base de combinación temporal solo se produjo porque m2 y B0 tenían diferentes resoluciones de conflicto. Si hubieran resuelto el conflicto de manera idéntica, m3 habría sido una combinación limpia. Tenga en cuenta que esta es una simple fusión cruzada que debería haber tenido la misma resolución. Otras situaciones pueden tener correctamente diferentes resoluciones. Las cosas se complican más cuando hay más de 2 bases de fusión y múltiples confirmaciones entre los puntos de fusión. Dicho esto, si eres inconsciente a sabiendas de las resoluciones de conflicto en situaciones cruzadas, espera dolores de cabeza más adelante.