Hay dos formas de manejar esto. Lo que es más fácil depende de tu situación.
Reiniciar
Si la confirmación de la que desea deshacerse fue la última confirmación, y no ha realizado ningún trabajo adicional, simplemente puede usar git-reset
git reset HEAD^
Lleva su rama nuevamente al commit justo antes de su HEAD actual. Sin embargo, en realidad no cambia los archivos en su árbol de trabajo. Como resultado, los cambios que estaban en esa confirmación aparecen como modificados, es como un comando 'no confirmado'. De hecho, tengo un alias para hacer precisamente eso.
git config --global alias.uncommit 'reset HEAD^'
Entonces puede usarlo git uncommit
en el futuro para hacer una copia de seguridad de una confirmación.
Aplastamiento
Aplastar un commit significa combinar dos o más commits en uno. Hago esto con bastante frecuencia. En su caso, tiene una característica a medio hacer confirmada, y luego la finalizaría y volvería a confirmar con el mensaje de confirmación permanente adecuado.
git rebase -i <ref>
Digo arriba porque quiero dejar en claro que esto podría ser cualquier cantidad de confirmaciones. Ejecute git log
y encuentre el commit del que desea deshacerse, copie su SHA1 y úselo en lugar de <ref>
. Git te llevará al modo de rebase interactivo. Mostrará todas las confirmaciones entre su estado actual y cualquier cosa que ponga en su lugar <ref>
. Entonces, si <ref>
hace 10 commits, te mostrará los 10 commits.
Delante de cada commit, tendrá la palabra pick
. Encuentra el commit desea deshacerse de y cambiarlo de pick
a fixup
o squash
. Usar fixup
simplemente descartes que confirman el mensaje y fusionan los cambios en su predecesor inmediato en la lista. La squash
palabra clave hace lo mismo, pero le permite editar el mensaje de confirmación de la nueva confirmación combinada.
Tenga en cuenta que las confirmaciones se volverán a confirmar en el orden en que aparecen en la lista cuando salga del editor. Entonces, si realizó una confirmación temporal, luego realizó otro trabajo en la misma rama y completó la función en una confirmación posterior, entonces el uso de rebase le permitiría volver a ordenar las confirmaciones y aplastarlas.
ADVERTENCIA:
Rebasar modifica el historial: NO haga esto con ninguna confirmación que ya haya compartido con otros desarrolladores.
Escondite
En el futuro, para evitar este problema, considere usarlo git stash
para almacenar temporalmente el trabajo no comprometido.
git stash save 'some message'
Esto almacenará tus cambios actuales a un lado en tu lista de escondite. Arriba está la versión más explícita del comando stash, que permite un comentario para describir lo que está ocultando. También puede simplemente ejecutar git stash
y nada más, pero no se almacenará ningún mensaje.
Puede navegar por su lista de alijo con ...
git stash list
Esto le mostrará todas sus reservas, en qué ramas se hicieron, y el mensaje y al comienzo de cada línea, e identificador para esa reserva que se ve así stash@{#}
donde # es su posición en la matriz de reservas.
Para restaurar un alijo (que se puede hacer en cualquier rama, independientemente de dónde se creó originalmente el alijo) simplemente ejecute ...
git stash apply stash@{#}
Una vez más, # es la posición en la matriz de escondites. Si el alijo que desea restaurar está en la 0
posición, es decir, si era el alijo más reciente. A continuación, sólo puede ejecutar el comando sin especificar la posición de escondite, git asumirá que quiere decir la última: git stash apply
.
Entonces, por ejemplo, si me encuentro trabajando en la rama incorrecta, puedo ejecutar la siguiente secuencia de comandos.
git stash
git checkout <correct_branch>
git stash apply
En su caso, se movió un poco más por las ramas, pero la misma idea aún se aplica.
Espero que esto ayude.
git stash