Deshacer cambios

Deshacer commits y cambios

En esta sección, abordaremos las estrategias y los comandos de Git que hay disponibles para deshacer acciones. Cabe destacar que Git no cuenta con un sistema tradicional para deshacer acciones como los de una aplicación de procesamiento de textos. Lo mejor es no relacionar las operaciones de Git con ningún modelo mental convencional al respecto. Además, Git tiene su propia nomenclatura para este tipo de operaciones, pero dejaremos este tema para otra ocasión. Esta nomenclatura incluye términos como “reset”, “revert”, “checkout” y “clean”, entre otros.

Una metáfora divertida consiste concebir Git como una utilidad de gestión de cronogramas. Las confirmaciones son instantáneas de un punto en el tiempo o puntos de interés a lo largo del cronograma del historial de un proyecto. Asimismo, se pueden gestionar varios cronogramas mediante ramas. Al deshacer una acción en Git, normalmente bien retrocedes en el tiempo o bien a otro cronograma en el que no se produjeron errores.

En este tutorial se ofrecen todas las habilidades necesarias para trabajar con las revisiones previas de un proyecto de software. En primer lugar, se muestra cómo explorar las confirmaciones antiguas. A continuación, se explica la diferencia que existe entre revertir confirmaciones públicas en el historial del proyecto y restablecer cambios no publicados en tu máquina local.

Encontrar lo que se ha perdido: revisar confirmaciones antiguas

git log --oneline
e2f9a78fe Replaced FlyControls with OrbitControls
d35ce0178 Editor: Shortcuts panel Safari support.
9dbe8d0cf Editor: Sidebar.Controls to Sidebar.Settings.Shortcuts. Clean up.
05c5288fc Merge pull request #12612 from TyLindberg/editor-controls-panel
0d8b6e74b Merge pull request #12805 from harto/patch-1
23b20c22e Merge pull request #12801 from gam0022/improve-raymarching-example-v2
fe78029f1 Fix typo in documentation
7ce43c448 Merge pull request #12794 from WestLangley/dev-x
17452bb93 Merge pull request #12778 from OndrejSpanel/unitTestFixes
b5c1b5c70 Merge pull request #12799 from dhritzkiv/patch-21
1b48ff4d2 Updated builds.
88adbcdf6 WebVRManager: Clean up.
2720fbb08 Merge pull request #12803 from dmarcos/parentPoseObject
9ed629301 Check parent of poseObject instead of camera
219f3eb13 Update GLTFLoader.js
15f13bb3c Update GLTFLoader.js
6d9c22a3b Update uniforms only when onWindowResize
881b25b58 Update ProjectionMatrix on change aspect
Tutorial de Git: extraer una confirmación anterior

Visualización de una versión antigua

En este ejemplo, se asume que has comenzado a desarrollar un disparatado experimento, pero no sabes con seguridad si quieres conservarlo o no. Para decidirte, quieres echar un vistazo al estado del proyecto antes de empezar el experimento. Primero, tendrás que encontrar el ID de la revisión que deseas ver.

git log --oneline

Pongamos que el historial del proyecto presenta un aspecto similar al siguiente:

b7119f2 Continue doing crazy things
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

Puedes usar git checkout para ver la confirmación “Make some import changes to hello.txt” de la siguiente manera:

git checkout a1e8fb5

This makes your working directory match the exact state of the a1e8fb5 commit. You can look at files, compile the project, run tests, and even edit files without worrying about losing the current state of the project. Nothing you do in here will be saved in your repository. To continue developing, you need to get back to the “current” state of your project:

git checkout main

Deshacer una instantánea confirmada

Técnicamente, existen varias estrategias diferentes para "deshacer" un commit. Los siguientes ejemplos presuponen que tenemos un historial de commits como el siguiente:

git log --oneline
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

We will focus on undoing the 872fa7e Try something crazy commit. Maybe things got a little too crazy.

Deshacer una confirmación con git checkout

Deshacer una confirmación pública con git revert

Supongamos que hemos vuelto a nuestro ejemplo de historial de commits original. El historial que incluye el commit 872fa7e. Esta vez vamos a probar a revertir una acción "deshacer". Si ejecutamos git revert HEAD, Git creará un nuevo commit con lo contrario del último. Esto añade un nuevo commit al historial de ramas actual que ahora tiene esta apariencia:

git log --oneline
e2f9a78 Revert "Try something crazy"
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

At this point, we have again technically 'undone' the 872fa7e commit. Although 872fa7e still exists in the history, the new e2f9a78 commit is an inverse of the changes in 872fa7e. Unlike our previous checkout strategy, we can continue using the same branch. This solution is a satisfactory undo. This is the ideal 'undo' method for working with public shared repositories. If you have requirements of keeping a curated and minimal Git history this strategy may not be satisfactory.

Deshacer una confirmación con git reset

git log --oneline
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

The log output shows the e2f9a78 and 872fa7e commits no longer exist in the commit history. At this point, we can continue working and creating new commits as if the 'crazy' commits never happened. This method of undoing changes has the cleanest effect on history. Doing a reset is great for local changes however it adds complications when working with a shared remote repository. If we have a shared remote repository that has the 872fa7e commit pushed to it, and we try to git push a branch where we have reset the history, Git will catch this and throw an error. Git will assume that the branch being pushed is not up to date because of it's missing commits. In these scenarios, git revert should be the preferred undo method.

Deshacer la última confirmación

Deshacer cambios no confirmados

El directorio de trabajo

Índice del entorno de ensayo

Deshacer cambios públicos

Cuando se trabaja en un equipo con repositorios remotos, se debe prestar especial atención a la hora de deshacer cambios. Por lo general, debería considerarse que git reset es un método local para deshacer acciones. El comando reset debería emplearse para deshacer cambios en una rama privada. De este modo, se aísla de forma segura la eliminación de las confirmaciones de otras ramas que otros desarrolladores puedan estar usando. Los problemas surgen cuando se ejecuta un reset en una rama compartida y luego esta se envía de manera remota mediante git push. En este escenario, Git impedirá el envío y objetará que la rama que se pretende enviar está desactualizada con respecto a la rama remota, ya que faltan confirmaciones.

El método preferido para deshacer un historial compartido es git revert. Un revert es más seguro que un reset porque no eliminará ningún commit de un historial compartido. Un revert conservará los commits que quiera deshacer y creará un nuevo commit que invierta el commit no deseado. Este método es más seguro para la colaboración remota compartida, porque un desarrollador remoto puede entonces "pedir" la rama y recibir el nuevo commit revertido que deshace el commit no deseado.

Resumen