¿Cómo puedo verificar que una sucursal no tenga ninguna fusión?

¿Cómo puedo verificar que una sucursal no tenga ninguna fusión? Específicamente, creo que quiero comprobar que no hay compromisos de fusión entre una confirmación básica determinada y una confirmación de objective determinada. Por ejemplo, quiero detectar cuándo ocurre cualquiera de estos casos:

target o /| o | \| o | base o target o | | o /| / | base | o \ | \| o 

La respuesta es sorprendentemente simple al final. Puede o no querer --ancestry-path aquí también:

 git rev-list base..target --merges --count 

(o base^@..target para inspeccionar la base sí, pero probablemente no quieras inspeccionar la base, lo que probablemente se permita fusionar).

Descripción

Como regla general, casi siempre queremos que git rev-list enumere commits. Este command es más o less el equivalente de fontanería de git log . El range que queremos es "todos los commits alcanzables desde el objective, excluyendo todos los commits accesibles desde la base", así que eso es base..targetbase..target .

A continuación, desea enumerar solo las fusiones en esta list. Así que agregamos --merges , que no afecta el --merges la revisión, pero evita include cualquier cosa que no sea fusionar compromisos (se compromete con dos o más padres).

Realmente no nos importa qué compromisos son las fusiones. Solo queremos saber si hay alguno. Entonces, si obtuviéramos un conteo de fusiones, en vez de la list de fusiones, eso sería suficiente. Agregar --count le dice a git rev-list que --count el recuento en lugar de la list.

Si el resultado no es cero, hay fusiones.

Ancestry-path

La pregunta de si usar --ancestry-path es algo que solo usted puede responder. Considerar:

 o (target) commit blah |\ o | commit bar | o commit foo o | (base) commit quux | o commit baz : | : : 

La base de list … base..target includeá commits foo y baz y commits previos en esa etapa. Pero estos commits no están entre la base y el objective, ya que no son descendientes de base commit quux .

Si desea considerarlos, --ancestry-path . Si no deben contar, incluya --ancestry-path .

El siguiente command devuelve todas las asignaciones de fusión entre la base y el target .

 git rev-list --merges base..target