¿Cómo puedo deshacer las confirmaciones enviadas usando git?
Tengo un proyecto en un repositorio remoto, sincronizado con un repositorio local (desarrollo) y el del servidor (prod). He estado realizando algunos cambios confirmados que ya se enviaron al control remoto y se extrajeron del servidor. Ahora quiero deshacer esos cambios. Así que podría simplemente git checkout
realizar la confirmación antes de los cambios y confirmar los nuevos cambios, pero supongo que habrá problemas para enviarlos nuevamente a control remoto. ¿Alguna sugerencia sobre cómo debo proceder?
Puede revertir confirmaciones individuales con:
git revert <commit_hash>
Esto creará una nueva confirmación que revierte los cambios de la confirmación que especificó. Tenga en cuenta que solo revierte esa confirmación específica, y no las confirmaciones que vienen después. Si desea revertir un rango de confirmaciones, puede hacerlo así:
git revert <oldest_commit_hash>..<latest_commit_hash>
Revierte todas las confirmaciones posteriores <oldest_commit_hash>
hasta <latest_commit_hash>
. Algunas versiones de git también se revierten <oldest_commit_hash>
, así que verifique si esa confirmación se revierte o no. Siempre puedes descartar la última confirmación de reversión (que revierte la confirmación más antigua) con g reset --hard HEAD~
.
Para conocer el hash de las confirmaciones, puede utilizar git log
.
Mire la página de manual de git-revert para obtener más información sobre el git revert
comando. Además, consulte esta respuesta para obtener más información sobre cómo revertir confirmaciones.
Nota adicional para volver a aplicar confirmaciones revertidas:
Por lo general, revierte las confirmaciones porque descubre que las confirmaciones que impulsó resultan tener un problema. Luego, primero desea restaurar el repositorio a un estado estable, antes de continuar solucionando el problema. Entonces primero harías lo git revert
que se describió anteriormente. Luego presione esas confirmaciones de reversión, para que el control remoto sea estable. Después de eso, querrá volver a aplicar las confirmaciones revertidas localmente, de modo que los archivos de su repositorio local vuelvan al estado anterior a la reversión. Entonces podrás solucionar el problema.
Para volver a aplicar las confirmaciones revertidas, debe revertir las confirmaciones revertidas . Entonces, lo que haría es ejecutar nuevamente el git revert
comando, pero luego con el rango de confirmaciones de revertir confirmaciones . Por lo tanto, sus nuevas confirmaciones de reversión revertirán las confirmaciones de reversión anteriores. Luego, sus archivos vuelven al estado anterior a la primera reversión. Luego puede solucionar el problema, crear una nueva confirmación con la solución y luego enviar las nuevas confirmaciones.
Una solución que no deja rastros del "deshacer".
NOTA: No hagas esto si alguien ya obtuvo tu cambio (yo usaría esto solo en mi repositorio personal).
Correr:
git reset <previous label or sha1>
Nota: anterior significa la confirmación antes de la confirmación errónea
Esto volverá a verificar todas las actualizaciones localmente (por lo que git status
se enumerarán todos los archivos actualizados, es decir, los archivos que cambió/agregó/... y se confirmaron).
Luego "haces tu trabajo" y vuelves a confirmar tus cambios (Nota: este paso es opcional).
git commit -am "blabla"
En este momento su árbol local difiere del remoto
git push -f <remote-name> <branch-name>
obligará a la rama remota a realizar este envío y eliminar la anterior (especificar el nombre remoto y el nombre de la rama no es obligatorio, pero se recomienda para evitar actualizar todas las ramas con el indicador de actualización).
!! ¡Cuidado, es posible que algunas etiquetas aún apunten a confirmación eliminada! cómo-eliminar-una-etiqueta-remota