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 compromisoA
-
m1
se compromete a dominar por otra persona - Comienzo una nueva rama de
feature-B
que se basa enA
- Combino
origin/master
(m1
) en lafeature-B
Confluye, y lo resuelvo. La confirmación de fusión esB0
. - 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 elmaster
. Entra en conflicto Lo resuelven, pero su resolución difiere de la resolución enB0
. El commit de fusión esm2
. -
feature-B
está lista para ser enviada, así que alguien la fusiona con elmaster
. git intenta determinar la base de fusión , perom1
yA
califican igualmente como bases de fusión. git fusionam1
yA
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.
Evite las combinaciones entrecruzadas . En el ejemplo anterior, la
feature-B
fusionó elorigin/master
comoB0
. Es posible que esta combinación para mantenerse al día con el maestro no fuera necesaria (aunque a veces lo sea). Si elorigin/master
nunca se fusionó en lafeature-B
, no habría habido una fusión de fusión, ym3
habría sido un conflicto normal conA
como la única base de fusión.m3 * m3 * |/ |/ | / | / | * B1 | * B1 | | | | m2 * * B0 VS m2 * | |//| |/ | |//| | /| m1 * * A m1 * * A | / | / |/ |/ m0 * m0 *
- Sea consistente con las resoluciones de conflicto . En el ejemplo, el conflicto de base de combinación temporal solo se produjo porque
m2
yB0
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.