Diferencia entre los comandos Git Reset, Revert y Checkout

John Wachira 15 febrero 2024
  1. Diferencia entre los comandos Git Reset, Git Revert y Git Checkout
  2. Git Reset frente a Git Revert frente a Git Checkout
  3. Operaciones de nivel de compromiso
  4. Operaciones a nivel de archivo
Diferencia entre los comandos Git Reset, Revert y Checkout

Este artículo analiza la diferencia entre los comandos git reset, git revert y git checkout. Estas son algunas de las utilidades de Git más útiles que nos permiten deshacer algunos cambios en nuestros repositorios.

Es fácil mezclar los comandos, pero al final de este artículo, habrá ganado la confianza para usar y navegar su repositorio con los comandos anteriores.

Diferencia entre los comandos Git Reset, Git Revert y Git Checkout

Será más fácil entender estos comandos si tenemos claro el efecto de cada comando en los tres componentes principales de un repositorio de Git.

  1. El directorio de trabajo
  2. Instantánea preparada
  3. Historial de confirmaciones

También podemos llamar a los componentes anteriores los Tres árboles.

Pago Git

¿A qué nos referimos con revisar?

Esta operación reubica el puntero HEAD a una confirmación específica.

pago git

La imagen de arriba muestra una secuencia de confirmaciones en un repositorio de Git. Los punteros de rama HEAD y main están actualmente en la confirmación d.

Podemos mover nuestra referencia HEAD a cualquier confirmación usando el comando git checkout.

Por ejemplo, para mover nuestra referencia HEAD al commit b, ejecutaremos:

$ git checkout -b

Podemos usar el comando git checkout a nivel de confirmación y archivo. Desproteger a nivel de archivo actualizará el contenido del archivo con el contenido de la confirmación especificada.

Git Revertir

Al revertir, tomamos una confirmación específica y creamos una nueva que revierte el efecto de la confirmación especificada. La confirmación git revert solo tiene efecto en el nivel de confirmación y no tiene funcionalidad a nivel de archivo.

Restablecer Git

Al restablecer, tomamos una confirmación específica, restablecemos los Tres árboles y actualizamos un repositorio para que coincida con el estado del repositorio en la confirmación especificada. Podemos restablecer en tres modos diferentes correspondientes a los tres árboles.

Normalmente usamos el git reset y el git checkout para deshacer cambios locales o privados. Ambos modifican el historial de un repositorio y pueden generar conflictos cuando se envían a los repositorios compartidos o públicos remotos.

Git Reset frente a Git Revert frente a Git Checkout

La siguiente tabla proporciona algunos casos de uso comunes para los tres comandos.

Dominio Alcance Casos de uso comunes
restablecer git Nivel de compromiso Elimine las confirmaciones en una rama localmente o descarte los cambios no confirmados.
restablecer git Nivel de archivo Quitar la etapa de un archivo del índice.
git pago Nivel de compromiso Inspeccione confirmaciones antiguas y cambie de rama.
git pago Nivel de archivo Deseche los cambios en el directorio de trabajo.
git revertir Nivel de compromiso Revertir los efectos de un commit en sucursales públicas.
git revertir Nivel de archivo (N / A)

Operaciones de nivel de compromiso

Pasamos parámetros a los comandos git reset y git checkout para invocar diferentes niveles de operación. Si fallamos al incluir un parámetro de archivo, los comandos actúan sobre la confirmación como un todo.

Restablecer una confirmación

Restablecer en el nivel de compromiso moverá la referencia HEAD a un compromiso específico. Podemos usar este comando para eliminar confirmaciones de una rama.

Aquí hay un ejemplo.

$ git reset HEAD~3

El comando anterior moverá la punta de nuestra rama hacia atrás tres confirmaciones. Podemos referirnos a ellos como compromisos colgantes o huérfanos.

Hemos descartado los tres commits. Es mejor usar el comando para eliminar las confirmaciones que no hemos publicado en un repositorio compartido remoto.

También podemos usar el comando git reset para cambiar la instantánea preparada y el directorio de trabajo pasando uno de los siguientes indicadores.

  1. --soft: no modifica los cambios por etapas ni el directorio de trabajo.
  2. --mixed: no afecta el directorio de trabajo, pero altera la instantánea preparada para que coincida con la confirmación especificada.
  3. --hard: altera tanto el directorio de trabajo como la instantánea preparada para que coincida con la confirmación especificada.

Revisar confirmaciones antiguas

Podemos usar el comando git checkout para inspeccionar el estado de un repositorio en una confirmación específica. También podemos pasar nombres de sucursales para cambiar entre sucursales.

Aquí hay un ejemplo.

$ git checkout feature

El comando anterior cambiará a la rama característica. No moverá las ramas.

También podemos inspeccionar confirmaciones arbitrarias pasando un hash o referencia de confirmación en lugar de un nombre de rama. Aquí hay un ejemplo.

$ git checkout HEAD~1

El comando anterior verificará el padre de nuestro compromiso actual. Pasar HEAD~2 comprobará al abuelo.

El comando anterior nos cambiará al modo HEAD separado porque nuestro HEAD actual no tiene una referencia de rama.

No se podrá acceder a todos los cambios y confirmaciones realizados en el modo HEAD separado una vez que cambie a otra rama. Cree siempre una nueva rama cuando desee realizar cambios mientras se encuentra en el estado separado HEAD.

Revertir confirmaciones compartidas

Cuando revertimos confirmaciones, creamos una nueva confirmación que revierte los efectos de la confirmación especificada. De esta forma, evitamos volver a escribir el historial de confirmaciones de los repositorios compartidos.

Por ejemplo, si queremos revertir la confirmación más reciente, ejecutaremos:

$ git revert HEAD

Operaciones a nivel de archivo

Los comandos git checkout y git reset aceptan una ruta de archivo como parámetro opcional. Los efectos de los comandos están limitados a un solo archivo.

Restablecer un archivo

Podemos actualizar la instantánea preparada de un archivo para que coincida con la versión de la confirmación especificada, como se muestra a continuación.

$ git reset HEAD~1 README.md

El comando anterior obtendrá la versión del archivo README.md en la confirmación principal de la confirmación actual y la agregará al índice para la próxima confirmación. Podemos ejecutar git reset HEAD README.md para eliminar el archivo README.md.

Archivo de pago de Git

Pasar una ruta de archivo al comando git checkout actualiza el directorio de trabajo en lugar de la instantánea preparada. Esto no moverá el puntero HEAD entre ramas.

Aquí hay un ejemplo.

$ git checkout HEAD~1 README.md

Esto obtendrá la versión del archivo README.md de la confirmación principal de nuestra confirmación actual y actualizará el archivo README.md solo en nuestro directorio de trabajo. Simplemente significa que hemos vuelto a la versión del archivo en la confirmación anterior.

A diferencia del comando git revert que revierte los cambios introducidos por la confirmación especificada, este descarta todos los cambios posteriores. Podemos usarlo para descartar cambios no preparados en un solo archivo, como se muestra a continuación.

$ git checkout HEAD README.md

En conclusión, podemos diferenciar fácilmente entre los comandos git reset, git revert y git checkout al comprender los efectos de cada comando en el historial de confirmación, la instantánea preparada y el directorio de trabajo.

John Wachira avatar John Wachira avatar

John is a Git and PowerShell geek. He uses his expertise in the version control system to help businesses manage their source code. According to him, Shell scripting is the number one choice for automating the management of systems.

LinkedIn

Artículo relacionado - Git Revert

Artículo relacionado - Git Reset