Git: ¿Cómo reutilizar / retener los mensajes de confirmación después de 'git reset'?


103

Como usuario de Git Me encuentro regular de la situación, que necesito para volver a trabajar uno o más confirmaciones de una manera que no encajan en --amendo rebase -icon commits corrección. Normalmente haría algo como

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Tomo los mensajes de compromiso sensatos y compuestos bastante en serio. Por lo general, contienen texto más grande con referencias y justificaciones para el cambio. Hasta ahora, estoy bastante molesto en el largo proceso para recuperar mi antiguo mensaje de registro a través de una desordenada git reflog, git logy copiar y pegar proceso.

¿Hay algo mejor para abordar esto? ¿Y cómo sería, si mi comprende más de un compromiso?

Editar: Después de pensar un poco en esto, creo que lo que estoy buscando es una funcionalidad similar a git stash para mensajes de confirmación en los que las confirmaciones de corrección / modificación no son apropiadas.


2
Si todo lo que hiciera fuera git reset head~1, ¿no sería su antiguo mensaje de confirmación la segunda entrada en el reflog?

Sí, pero ¿cómo podría reutilizar el mensaje sin copiar y pegar (que generalmente requiere la eliminación de sangría manual)
— Bentolor

Hoy en día solo tienes gitkabierto. De esa manera, ni siquiera tendrá que usar el reflog. Alternativamente, use rev-parse <branch>para obtener su hash antes del reinicio y use la respuesta de ibizaman.
— cst1992

Respuestas:


142

Después de un git reset, este one-liner puede hacerlo:

git commit --reuse-message=HEAD@{1}

o incluso más corto:

git commit -C HEAD@{1}

Puede usar las otras opciones proporcionadas por @ user2718704 .


6
Más corto:git commit -C@@{1}
— Phu Ngo

2
Este es un uso fantástico del reflog
— David Mann

22
Después de un reinicio, se establece ORIG_HEAD. Encuentro git commit --reuse-message=ORIG_HEADser el más claro.
— Scott Jacobsen

45

Al ejecutar el comando "git commit", debe verificar las siguientes opciones,

Reutilizar,

--reuse-message=<commit>

Para editar sobre la reutilización,

--reedit-message=<commit>

Para cambiar el autor,

--reset-author

1
Marcó esto como la nueva solución, ya que proporcionó la respuesta más completa. Aunque esta solución todavía no resuelve completamente mis problemas de 'recuperación'.
— bentolor

9

¿Por qué reiniciar si puedes piratear, arreglar, piratear y luego simplemente ejecutar git commit --amend --no-edit? así, conservando su mensaje de confirmación original.

Para que funcione para múltiples confirmaciones, simplemente cree una confirmación temporal con sus cambios más recientes y luego use una rebase interactiva para aplastar la confirmación anterior (que contiene el mensaje de confirmación correcta) con la nueva temporal, manteniendo el mensaje de confirmación de la confirmación anterior.


2
Al hacer una rebase interactiva, incluso puede usar la fixupinstrucción para declarar que la confirmación posterior es para arreglar la confirmación anterior y automáticamente usará el mensaje de confirmación del original descartando el mensaje de la confirmación de reparación.
— qqx

Por ejemplo, si quiero volver a fusionar una solicitud de extracción con actualización forzada. O si la confirmación no es la última y no se puede arreglar fácilmente basándose en HEAD y es más fácil rehacerlas.
— bentolor

@BenTebulin Bueno, la rebase interactiva te permite modificar cualquier confirmación en un rango de confirmaciones especificadas. No es estrictamente la confirmación HEAD la que debe modificarse.
— Martes

@ mart1n Gracias por destacar editar en rebase -i. Nunca lo usé en ese contexto. Para los casos restantes, como volver a fusionar, la otra respuesta es más apropiada para mi pregunta, así que la marqué como respuesta.
— bentolor

Intellij tiene ámbitos que solo operan en archivos que aún no se han comprometido. Es útil restablecer los archivos a no confirmados para que intellij pueda recibir instrucciones para eliminar los archivos, por ejemplo, y luego volver a confirmar esos archivos con el mismo mensaje. enmendar no funcionará para eso debido a las limitaciones del alcance de intellij.
— David Mann

5

Podría considerar git commit --reset-author -c <commit>reutilizar el mensaje de confirmación con la edición y la hora actual.


Gracias, esto se acerca bastante a lo que estaba buscando.
— bentolor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.