En esta página:
En la Primera Parte de este tutorial aprendimos a deshace commits de manera local, la manera local es el entorno inicial en donde se realizan los cambios que posteriormente son publicados el repositorio remoto como GitHub, BitBucket, etc. En esta segunda parte y última vamos aprender a deshacer commits de manera remota, vamos con este Post.
Partes
- Parte 1
- Parte 2 (Final)
Antes de continuar, te invito a leer los siguientes artículos para que estés familiarizado con este tutorial:
- Que es Git, como utilizarlo y otros detalles
- Conceptos y Técnicas de Git que debes saber antes de unirte a un Equipo de Git – Parte 1
- Que son las Ramas (Branches) en Git, como utilizarlas y otros detalles
- Como usar la versión GUI de Git (No Consola GitBash)
- Puedes leer más en la categoría Git
Asimismo te invito a escuchar el Podcast: “Dominio del trabajo con Varios Lenguajes de Programación”:
Spotify | SoundCloud | Apple Podcasts |
Bien ahora continuemos con el Post: Como Deshacer Commits en Git (Forma Local y Remota) – Parte 2 (Final).
Para este Post haré uso de este repositorio el cual pertenece al tutorial llamado Como Crear un Reloj Digital (Numérico) con JavaScript.
Bueno ahora pasemos a realizar operaciones en el repositorio de manera remota.
Deshaciendo Remotamente Commits ya Enviados
En ocasiones hacemos cambios en un repositorio local que no son necesarios y aún así lo enviamos por descuido a nuestro repositorio remoto. Ahora debemos pensar en hacer cambios en el proceso, porque también otros usuarios que tienen acceso al repositorio remoto, puede extraer los últimos cambios y usarlos como si no se cambiara el historial de git.
El mejor enfoque y más seguro es aceptar el error y crear un commit adicional para retirar los cambios innecesarios. Al hacer esto, el historial de git será estable, pero el error estará allí para siempre.
Lo primero que haremos es ver el historial de commits escribiendo el comando git log –oneline en nuestra consola de comandos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
git log --oneline 5eb3c4c (HEAD -> main, origin/main, origin/HEAD) Cambios e05abff Cambios 7c89bc5 Delete test.rar 663c8d1 Cambios bf2fd02 Cambios 08c3d2f Cambios 65006a0 Delete pruebita.txt 77056cc Cambios 78bc78d Cambios 54c860e Matraka 47734fd Cabios 575440c Cambios ef5d160 Cambis 2997b70 Update app.css 3853b80 Add files via upload e906c41 Update README.md 8de44d8 Initial commit |
Puedes ver que al inicio de cada fila hay un string que es el git commit id o también llamado git commit hash, luego viene la información de la rama que viene con el mensaje de git commit. Si tienes muchos commits y no puedes salir de ellos, puedes presionar la tecla q para poder salir.
Al principio puedes ver que HEAD indica la última confirmación en la rama actual, entonces podemos hacer uso del comando git revert en nuestro último commit escribiendo git revert HEAD.
1 2 3 4 5 6 |
git revert HEAD Removing test.txt hint: Waiting for your editor to close the file... |
Luego de ejecutar el comando anterior, se me abrirá el archivo COMMIT_EDITMSG en mi editor de texto predeterminado, yo uso Sublime Text 3.
En la consola se queda el mensaje Waiting for your editor to close the file… (Esperando a que su editor cierre el archivo …) .
Al inicio del archivo abierto en el editor podemos leer el texto que dice Revert “Cambios”, bueno lo voy a editar y le pondré “Cambios Realizados”, luego guardo el archivo y cierro el editor y en la consola de comandos se me ejecuta nuevamente de manera automática el comando git revert HEAD y me aparece el cambio del texto que he realizado.
1 2 3 4 5 6 7 8 |
git revert HEAD Removing test.txt [main 3f4972a] Revert "Cambios Realizados" 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test.txt |
Y si ejecuto de nuevo el comando git rever HEAD se me volverá a abrir el editor de código y podré ver el cambio realizado.
O si vuelvo a revisar el historial de commits con el comando git log –online, puedo ver que el mensaje del último cambio fue editado correctamente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ git log --oneline 0c28d43 (HEAD -> main) Revert "Cambios Realizados" 5eb3c4c (origin/main, origin/HEAD) Cambios e05abff Cambios 7c89bc5 Delete test.rar 663c8d1 Cambios bf2fd02 Cambios 08c3d2f Cambios 65006a0 Delete pruebita.txt 77056cc Cambios 78bc78d Cambios 54c860e Matraka 47734fd Cabios |
Entonces ahora tengo un commit adicional de git revert que deshace los cambios en el commit de “Cambios” al no interferir con el historial de git. Esta es la operación más segura que deberías preferirse hacer en la mayoría de los casos.
Deshaciendo Remotamente varios Commits
Supongamos que estas trabajando en una rama que a nadie le importa todavía. Solo estas implementando funciones experimentales. Entonces ha llegado el momento, debes enviar una solicitud de extracción con su rama de características.
Pero sucede que tienes muchos commits innecesarios y los quieres deshacer, lo primero que debes hacer es ejecutar el comando git log –oneline para verificar que la rama se confirma.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ git log --oneline 0c28d43 (HEAD -> main) Revert "Cambios Realizados" 5eb3c4c (origin/main, origin/HEAD) Cambios e05abff Cambios 7c89bc5 Delete test.rar 663c8d1 Cambios bf2fd02 Cambios 08c3d2f Cambios 65006a0 Delete pruebita.txt 77056cc Cambios 78bc78d Cambios 54c860e Matraka 47734fd Cabios |
Y supongamos que luego elegimos mantener solo algunos commits y deshacernos de los demás. Hay un comando git genial que es git rebase interactive. Solo necesitamos pasarle como punto de partida un git commit id.
Seleccionaré el commit id e05abff dentro del comand git rebase interactive.
1 2 3 4 5 |
git rebase -i e05abff hint: Waiting for your editor to close the file... |
Se me abrirá el archivo git-rebase-todo en mi editor de código predeterminado y en la consola se queda el mensaje Waiting for your editor to close the file… (Esperando a que su editor cierre el archivo …) .
En el archivo, para los commits que quiero eliminar coloco la letra d en vez de la palabra pick. Puedes ver en la siguiente imagen que coloco una letra d en ves de la palabra pick a los commits que quiero eliminar.
Paso seguido guardo los cambios y cierro mi editor de código, en la consola se ejecuta automáticamente los cambios.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
git rebase -i e05abff interactive rebase in progress; onto e05abff Last commands done (10 commands done): drop 5db843c "Revert "Cambios Realizados"" pick 8e99805 Revert "Cambios" (see more in file .git/rebase-merge/done) Next commands to do (4 remaining commands): pick 7cf01f4 Revert "Cambios Realizados" drop 0050a3c Revert "Revert "Cambios Realizados"" (use "git rebase --edit-todo" to view and edit) You are currently rebasing branch 'main' on 'e05abff'. (all conflicts fixed: run "git rebase --continue") nothing to commit, working tree clean The previous cherry-pick is now empty, possibly due to conflict resolution. If you wish to commit it anyway, use: git commit --allow-empty Otherwise, please use 'git rebase --skip' Could not apply 8e99805... Revert "Cambios" |
Y si ejecuto el comando git log –oneline puedo ver que los commits desaparecieron.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
git log --oneline 8c23ab9 (HEAD) Revert "Cambios Realizados" 6ee538e Revert "Cambios Realizados" c17274a Revert "Cambios Realizados" 5eb3c4c Cambios e05abff Cambios 7c89bc5 Delete test.rar 663c8d1 Cambios bf2fd02 Cambios 08c3d2f Cambios 65006a0 Delete pruebita.txt 77056cc Cambios 78bc78d Cambios 54c860e Matraka 47734fd Cabios 575440c Cambios ef5d160 Cambis 2997b70 Update app.css 3853b80 Add files via upload e906c41 Update README.md 8de44d8 Initial commit |
Con esto entonces nos deshacemos de los commits no deseados. No olvides que es una operación destructiva y debes usarla con precaución.
Conclusión
En este Post que consta de 2 partes hemos aprendido a deshacer ciertos commits de manera local y remota. Conforme practiques los comandos mencionados, lograrás dominarlos.
Nota (s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.