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.

bentolor
fuente
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 .

ibizaman
fuente
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
usuario2718704
fuente
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.

mart1n
fuente
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.

Joe
fuente
Gracias, esto se acerca bastante a lo que estaba buscando.
bentolor