revertir - ignorar cambios git
¿Puedo eliminar un git commit pero guardar los cambios? (8)
Creo que estas buscando esto
git reset --soft HEAD ~ 1
lo llevará al compromiso anterior y conservará los cambios que haya realizado.
En una de mis ramas de desarrollo, hice algunos cambios en mi código base. Antes de poder completar las funciones en las que estaba trabajando, tuve que cambiar mi rama actual a master para probar algunas características. Pero solo usando un "git checkout master" conservé los cambios que también hice en mi rama de desarrollo, rompiendo así algunas de las funciones en master. Entonces, lo que hice fue confirmar los cambios en mi rama de desarrollo con un mensaje de confirmación "confirmación temporal" y luego retirar el master para la demostración.
Ahora que he terminado con la demostración y he vuelto a trabajar en mi rama de desarrollo, me gustaría eliminar el "compromiso temporal" que hice mientras aún conservaba los cambios que hice. ¿Es eso posible?
En mi caso, ya empujé al repo. ¡Ay!
Puede revertir un compromiso específico mientras mantiene los cambios en sus archivos locales haciendo lo siguiente:
git revert -n <sha>
De esta manera, pude mantener los cambios que necesitaba y deshacer una confirmación que ya se había enviado.
Es tan simple como esto:
git reset HEAD^
git reset
sin un --hard
o --soft
mueve tu HEAD
para que apunte a la confirmación especificada, sin cambiar ningún archivo. HEAD^
refiere al (primer) compromiso principal de su compromiso actual, que en su caso es el compromiso anterior al temporal.
Tenga en cuenta que otra opción es continuar normalmente, y luego, en el siguiente punto de confirmación, ejecute:
git commit --amend [-m … etc]
que en su lugar editará la confirmación más reciente, teniendo el mismo efecto que el anterior.
Tenga en cuenta que esto (como con casi todas las respuestas de git) puede causar problemas si ya ha empujado el compromiso incorrecto a un lugar donde alguien más lo haya sacado. Intenta evitar eso
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^
Devuelve su rama a la confirmación justo antes de su CABEZA actual. Sin embargo, en realidad no cambia los archivos en su árbol de trabajo. Como resultado, los cambios que se produjeron en esa confirmación se muestran como modificados, es como un comando "no comprometido". De hecho, tengo un alias para hacer precisamente eso.
git config --global alias.uncommit ''reset HEAD^''
Entonces puedes usar git uncommit
en el futuro para hacer una copia de seguridad de un compromiso.
Aplastamiento
Aplastar un compromiso significa combinar dos o más compromisos en uno. Hago esto muy a menudo. En su caso, tiene una característica a medio hacer comprometida, y luego la terminaría y se confirmaría nuevamente con el mensaje de confirmación permanente correcto.
git rebase -i <ref>
Digo más arriba porque quiero aclarar que esto podría ser cualquier número de confirmaciones. Ejecute git log
y encuentre la confirmación de la que desea deshacerse, copie su SHA1 y utilícelo en lugar de <ref>
. Git te llevará al modo de rebase interactivo. Mostrará todas las confirmaciones entre su estado actual y lo que coloque en lugar de <ref>
. Entonces, si <ref>
es hace 10 confirmaciones, le mostrará las 10 confirmaciones.
Delante de cada commit, tendrá la palabra pick
. Encuentre el compromiso del que desea deshacerse y cámbielo de pick
to fixup
o squash
. El uso de la fixup
simplemente descarta el mensaje de confirmación y combina los cambios en su predecesor inmediato en la lista. La palabra clave squash
hace lo mismo, pero le permite editar el mensaje de confirmación de la confirmación nueva 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. Por lo tanto, si realizó una confirmación temporal, luego realizó otro trabajo en la misma rama y completó la función en una confirmación posterior, luego usar rebase le permitiría reordenar las confirmaciones y aplastarlas.
ADVERTENCIA:
Rebasar modifica el historial: NO hagas esto con ningún compromiso que ya hayas compartido con otros desarrolladores.
Alijo
En el futuro, para evitar este problema, considere usar git stash
para almacenar temporalmente el trabajo no comprometido.
git stash save ''some message''
Esto almacenará sus cambios actuales al lado en su lista de alijo. Arriba está la versión más explícita del comando stash, que permite un comentario para describir lo que está escondiendo. También puede simplemente ejecutar git stash
y nada más, pero no se almacenará ningún mensaje.
Puedes navegar por tu lista de escondites con ...
git stash list
Esto le mostrará todos sus alijo, en qué ramas se hicieron, y el mensaje y al comienzo de cada línea, e identificador para ese alijo que se parece a este stash@{#}
donde # es su posición en el conjunto de alijos. .
Para restaurar un alijo (lo que se puede hacer en cualquier rama, independientemente de donde se creó originalmente el alijo) simplemente ejecuta ...
git stash apply stash@{#}
Una vez más, hay # es la posición en la matriz de escondites. Si el alijo que desea restaurar está en la posición 0
, es decir, si fue el alijo más reciente. Luego, solo puede ejecutar el comando sin especificar la posición de alijo, git asumirá que quiere decir el último: se 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 sucursales, pero la misma idea sigue siendo válida.
Espero que esto ayude.
Para aquellos que usan zsh, tendrás que usar lo siguiente:
git reset --soft HEAD/^
Explicado aquí: https://github.com/robbyrussell/oh-my-zsh/issues/449
En caso de que la URL esté muerta, la parte importante es:
Escapa de la ^ en tu comando
Alternativamente, puede usar HEAD ~ para que no tenga que escapar cada vez.
Sí, puede eliminar su confirmación sin eliminar los cambios: git reset @ ~
Una forma más de hacerlo.
Agregue commit en la parte superior del commit temporal y luego haga:
git rebase -i
Para combinar dos confirmaciones en una (el comando abrirá el archivo de texto con instrucciones explícitas, edítelo).
Usando git 2.9 (precisamente 2.9.2.windows.1) git reset HEAD^
solicita más; No estoy seguro de lo que se espera de entrada aquí. Por favor, consulte la siguiente captura de pantalla
Encontró otra solución git reset HEAD~#numberOfCommits
que podemos elegir para seleccionar el número de confirmaciones locales que desea restablecer manteniendo sus cambios intactos. Por lo tanto, tenemos la oportunidad de desechar todos los compromisos locales, así como un número limitado de compromisos locales.
Consulte las siguientes capturas de pantalla que muestran git reset HEAD~1
en acción: