¿Cómo edito un post de confirmación incorrecto en Git sin include ninguna modificación por etapas?

Si he organizado algunos cambios, y en el process veo un error en mi post de confirmación anterior (y sin pulsar), ¿hay alguna manera de modificar la confirmación sin plegar mis cambios por etapas?

Veo varias opciones en la página man para git-commit que realizan una function relacionada, pero ninguna combinación que parece producir exactamente el efecto deseado:

  • --amend
  • --all (etapa automática), pero no ' --none '
  • --message
  • --only (solo las routes especificadas)
  • -- <no-más-opciones> …

La opción, --only con una list de files vacía (que no sé cómo especificar), sería casi correcta, pero en cualquier caso podría eliminar los cambios de la última confirmación (que no quiero).

El método ingenuo es reset y luego commit --amend , pero eso requiere repetir el trabajo de preparación. Alternativamente, podría confirmar mis cambios por etapas y editar el post de compromiso que ya no es más reciente a través de una rebase , pero parece ser incómodo y exagerado solo por la edición de un post.

No creo que stash save pueda ayudar tampoco, ya que el stash no parece capaz de preservar la distinción entre los cambios por etapas y los cambios sin escena. (A less que sea posible stash solo lo que se ha escenificado? De nuevo, no veo cómo hacerlo).

Esta pregunta se relaciona con ¿Cómo modificar las confirmaciones existentes sin flujo? donde hay mucha información útil entre las respuestas, pero esta pregunta, ligeramente diferente, no se aborda.

Cualquier sugerencia recibida con gratitud; Gracias.

Puedes hacer eso con git-commit-tree y git-reset :

 git reset --soft `git commit-tree <tree-id> -m "new message" -p HEAD^` 

<tree-id> es la id del tree raíz de HEAD. Puedes getlo por git cat-file -p HEAD

Creo que los escondites deberían recordar lo que se organizó y lo que no, quizás tengas que usar --no-keep-index

 git stash --no-keep-index 

Quería poner esto como un comentario en la respuesta de @ npcode, pero no pude get el formatting correcto. Lo que sigue está fuertemente basado en esa respuesta …

Aquí hay una explicación más detallada, y una que permite editar el post de confirmación original:

(1) $ git cat-file -p HEAD | grep "^tree\b" | awk '{print $2}' git cat-file -p HEAD | grep "^tree\b" | awk '{print $2}'

imprime la id del tree de la raíz de HEAD ${tree-id} , necesaria en el paso (4)

Opcionalmente:

(2) $ git log -1 --format="%B" > ci.txt

vuelca el antiguo post de confirmación en ci.txt , que luego puede ser editado. De forma opcional y alternativa, podría escribirse un file de post de confirmación completamente nuevo.

(3) $ edit ci.txt

Entonces tambien

(4a) $ git commit-tree ${tree-id} -F ci.txt -p HEAD^

o

(4b) $ git commit-tree ${tree-id} -m "<new message>" -p HEAD^

para crear un nuevo object de confirmación con post de confirmación, respectivamente, desde un file o directamente en la línea de command. Cualquiera de estos commands imprime el ID ${commit-id} de la nueva confirmación, necesaria en el paso (5)

(5) $ git reset --soft ${commit-id}

para establecer la nueva confirmación como la CABEZA actual.

@npcode y @Daniel combinan los pasos (1), (4b) y (5).

Simplemente puede continuar con su trabajo y luego realizar una rebase interactiva:

 git rebase -i 

en la list de confirmaciones que ves, reemplaza pick con reword para todos los commits que quieras volver a networkingactar.