Saltar al contenido

Introducción

undoing changes

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

bash
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 area

De 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

bash
git log --oneline

Si ejecutas el comando anterior, obtendrás un historial del proyecto que se parece a esto:

resultado de git log

bash
b7119f2 Changes in Scrabble Solver
234be24 Fixing search input bug 
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Usa el comando git checkout para ver el commit que deseas.

git checkout commit

bash
git checkout b235bf4

Despué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

bash
git checkout master

Una 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

bash
git log --oneline
863fa8e Making some improvements
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

A 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

bash
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 changes

Ahora 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

bash
git log --oneline
b235bf4 Make some changes to solver.php
256a81c Create solver.php
3243e12 Initial changes

Deshacer 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.

bash
# 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?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.