git: abortar confirmación en medio de escribir mensaje

131

Estoy en medio de comprometerme. He escrito mi mensaje de confirmación en vim. Ahora recordaba que necesitaba cambiar algo. Me doy cuenta de que hay otras opciones para lograr lo que quiero, pero quiero saber si hay una manera de abortar la confirmación pero aún así guardar el mensaje de confirmación que he escrito hasta ahora.

Alexander Bird
fuente

Respuestas:

85

Si. Escriba el mensaje de confirmación en un archivo diferente ( :w /some/other/path.txt). Luego salga del editor sin guardar ( :q!). Si previamente guardó el archivo en su ruta original, elimine todo y escriba primero el archivo vacío (un mensaje de confirmación vacío cancelará la confirmación).

Ahora, cuando esté listo para comprometerse "para reales", use el archivo de mensaje que guardó en la ruta alternativa.

Alternativamente, copie el mensaje de confirmación en uno de los buffers de vim.

Vale la pena señalar que realmente no tiene que hacer esto en absoluto : le commit --amendpermite modificar el compromiso después de que se realiza, por lo que la solución fácil es producir el compromiso con lo que tiene y luego solucionarlo antes de presionar. Incluso puede terminar la confirmación en su estado roto reset HEAD~(lo restablece al estado en que se encontraba su copia de trabajo antes de la confirmación), corregir su copia de trabajo y luego commit -a -c HEAD@{1}usar el mensaje de confirmación anterior.

Borealid
fuente
77
Nota: Salir de vim usando ": q!" no cancelará la confirmación si hay un mensaje de conflicto de fusión autopoblado. En cambio, la confirmación continuará y el mensaje no enumerará qué archivos tuvieron conflictos.
stephenbez
write the empty file (an empty commit message will abort the commit)parte funcionó a las mil maravillas, gracias!
Саша Давиденко
182

Si su editor puede salir con un código de error, Git cancelará la confirmación. Cuando use VIM, escriba

:cq

para salir con un código de error distinto de cero y abortar la confirmación.

nimrodm
fuente
55
Este es un buen truco para abortar, commit --amendya que de lo contrario tendría que eliminar el mensaje de confirmación existente y :wq.
Alex Jasmin
2
¡Buen truco! Sin embargo, la pregunta era cómo guardar el mensaje de confirmación, no eliminarlo.
Elijah Lynn
Entonces, ¿cómo hace svn para hacer esto? ¿Qué se ve además del código de salida?
Chaim Geretz
1
genial cuando estás haciendo un rebase interactivo, también conocido como commits de aplastamiento
hellatan
Me salvó la vida cuando hice un en git commit --amendlugar de git rebase --continuedurante el rebase.
Weishi Zeng
68

Si ha abierto vim para escribir su mensaje de confirmación, simplemente elimine las líneas que no comienzan con # y git cancelará su confirmación

Aborting commit due to empty commit message.
zetta
fuente
11
Esto es particularmente útil cuando desea abortar un git commit --amend.
edsko
1
La pregunta era cómo abortar la confirmación pero guardar el mensaje de confirmación. Eliminar líneas que no comienzan con # elimina efectivamente el mensaje de confirmación, no guarda el mensaje de confirmación. No estoy seguro de cómo esto tiene tantos votos positivos.
Elijah Lynn
2
ggdGcortará todo el contenido del mensaje, luego, la próxima vez que ejecute vim, solo puede Pcortar el texto que cortó anteriormente.
oromoiluig
funciona usando nano, ctrl + k todas las líneas, luego guardar y salir
abortará
9

Si bien puede cancelar la confirmación, otro enfoque es modificar la confirmación después. Simplemente confirme su trabajo actual, luego realice los cambios adicionales que desee git add, luego ejecute git commit --amend. Volverás al editor de mensajes de confirmación y, cuando guardes, la confirmación se modificará para incluir los cambios adicionales y tu nuevo mensaje de confirmación.

bdonlan
fuente
7

Si es posible. Para confirmar, su editor DEBE escribir el mensaje de confirmación en el archivo .git/COMMIT_EDITMSGy salir con un código de estado 0.

Entonces, si está utilizando VI / VIM, es posible que desee hacer lo siguiente ...

  1. Escribe tu mensaje de compromiso.
  2. Guarde el mensaje de confirmación con :w(de forma predeterminada, esto guardará el contenido actual en .git/COMMIT_EDITMSG)
  3. Salga del editor con un error. :cq
  4. ... haz lo que tengas que hacer ... incluso agrega / elimina archivos al área de preparación.
  5. Continúe editando su mensaje de confirmación existente con git commit -eF .git/COMMIT_MESSAGE

El -F /path/to/filellenará el editor con cualquier contenido dado de / ruta / a / archivo. Sin embargo, de forma predeterminada, esto realizaría la confirmación al instante, a menos que proporcione el -eindicador adicional para su edición .

Rudolf Tucek
fuente
esto funciona, pero es menos preferible porque 1) supone que el CWD es donde está la carpeta .git 2) Uso git worktrees , y con git worktrees, .git es en realidad un archivo que dice dónde está la carpeta real .git.
Alexander Bird
@AlexanderBird esto no es cierto ... cuando desea recoger el antiguo mensaje de confirmación en el paso 5), solo tendría que especificar una ruta relativa (digamos que está en el /foo/bar/directorio, relativo desde la raíz del proyecto) comogit commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek
@AlexanderBird genial, aún no me he dado cuenta con la función de múltiples árboles de trabajo en git. Gracias por la pista! Creo que el único inconveniente de esto es que tendrías que tener una visión general en tu cabeza, lo que evita que te concentres en el código real. Y solo por captar el mensaje de confirmación sobre "donde lo dejé" es un poco pesado :)
Rudolf Tucek
1
@AlexanderBird entonces en lugar de :whacer :sav committmpygit commit -eF committmp
Hashbrown
0

Por lo general, me comprometo IntelliJusando los terminales provistos. Lamentablemente mis commits son manuales:

git commit -m'my message' // etc

¡así que lo único que creo que es seguro hacer es cerrar la ventana del terminal! Simplemente resalte su texto si desea guardarlo, luego copie, luego cierre la ventana del terminal.

Frente soviético
fuente
-2

La respuesta de @bdonlan es buena para esta misma pregunta, pero señalaré una situación en la que podría querer una mejor solución.

Digamos que desea agregar cambios a la última confirmación. Entonces haces lo que @bdolan sugirió:

git add files
git commit --amend

Imagine que durante la escritura del nuevo mensaje, se arrepiente de agregar esos archivos a esa confirmación. El problema es que está atrapado con un mensaje de confirmación ya guardado y al salir del editor (con o sin guardar) agregará esos cambios a la última confirmación. Volver al punto en el que estaba antes de estas acciones requiere que divida el último compromiso ; apuesto a que desea evitarlo.

El truco consiste en guardar y salir del editor mientras solo tiene líneas que comienzan con #o ninguna línea. Cuando salgas, serás recibido con el mensaje:

Aborting commit due to empty commit message.

Y no has cambiado la última confirmación en absoluto.

Doron Behar
fuente
Si entiendo que lo que estás diciendo es un problema, entonces eres incorrecto; como se ha demostrado aquí: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Es decir: si quiero "deshacer" la enmienda, entonces no tengo que dividir el compromiso anterior. El objeto de confirmación HEAD antes de la modificación se guarda como HEAD@{1}. Además, zetta ya sugirió eliminar todas las líneas sin comentarios.
Alexander Bird