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.