GIT cómo crear el parche de commits no consecutivos

Tengo varias confirmaciones en una twig "feature-1" que son parte de alguna característica (llamémosla function X). En la twig existe también varias fusiones de maestra, lo que significa que la característica X podría distribuirse entre otras confirmaciones.

También imagina que no se usó rebase, entonces podemos tener algo como:

J - K - L - M - N [master] \ /(1) - A - B - C - D - E [Branch feature-1] 

El gráfico de arriba significa que:

  • Después de confirmar J, se creó una entidad de ramificación-1.
  • En el maestro se realizaron algunas confirmaciones (K, L, M, N), que podrían provenir de características externas.
  • En la twig feature-1 existen tres commits A, B, C.
  • En la twig feature-1 ocurre una fusión (1) desde el maestro en esta twig.
  • En la twig feature-1 existen dos commits más para finalizar la característica X.

Gráficamente tenemos:

  J - K - L - M - N [master] \ - A - B - C - K - L - M - N - D - E [Branch feature-1] 

¿Podríamos get confirmaciones A, B, C, D, E de la característica-1 en un file de parche?

ACTUALIZACIÓN : Hay otra gran restricción, los cambios A, B, C, D, E se fusionaron también en el máster después de la confirmación E, por lo que el formatting-parche no pudo detectar lo que está presente en la característica-1 que no está en el maestro.

Format-patch toma los mismos especificadores de revisión que la mayoría de los otros commands de git.

Esto debería generar parches solo para aquellas confirmaciones alcanzables en la característica-1 pero no en la maestra.

 git format-patch master..feature-1 

Actualizaciones

Presumiendo de maestro en señalar en la fusión, puedes intentar

 git format-patch master^1..feature-1 

De lo contrario, podría codificar el SHA para la confirmación de fusión en lugar del maestro en el punto anterior.

Si su historial es peor que eso, es posible que deba ver algo así como

no probado

 for rev in ${git rev-list --first-parent feature-1 ^ROOT_SHA do git format-patch -1 ${rev} done 

Finalmente, la única forma que encontré es usando un script bash. Esto podría evitarse si GIT se usó correctamente, es decir, si las fusiones solo se aplicaron en el maestro (en este caso, las soluciones de Andrew funcionan).

Otra buena solución fue rebase en lugar de fusionar, de todos modos, este no es ni el tema principal ni mi escenario real, por lo que la única solución que encontré para get un file de parche estaba haciendo:

 #!/bin/bash if [[ $# -lt 1 ]]; then echo "Ilegal number of parameters." echo "Usage $0 PartialCommitMessage [file.patch]." exit 1; fi if [[ $# -eq 1 ]]; then FILE_NAME=$1.patch else FILE_NAME=$2 fi #First line needed in patch files. echo "From: [email protected]" > $FILE_NAME for rev in `git log --reverse --pretty=format:%H --grep=$1` do cmd="git diff $rev^ $rev >> $FILE_NAME" echo $cmd eval $cmd done 

Para encontrar confirmaciones que contengan algún número de ticket (es decir, 1122) simplemente ejecute:

Uso:

 ./createPatch.sh 1122 

Salida:

Un file llamado 1122.patch que contiene los cambios de diff.