Deshacer commits enviadas en Git con Reset y Revert
-
Deshacer commits empujadas con el comando
git reset
-
Deshacer commits empujadas con el comando
git revert
-
Deshacer commits empujadas con el comando
git checkout
Mostramos tres métodos para deshacer commits enviadas desde un repositorio remoto en Git. Usamos los comandos git reset
, revert
y checkout
para esto.
Cuando usamos git reset
, también eliminamos cualquier rastro de las commits no deseadas del historial del repositorio. Pero con git revert
, tanto el compromiso original como el de deshacer permanecen en el historial.
Si usamos git checkout
, deshacemos los cambios en una nueva rama.
Deshacer commits empujadas con el comando git reset
Creamos un repositorio undo_pushed_commits_local
y lo llenamos con algunas commits saludables (buenas).
mkdir undo_pushed_commits_local
git init
Luego agregue/modifique archivos.
git add --all
git commit -m "Make healthy commit"
Agregar/modificar más archivos.
git add -all
git commit -m "Make another healthy commit"
Ahora enviaremos estas commits al repositorio undo-pushed-commits-remote
en GitHub.
git remote add undo-remote git@github.com:danielturidandy/undo-pushed-commits-remote.git
git push undo-remote master
Nuestro repositorio remoto ahora tiene dos commits.
Ahora, hagamos el commit malo.
echo "This is a bad addition" >> file1.txt
echo "This is a bad addition" >> file2.txt
git add -all
git commit -m "Make a bad commit"
Enviamos este compromiso al repositorio remoto.
git push undo-remote
Nuestro control remoto tiene el compromiso incorrecto:
Ahora restablecemos a la última confirmación buena en nuestro repositorio local. Usamos la opción --hard
para eliminar cualquier rastro de las commits incorrectas del historial de commits.
git log
git reset --hard <SHA of the last good commit>
Hacemos push
del repositorio local al remoto con la opción -f para forzar el push.
git push -f undo-remote
Este método funciona mejor con repositorios privados o repositorios con equipos pequeños.
Los equipos grandes pueden enfrentar problemas si algunos desarrolladores llevan el control remoto a su entorno local después de enviar las commits incorrectas antes de que restablezcamos a un buen estado. No tienen un historial de commits con información de las commits incorrectas para corregir sus repositorios.
Deshacer commits empujadas con el comando git revert
Aquí hemos empujado cuatro compromisos incorrectos al repositorio remoto.
Podemos usar revert
para deshacer una soel commit incorrecta o un rango de commits incorrectas.
revert
crea una nueva confirmación que revierte el commit no deseada. Tanto las commits originales como las invertidas permanecen en el historial del repositorio.
Deshacer una soel commit empujada con revert
git revert <SHA of the commit we want to revert>
Ahora insertamos este cambio en el repositorio remoto. Recuerde usar el indicador -f para asegurarse de que no surjan conflictos.
git push -f undo-remote
Nuestro repositorio remoto ahora tiene la nueva confirmación que revierte la mael commit.
Deshacer un rango de commits empujadas con revert
git revert <SHA of the oldest commit to revert>..<SHA of the newest commit to revert>
Esto revertirá todas las commits en el rango proporcionado (sin incluir el commit más antigua, pero esto también puede depender de la versión/plataforma que utilice).
Ahora empujamos los cambios al control remoto con el indicador -f.
git push -f undo-remote
Este método es ideal para repositorios públicos con grandes equipos trabajando en ellos. Como tanto las commits incorrectas como las de deshacer permanecen en el historial, los desarrolladores pueden mantener sus repositorios locales actualizados con todas las inserciones/reversiones incorrectas.
Deshacer commits empujadas con el comando git checkout
Esta técnica es un truco rápido que bifurca una nueva rama sin las malas commits. Es ideal para bases de código pequeñas y si tiene poco tiempo.
Primero hacemos un checkout
a la última confirmación buena.
git checkout <SHA of last known good commit>
Luego alcanzamos un estado HEAD separado en la última confirmación buena conocida en el historial del repositorio.
Aquí ahora bifurcamos una nueva rama de este estado.
git checkout -b branch_without_badcommits
Luego lo empujamos en el control remoto a una nueva rama.
git push -f undo-remote branch_without_badcommits
El repositorio remoto ahora tiene una nueva rama sin ningun commit incorrecta.