La guía definitiva para Git Reset y Git Revert

Bienvenido a nuestra guía definitiva de los comandos git resety git revert. Este tutorial le enseñará todo lo que necesita saber sobre cómo corregir errores comunes y deshacer malas confirmaciones mientras usa Git.

Comprender las tres secciones de un proyecto Git

Un proyecto de Git tiene las siguientes tres secciones principales:

  1. Directorio de Git
  2. Directorio de trabajo (o árbol de trabajo)
  3. Área de ensayo

El directorio de Git (ubicado en YOUR-PROJECT-PATH/.git/) es donde Git almacena todo lo que necesita para realizar un seguimiento preciso del proyecto. Esto incluye metadatos y una base de datos de objetos que incluye versiones comprimidas de los archivos del proyecto.

El directorio de trabajo es donde un usuario realiza cambios locales en un proyecto. El directorio de trabajo extrae los archivos del proyecto de la base de datos de objetos del directorio Git y los coloca en la máquina local del usuario.

Nota: El directorio también se conoce como repositorio o repositorio de formato corto. El repositorio en la máquina local del usuario se llama "Repositorio local", mientras que el repositorio en el servidor git se llama "Repositorio remoto".

El área de preparación es un archivo (también llamado "índice", "etapa" o "caché") que almacena información sobre lo que se incluirá en su próxima confirmación. Una confirmación es cuando le dices a Git que guarde estos cambios por etapas. Git toma una instantánea de los archivos tal como están y almacena permanentemente esa instantánea en el directorio de Git.

Con tres secciones, hay tres estados principales en los que un archivo puede estar en cualquier momento: modificado, confirmado o preparado. Usted modifica un archivo cada vez que se hacen cambios en su directorio de trabajo. A continuación, se pone en escena cuando lo mueve al área de preparación. Finalmente, se confirma después de una confirmación.

Restablecer Git

El git resetcomando le permite RESTABLECER su cabezal actual a un estado específico. Puede restablecer el estado de archivos específicos, así como una rama completa. Esto es útil si aún no ha enviado su confirmación a GitHub u otro repositorio remoto.

Restablecer un archivo o un conjunto de archivos

El siguiente comando le permite elegir de forma selectiva fragmentos de contenido y revertirlo o eliminarlo del escenario.

git reset (--patch | -p) [tree-ish] [--] [paths]

Desinstalar un archivo

Si movió un archivo al área de preparación con git add, pero ya no quiere que forme parte de una confirmación, puede usar git resetpara quitar la etapa de ese archivo:

git reset HEAD FILE-TO-UNSTAGE

Los cambios que realizó todavía estarán en el archivo, este comando simplemente elimina ese archivo de su área de ensayo.

Restablecer una rama a una confirmación anterior

El siguiente comando restablece el HEAD de su rama actual al dado COMMITy actualiza el índice. Básicamente, rebobina el estado de su rama, luego todas las confirmaciones que realiza en el futuro escriben sobre todo lo que vino después del punto de reinicio. Si omite MODE, el valor predeterminado es --mixed:

git reset MODE COMMIT

Las opciones para MODEson:

  • --soft: no restablece el archivo de índice o el árbol de trabajo, pero restablece HEAD en commit. Cambia todos los archivos a "Cambios para confirmar"
  • --mixed: restablece el índice pero no el árbol de trabajo e informa lo que no se ha actualizado
  • --hard: restablece el índice y el árbol de trabajo. Cualquier cambio en los archivos rastreados en el árbol de trabajo desde que commitse descarta
  • --merge: restablece el índice y actualiza los archivos en el árbol de trabajo que son diferentes entre commity HEAD, pero mantiene los que son diferentes entre el índice y el árbol de trabajo
  • --keep: restablece las entradas del índice y actualiza los archivos en el árbol de trabajo que son diferentes entre commity HEAD. Si un archivo que es diferente entre commity HEAD tiene cambios locales, el restablecimiento se cancela

Nota importante sobre reinicios físicos

Tenga mucho cuidado al usar la --hardopción con git resetya que restablece su confirmación, área de ensayo y su directorio de trabajo. Si esta opción no se usa correctamente, se puede terminar perdiendo el código escrito.

Git Revert

Ambos comandos git reverty git resetdeshacen confirmaciones anteriores. Pero si ya ha enviado su confirmación a un repositorio remoto, se recomienda que no la utilice, git resetya que reescribe el historial de confirmaciones. Esto puede dificultar mucho trabajar en un repositorio con otros desarrolladores y mantener un historial coherente de confirmaciones.

En su lugar, es mejor usar git revert, que deshace los cambios realizados por una confirmación anterior mediante la creación de una confirmación completamente nueva, todo sin alterar el historial de confirmaciones.

Revertir una confirmación o un conjunto de confirmaciones

El siguiente comando le permite revertir los cambios de una confirmación o confirmaciones anteriores y crear una nueva confirmación.

git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort

Opciones comunes:

 -e --edit
  • Esta es la opción predeterminada y no necesita establecerse explícitamente. Abre el editor de texto predeterminado de su sistema y le permite editar el nuevo mensaje de confirmación antes de confirmar la reversión.
  • Esta opción hace lo contrario de -ey git revertno abrirá el editor de texto.
  • Esta opción evita git revertdeshacer una confirmación anterior y crear una nueva. En lugar de crear una nueva confirmación, -ndeshará los cambios de la confirmación anterior y los agregará al índice de ensayo y al directorio de trabajo.
 --no-edit
-n -no-commit

Ejemplo.

Imaginemos la siguiente situación: 1.) Está trabajando en un archivo y agrega y confirma sus cambios. 2.) Luego trabajas en algunas otras cosas y haces algunos compromisos más. 3.) Ahora te das cuenta, hace tres o cuatro confirmaciones, hiciste algo que te gustaría deshacer, ¿cómo puedes hacer esto?

You might be thinking, just use git reset, but this will remove all of the commits after the one you would like to change - git revert to the rescue! Let's walk through this example:

mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`

And with that you're one step closer to getting your black belt in Git.