¿Cómo puedo ver una diferencia entre merge commit y lo que sería una combinación automática de los mismos padres?

Tengo un par de malas fusiones en la historia (debido a un error humano). Quiero una forma rápida de averiguar si tengo más como estos. Para automatizarlo, quiero ver, para cada compromiso de fusión, la diferencia entre como si la fusión se llevara a cabo automáticamente (con una estrategia de resolución de conflictos dada) y lo que realmente sucedió en una fusión dada.

¿Cómo puedo hacerlo?

Debes hacer esa fusión automática.

Para hacerlo, consulte a uno de los dos padres de la combinación sospechosa, otorgándose un "HEAD separado" en el process. Si $suspect_merge contiene un nombre adecuado para la fusión sospechosa (por ejemplo, una identificación hash):

 git checkout $suspect_merge^1 

Luego, ejecute git merge en el otro de los dos padres:

 git merge [options] $suspect_merge^2 

La fusión finalizará y hará una nueva confirmación en su HEAD separado, o fallará debido a conflictos. Si falla, puede finalizarlo de forma manual y correcta, y luego confirmar.

Ahora tiene una buena fusión que puede comparar con la fusión sospechosa:

 git diff $suspect_merge HEAD 

Cuando git checkout cualquier twig con nombre, la fusión que acaba de realizar en el HEAD separado se abandona. Con el time (en general, algún time después de 30 días, cuando expira su input de reflog) se recolecta basura. Para mantenerlo, darle un nombre: una twig o nombre de label funciona bien.