Git: ¿Cómo encontrar todos los commits en la twig A que se originaron en la twig derivada B fusionada de nuevo en A?

En Git, dado (1) una twig A y (2) una twig B derivada de A en algún punto del pasado y luego fusionada nuevamente en A, ¿cómo puedo encontrar todas las confirmaciones ahora en A que se originaron en B?

La intención es identificar el set de cambios de trabajo realizado en B ahora en A para rastrear más rápidamente los problemas.

Una confirmación squash obviamente y cómodamente empacar todo el set de cambios en una confirmación para una fácil reference, pero los inconvenientes (como la pérdida de información y la imputabilidad individual) hacen que esta opción no sea deseable para nosotros. De ahí mi pregunta.

Suponiendo que B se fusionó completamente en A , puede usar:

git cherry -v <merge-commit>^ <topic-branch>

…dónde:

  • <merge-commit>^ es el padre de la confirmación en la que fusionó la twig de tema.
  • <topic-branch> es la twig que desea verificar

Una vez que una twig se ha fusionado nuevamente, la confirmación de fusión es el marcador de su existencia. Suponiendo que no se anda demasiado con sus posts de compromiso de fusión, podría hacer algo como esto:

 #!/bin/bash die_with_usage() { # add a git alias for merged-commits to be able to call it like this echo "usage: git merged-commits <branch-merged> <branch-merged-into>" 1>&2 exit 1 } if [ $# -ne 2 ]; then die_with_usage fi # Find the merge commits merges=($(git log --pretty=%H --grep="Merge branch '$1' into $2")) if [ ${#merges[@]} -eq 0 ]; then echo "error: no such merges found!" 1>&2 die_with_usage fi for merge in ${merges[@]}; do # The first parent is the merged-into branch bar=$merge^1 # The second is the merged branch foo=$merge^2 # Find the merge base base=$(git merge-base $bar $foo) # Show the commits git log --pretty=%H $base..$foo done 

Pensé que sería útil imprimir los SHA1 y dejar que te vayas y hacer lo que quieras con ellos después, pero por supuesto puedes jugar con el formatting de salida de ese último git log .

(¡Y hasta probé esto! Podría mantenerlo, es un pequeño y divertido trazador de líneas.)

Otra cosa que puede hacer (en el futuro) es adoptar un post de confirmación de fusión a lo largo de las líneas de git.git, que esencialmente incorpora el shortlog de las confirmaciones fusionadas en el post de confirmación fusionado (aquí hay un ejemplo ). Hay una forma incorporada de hacer esto algún día (se ha fusionado con el siguiente, pero no con el maestro), pero por ahora tendrías que hacer tu propia jugada, o hacer un movimiento con agilidad y build a partir de ahora.

Eche un vistazo al script git-resurrect.sh en contrib/ area de las fonts de git.

 uso: git resurrect [-a] [-r] [-m] [-t] [-n] [-b <newname>] <name>

     -b, --branch ... save twig como en lugar de <nombre>
     -a, --todo lo mismo que -l -r -m -t
     -k, --neep-going full rev-list scan (en lugar de la primera coincidencia)
     -l, --reflog escaneado de escaneo para las cajas (habilitado por defecto)
     -r, --reflog-merges escanea las fusiones registradas en reflog
     -m, --merges explora fusiones en otras twigs (lento)
     -t, --merge-targets escanea fusiones de otras twigs en 
     -n, --dry-run no recrea la twig

 git-resurrect intenta encontrar rastros de una sugerencia de ramificación llamada <nombre>,
 e intenta resucitarlo.  Actualmente, se busca el reflog para realizar el pago
 posts, y con `-r 'también fusionan posts.  Con `-m 'y` -t', el
 El historial de todos los refs se escanea en " Merge <name> into other " /
 " Fusionar <otros> en <nombre> " (respectivamente) en temas de confirmación,
 que es bastante lento pero te permite resucitar a otras personas
 twigs de tema.