Introducción

Descripción
En lugar de los sistemas tradicionales de “deshacer”, Git tiene su propio sistema con una terminología completamente distinta, que incluye términos como git clean, git rm, git reset y así sucesivamente. Cada uno de estos comandos tiene funciones específicas y se usa para deshacer cambios en los repositorios locales y públicos.
Revisión de commits antiguos
Después de crear un historial del proyecto, es posible revisar todos los commits del historial. La mejor herramienta para revisar commits antiguos se considera git log. Cada commit tiene su hash identificador, que se usa para volver a visitar commits.
Introducción
git log --oneline
a3b2a21ad Crossword solver with Vue.js
c54ce0237 New logic for crossword game
3acb8d0de Some changes in crossword logic
de32112e3 Styling crossword table areaDe forma predeterminada, git log muestra solo los commits de la rama seleccionada. Para ver todos los commits en todas las ramas, ejecuta el comando git log --all. Usa git checkout o git switch para visitar otras ramas.
Visualización de revisiones antiguas
Si quieres ver el estado del proyecto antes de empezar un nuevo experimento, primero tienes que encontrar el hash identificador de la revisión que quieres ver. Puedes hacerlo con la ayuda del comando git log:
git log --oneline
git log --onelineSi ejecutas el comando anterior, obtendrás un historial del proyecto que se parece a esto:
resultado de git log
b7119f2 Changes in Scrabble Solver
234be24 Fixing search input bug
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesUsa el comando git checkout para ver el commit que deseas.
git checkout commit
git checkout b235bf4Después de esto, tendrás la oportunidad de ver los archivos, ejecutar pruebas, etc. Incluso si editas archivos, puedes estar seguro de que el estado actual de tu proyecto no se perderá, porque todo lo que hagas aquí no se guardará en el repositorio. Ejecuta el comando git checkout master para volver al estado actual de tu proyecto y continuar desarrollando.
git checkout branch
git checkout masterUna vez de vuelta en la rama master, puedes usar git revert o git reset para deshacer cualquier cambio que quieras.
Deshacer una instantánea confirmada
Existen diferentes formas de deshacer un commit. Imaginemos que el historial de commits se ve así:
Deshacer una instantánea confirmada
git log --oneline
863fa8e Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesA continuación usaremos diferentes métodos para deshacer el commit 863fa8e Making some improvements.
Deshacer commits con git checkout
El comando git checkout hará checkout del commit anterior, b235bf4, dejando el repositorio en un estado anterior al commit de mejoras. Como resultado, el estado del repositorio será "detached HEAD". Estar en un estado detached significa que cada nuevo commit realizado quedará huérfano cuando las ramas vuelvan a cambiar a una rama establecida. Los commits huérfanos pueden ser eliminados eventualmente por el recolector de basura de Git. Para evitar perder trabajo, crea una rama a partir de este estado. Desde el estado detached HEAD del repositorio, puedes invocar git checkout -b new_branch_without_improvement_commit. En consecuencia, tendrás una nueva rama llamada new_branch_without_improvement_commit y cambiarás a ese estado. Ahora tenemos una nueva línea de historial sin el commit 863fa8e. En esta etapa, cuando ya no tenemos el commit 863fa8e, podemos ver algunas estrategias para deshacer cambios.
Deshacer un commit público con git revert
El comando git revert HEAD crea un nuevo commit con el equivalente inverso del último commit y se añade un nuevo commit a la rama actual:
Deshacer un commit público con git revert
git log --oneline
23a4b42 Revert "Making some improvements"
234be24 Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesAhora el commit 234be24 vuelve a estar deshecho; aunque sigue estando en el historial, el nuevo commit 23a4b42 es una reversión de las modificaciones de 234be24. A diferencia del método anterior con checkout, todavía puedes usar la misma rama. Este es el método de “deshacer” perfecto para trabajar con repositorios compartidos públicamente.
Deshacer un commit con git reset
Git reset es un comando completo que tiene varios usos y funciones. Al ejecutar git reset --hard b235bf4, el historial de commits se restablecerá a ese commit indicado. En este punto, al invocar git log se mostrará que el historial se ve así:
Deshacer un commit con git reset
git log --oneline
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changesDeshacer el último commit
Las estrategias de deshacer descritas arriba funcionan igual para el último commit. Pero en algunos casos no necesitarás eliminar o restablecer el commit más reciente. Puede que simplemente se haya hecho demasiado pronto. En tal caso, puedes modificar ese commit reciente ejecutando git commit --amend, una vez que se hayan hecho más cambios en el directorio de trabajo y se hayan preparado para el commit con git add. En este punto, Git abrirá el editor del sistema configurado, permitiéndote modificar el mensaje del último commit. Estos nuevos cambios se añadirán al commit modificado.
Deshacer cambios no confirmados
Los cambios están en el índice de staging y en el directorio de trabajo antes de ser confirmados en el historial del repositorio. Así que quizá quieras deshacerlos desde estas dos áreas. Si quieres más información sobre estas dos áreas, considera git reset.
# Unstage a file
git reset HEAD <file>
# Discard changes in the working directory
git checkout -- <file>El directorio de trabajo
El directorio de trabajo representa los archivos del sistema de archivos de tu computadora, que están disponibles para que el editor de código aplique cambios. Git tiene algunas herramientas para gestionar el directorio de trabajo, incluidos los comandos git clean y git reset.
El índice de staging
El índice de staging es uno de los árboles de Git. Rastrea los cambios confirmados en el directorio de trabajo. El comando que añade cambios al área de staging es git add. Aquí podemos usar el comando git reset para deshacer cambios. Un reset --mixed mueve los cambios desde el índice de staging al directorio de trabajo.
Deshacer cambios públicos
La mejor forma de deshacer cambios públicos es usar el comando git revert. Nunca uses git reset para este propósito, porque eliminará los commits del historial compartido. Está diseñado para deshacer cambios locales en el directorio de trabajo y en el índice de staging. Git revert guardará los commits que quieres deshacer y creará un nuevo commit en lugar del que no necesitas.
Práctica
¿Cuáles son las funciones de los distintos comandos de Git usados para deshacer cambios y commits?