Modificar el penúltimo compromiso
Si encontró un error en su última confirmación, simplemente puede volver a confirmar la última confirmación con
git commit --amend
Pero si ya realizó otra confirmación, ¿cómo vuelve a enviar la confirmación anterior a esa?
Nota: Supongo, ya lo sabe, que solo debe usarlo --amend
si está seguro de que ningún otro desarrollador ya usó su confirmación en sentido ascendente.
comete tu reparación con
git commit -a -m "arreglar el compromiso (este se moverá una línea hacia arriba)"
(el mensaje de confirmación no es importante, quedará obsoleto una vez que haya terminado)
Ahora la magia:
rebase el HEAD a la penúltima confirmación pero edite el mensaje de confirmación antes de esa manera, intercambiando la última y la penúltima línea en el editor de mensajes:git rebase -i CABEZA~3
El editor mostrará los últimos 3 comités así:
elige 2a06f16 este fue el último compromiso elija 0dbc5ce el penúltimo compromiso elija la confirmación de corrección 2e30418 (ésta se moverá una línea hacia arriba) # Rebase 011f3d0..2e30418 en 011f3d0 #…
intercambie las dos últimas líneas para que el mensaje de confirmación se vea, por ejemplo, así:
elige 2a06f16 este fue el último compromiso corrección 2e30418 confirmación de corrección (ésta se moverá una línea hacia arriba) elija 0dbc5ce el penúltimo compromiso # Rebase 011f3d0..2e30418 en 011f3d0 #…
Consulta tu registro con
git log CABEZA~3
presione la línea de confirmación corregida con
+
para forzar un nuevo envío a la rama ya existente congit push origen + nombre de rama
Bueno, llegué a esta página mientras buscaba lo mismo. Encontré una mejor manera con muchas otras opciones.
git rebase -i HEAD~2
Para el editor VIM:
Se abrirá un editor con los siguientes detalles.
pick 4f4f96f Added git ignore
pick d01e18c Added sample Blog
# Rebase 60e1cd3..d01e18c onto 60e1cd3 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
presione i, cambie pick
a r
o reword
, algo como a continuación
pick 4f4f96f Added git ignore
r d01e18c Added sample Blog
PRENSAesc + : + wq
Se abrirá otra ventana, cambie el mensaje de confirmación.
PRENSAesc + : + wq
Para el Bloc de notas o cualquier otro editor:
Edítelo como un archivo de texto normal (elija r o reformule) y guárdelo.
Finalmente
git push -f
El comentario de @aragaer es una forma aún más breve de hacer lo mismo:
git commit -a --fixup=HEAD^ #(or whatever commit to be fixed)
entonces
git rebase -i HEAD~3
y no necesita cambiar nada, por lo que simplemente puede cerrar el editor y git
se encargará de la reparación por sí mismo.
Nota: ¡Esto no funciona en mi sistema Ubuntu!