Cómo identificar qué compromiso incluyen qué cambios en una fusión de pulpo

Cuando una determinada confirmación ( recursive merge ) tiene 2 confirmaciones principales, como se menciona aquí, la segunda matriz es la confirmación en la twig en la que nos fusionamos, lo que significa que contiene todos los cambios introducidos por esa fusión. Esto está bien para la recursive merge . Pero si se octopuss merge un octopuss merge así, ¿cómo identificamos qué compromiso introduce qué cambios? Gracias por adelantado

ACTUALIZACIÓN – Se agregó una aclaración sobre el enfoque basado en diferencias

Es algo engañoso decir que el segundo padre es la fuente de todos los cambios en una combinación normal. Puede haber una resolución de conflicto manual, o alguien puede simplemente fusionarse con la --no-commit e introducir cambios adicionales durante la fusión misma. En general, es aplicable pensar en términos de cómo la fusión difiere de cada uno de sus padres, que pensar en qué padre introdujo cada cambio.

Aún así, puede ser útil pensar en términos de "de dónde vino este cambio". Dependiendo de la información que realmente busca, podría comenzar con una de estas:

1) la git blame te dirá el compromiso del cual se origina cada línea de código. Todo lo que se origina de una confirmación en HEAD^..branchN debe indicar un cambio en la branchN . Pero dado que la información que se le proporciona es una identificación de compromiso para cada línea de código, sería necesario un considerable procesamiento posterior para concentrarse en los cambios.

2) Podrías hacer un diff para cada twig. Originalmente estaba pensando

 git diff HEAD^ HEAD^2 

y así sucesivamente (reemplazando HEAD^2 con una reference a cada twig fusionada). Esto está bien, excepto si la twig principal ha cambiado mucho desde que las otras twigs divergieron (en cuyo caso el inverso de esos cambios aparecería en cada diferencia).

Lo que realmente está pidiendo es la diferencia entre cada punta de twig y el punto donde esa twig comenzó a divergir; entonces, si puedes ubicar al "antepasado común", tal vez solo uses eso:

 git diff A HEAD^2 

(donde A es la última confirmación accesible desde HEAD^ y HEAD^2 ). Si bien esta es una forma sencilla de express (para una twig a la vez) exactamente lo que quiere decir, sí requiere search al ancestro común en cada caso. (Puede que haya un buen atajo en el que no estoy pensando; volveré con una actualización si se me ocurre).

Y si la topología de la bifurcación es demasiado desorderada, puede que aún no esté claro. Por ejemplo, si branch3 estaba realmente ramificado de branch2 , entonces tendrías que decidir si quieres diferenciar branch3 contra el antecesor común con HEAD o con branch2 (el enfoque anterior significa que algunos cambios serían atribuidos a branch2 y branch3 ).

Sería bueno usar un solo command para generar todas las diferencias, y en la superficie esto es lo que haría la opción -m para log o show ; pero esto nos lleva de vuelta al principio de mi respuesta, ya que está obteniendo la diferencia de la fusión con cada twig (no los cambios introducidos por cada twig) y tiene que negar mentalmente cada cambio. (es decir, tendría que search la única twig cuya diferencia no incluye un cambio para saber de dónde vino ese cambio).