¿Cómo modificar una confirmación sin cambiar el mensaje de confirmación (reutilizando el anterior)?

657

¿Hay alguna manera de enmendar un commit sin que aparezca vi(o tu $EDITOR) con la opción de modificar tu mensaje de commit, pero simplemente reutilizando el mensaje anterior?

Sridhar Sarnobat
fuente
66
Voté a mi propia pregunta después de aprender de la manera difícil los males de enmendar.
Sridhar Sarnobat
28
Siempre y cuando cumpla con ciertas reglas (como no enmendar algo que ya se ha presionado) no hay razón por la cual enmendar sea algo malo.
paullb
3
Los commits enmendados no deben usarse para el commit intermitente de trabajo durante un solo cambio lógico. Para eso, debe comprometerse localmente correctamente y luego aplastar el historial de confirmación una vez finalizado (@ Sridhar-Sarnobat)
DBCerigo
3
Estoy completamente de acuerdo con @DBCerigo. La única situación en la que encuentro útil la modificación es cuando olvidé organizar un archivo en una confirmación anterior (por ejemplo, porque es nuevo y no se organiza automáticamente cuando se ejecuta git commit -a) y quiero comprometerlo retroactivamente.
Sridhar Sarnobat
1
Otra vez es útil enmendar, incluso si reconoce los peligros de cambiar el historial, si no está satisfecho con su mensaje de confirmación más reciente y desea reformularlo sin tener que volver a redactarlo.
Sridhar Sarnobat

Respuestas:

1011

Desde la versión git 1.7.9 también puede usar git commit --amend --no-editpara obtener su resultado.

Tenga en cuenta que esto no incluirá metadatos de la otra confirmación, como la marca de tiempo que puede o no ser importante para usted.

Shaggie
fuente
42
También puede facilitar la configuración predeterminada del indicador --no-edit agregando un alias: "mend = commit -a --amend --no-edit "
Jherico
1
@Jherico Sugeriría eliminar -a. Por favor, haga los compromisos atómicos, es mucho más fácil revisar o rebase :)
frouo
120

git commit -C HEAD --amendHará lo que quieras. La -Copción toma los metadatos de otra confirmación.

Andy Ross
fuente
15
Solo para agregar a la respuesta de Andy. Si esto es algo que haces con frecuencia, entonces puedes configurar un alias para usarlo git config --global alias.amend 'commit --amend -C HEAD'. Luego puede usarlo git amendcomo atajo.
mikej
99
¡Vamos muchachos, no sean perezosos, actualicen git y usen el comando incorporado que sugiere Shaggle! Sin embargo, uno más para la opción -C.
Dimitris Baltas
44
¡No solo la marca de tiempo, sino también la información de autoría!
usuario1338062
3
@RyanCastner De hecho, el comentario al que se refiere fue de 2013. Con la versión de git que estoy ejecutando actualmente --amend, incluso sin ninguna otra opción, conserva la fecha del autor (pero cambia la fecha de confirmación). Como tal, he eliminado mi antiguo comentario.
Ruben Verborgh
2
En realidad, esta respuesta es valiosa de una manera diferente, incluso si no es la respuesta aceptada. A diferencia de la otra respuesta, no tiene que usar —amend. Puede crear una nueva confirmación pero usar el mismo mensaje que la confirmación anterior. Puede que no suene útil, pero mi mensaje de confirmación de forma predeterminada cuando solo estoy guardando mi trabajo sin tener que pensar en un buen mensaje de confirmación, sigo reutilizando el mensaje—message=“Work in progress (untested)”
Sridhar Sarnobat
67

Otra posibilidad (tonta) es git commit --amend <<< :wqsi tienes vi (m) como $EDITOR.

galva
fuente
39
Incluso si eso no es necesario para este caso de uso, no sabía que puede canalizar a vim. Eso abre algunas posibilidades intrigantes. Gran consejo
Sridhar Sarnobat
66
... <<< ZZpodría ser aún menos escribiendo;)
Ruslan
66
..y aún menos - ... <<< :x:)
skwisgaar
3
No creo que sea tonto. Es una excelente manera de mejorar el flujo de trabajo para cualquier comando que abra vi.
B Seven
12
Soportes de triple ángulo. eso es nuevo.
oligofren
16

Para ampliar la respuesta aceptada, también puede hacer:

git commit --amend --no-edit -a

para agregar los archivos modificados actualmente.

Rambatino
fuente
11

Usar la respuesta aceptada para crear un alias

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

entonces puedes hacer

git oops

y agregará todo y enmendará usando el mismo mensaje

o

git oops -m "new message"

para modificar la sustitución del mensaje

aljgom
fuente