Generar file de parche de un antiguo alijo

Deseo crear un file .patch basado en el diff de un stash viejo que puedo ver con git stash show -p stash@{2}

Intenté esto, pero no tuve suerte:

 git format-patch stash@{2} --stdout > file.patch 

¿Supuse que funcionaría como una confirmación normal? Disculpas por ser muy gordo.

¡Gracias!

La salida de git stash show -p es en sí misma un parche válido. Puedes usarlo directamente:

 git stash show -p stash@{2} > file.patch 

Según la documentation del git format-patch , si especifica una única confirmación, 1 entonces:

  1. Una única confirmación, since que especifica que las confirmaciones que conducen a la punta de la bifurcación actual no están en el historial que conduce a la salida.

Por lo tanto, format-patch intenta encontrar "commits que conducen a la punta de la twig actual" ( HEAD ) que no son ni ellos mismos stash@{2} ni ancestros de stash@{2} . Es difícil decir con precisión qué cometidos serán sin conocer el gráfico de confirmación real, pero si el gráfico se ve así:

 ... - o - o - * - * <-- HEAD=branch |\ iw <-- stash@{2} 

luego format-patch haría que un parche que contenga los dos commits se marque * : son los únicos antepasados ​​de HEAD que no se eliminan comenzando en el compromiso w y trabajando hacia atrás.

Si el gráfico se parece más a esto:

  * <-- HEAD=branch / ... - o - o - o - o <-- anotherbranch |\ iw <-- stash@{2} 

luego, una vez más, obtendría el compromiso marcado * (uno se comprometería esta vez, solo para ser un poco diferente).

(De hecho, obtienes exactamente los mismos commits que para stash@{2}..HEAD , ya que esta syntax de gitrevisions significa lo que está en el ítem 1 de la documentation de format-patch ).

Una solución es pasar al elemento 2 en la documentation de format-patch :

  1. La expresión genérica del range de revisión (ver la sección "ESPECIFICAR REVISIONES" en gitrevisions (7)) significa las confirmaciones en el range especificado.

Aquí solo necesita especificar los commits desde "justo antes de la ejecución de w en el alijo-bolsa" hasta "el commit de w ", que es simplemente stash@{2}^..stash@{2} :

 git format-patch [additional options like --stdout here] stash@{2}^..stash@{2} 

Como se trata de una confirmación única, la única diferencia entre esto y el uso de git show (como sugirió John Zwinck ) es el formatting preciso del parche (el parche de format-patch hace parches de estilo de buzón de forma pnetworkingeterminada).


Alternativamente, siempre puede convertir un alijo en una "twig real" usando la twig git stash branch . Esto convierte el índice commit i del stash en un commit real si es necesario, y restaura el estado del directory de trabajo (y el estado no rastreado o todos los files, si uno de ellos se incluyó en el alijo) después de crear una nueva twig comenzando en la confirmación principal, es decir, a la que está unida la bolsa. Confirma el tree de trabajo resultante y tienes una twig ordinaria, que puedes manipular con todas las operaciones de twig ordinarias (incluido format-patch ).


1 Vea algunas de mis otras descripciones sobre git "stash bags" para ver que un alijo es un grupo pequeño de confirmaciones, pero tenga en count que el nombre stash@{2} identifica una única confirmación, específicamente la confirmación del tree de trabajo en el "alijo" bolso".