Como eliminar commits con git reset
Tags: git, programming, tutorial
Published: 2022-01-24 17:45:52


Para nadie es un secreto que el dominio del **control de versiones** es fundamental para ser un buen desarrollador, aquí es donde entra **Git** con sus innumerables comandos. En esta ocasión te mostraré como puedes eliminar commits a través del comando **git reset** y sus diferentes variantes.<br /><br />


### Para usar `git reset` es fundamental tener en cuenta lo siguiente:

1. Debemos haber inicializado previamente nuestro proyecto con el comando `git init`.

2. Debemos obtener la referencia del commit previo al que queremos eliminar.

3. Si queremos eliminar varios commits, debemos obtener la referencia del commit en el cual queremos posicionarnos y los posteriores a este serán los afectados.<br /><br />

### ¿Cómo obtengo la referencia de un commit?

1. Para buscar la referencia del commit debemos ir a la **lista de commits** con el comando `git log`.

2. Una vez usado este comando, se te mostrará una lista con los commits que has hecho, un mensaje que describe a cada uno y su respectivo identificador único, referencia de commit o también llamado hash.<br /><br />

### Ejemplo

Previamente, cree una carpeta llamada **ejemplo-git** donde inicialice **Git** con el comando `git init`, realice cuatro commits y utilice el comando `git log` para ver la lista completa de commits.

![Lista de commits](https://i.imgur.com/pr4l4Tm.jpg)<br />


## Uso de `git reset` y sus variantes

### - `git reset --mixed hash_del_commit`

Esta variante nos permite eliminar commits y enviar sus cambios a la zona de trabajo o en inglés llamado **working directory**, este es su comportamiento por defecto así que no es necesario emplear la bandera `--mixed`, pero es importante saberlo.

Cabe resaltar que si algún archivo que generaste en el commit que acabaste de eliminar no tenía cambios previos en otros commits, este dejara de tener seguimiento por **Git**, para restaurarlo solo debes enviarlo a la zona de preparación o en inglés llamado **staging area**.<br />

### Ejemplo

Continuaremos con el proyecto **ejemplo-git** donde ya había generado cuatro commits, en este caso procederé a eliminar el último commit donde había agregado un archivo README.md.

* Visualizamos la lista de commits con el comando `git log` y obtenemos el hash del commit previo al último, ya que ahí es donde queremos posicionar el proyecto, que elimine el commit posterior a este y lleve los cambios a la zona de trabajo.

![Lista de commits](https://i.imgur.com/K0GNzyX.jpg)

* Ejecutamos el comando `git reset --mixed` junto con el hash del
commit para completar la eliminación, verificamos que el archivo esté en la zona de trabajo con el comando `git status` y que ya no exista el commit en la lista con el comando `git log`.

![Comando git reset variante mixed](https://i.imgur.com/hgpdUPA.jpg)<br />

### - `git reset --soft hash_del_commit`

Esta variante nos permite eliminar commits y enviar sus cambios a la zona de preparación o en inglés llamado **staging area**. Normalmente, este comando lo podemos usar cuando nos faltó algún cambio que agregar en el último commit.<br /><br />

### Ejemplo

Continuamos en el proyecto **ejemplo-git** y lo que haremos será eliminar de nuevo el último commit, que en este caso es el commit donde agregue un archivo index.js.

- Visualizamos de nuevo la lista de commits con el comando `git log` y obtenemos el hash del commit previo.

![Lista de commits](https://i.imgur.com/62wGuBa.jpg)

- Ejecutamos el comando `git reset --soft` junto con el hash del
commit para completar la eliminación, comprobamos que el archivo esté en la zona de preparación con el comando `git status` y que ya no exista el commit en la lista con el comando `git log`.

![](https://i.imgur.com/W1rAutQ.jpg)<br />


### - `git reset --hard hash_del_commit`

Esta variante nos permite eliminar commits y sus cambios totalmente sin dejar rastro alguno.

Al emplear esta variante es fundamental verificar que no hayas hecho cambios en ningún otro archivo, ya que estos cambios también serian borrados, no importa si están en la zona de trabajo o de preparación, si ya tienen un seguimiento por **Git** serán afectados.

Para saber que archivos no tienen seguimiento por **Git**, podemos  utilizar el comando `git status` y estos aparecerán en el apartado de **untracked files**, este es el estado de todos los archivos que creamos y nunca han estado en la zona de preparación o que en algún momento los bajamos de allí.<br /><br />

### Ejemplo

Siguiendo con el proyecto **ejemplo-git**, ahora solo nos quedan dos commits y vamos a eliminar el último, que en este caso sería el commit donde agregue el archivo styles.css.

- Visualizamos de nuevo la lista de commits con el comando `git log` y obtenemos el hash del commit previo.

![](https://i.imgur.com/6EaevYr.jpg)

- Ejecutamos el comando `git reset --hard` junto con el hash del
commit para completar la eliminación, usamos el comando `git status` para verificar que no esté el archivo styles.css, también podremos ver que el index.js fue borrado y que el archivo README.md permaneció intacto por las razones anteriormente mencionadas. Para finalizar revisamos que ya no exista el commit en la lista con el comando `git log`.

![](https://i.imgur.com/RrYfWTr.jpg)<br />

#### IMPORTANTE

1. Recuerden que pueden eliminar más de un commit y decidir que hacer con los cambios de esos commits, a través de las variantes mostradas que te ofrece `git reset`, en este caso siempre elimine el último para llevar un orden y que se entendiera.

2. Si solo has creado un commit en tu proyecto `git reset` no funcionara como esperas, ya que este se basa en tener por lo menos dos commits. De tal modo que se necesita una referencia a un commit previo para poder devolver el proyecto a un estado anterior.

3. **git reset** es considerado por algunos como una mala práctica, así que utilízalo cuando sea realmente necesario, es muy probable que lo necesites para salir de algún apuro.<br /><br />

Si te gusto puedes compartirlo, además te invito a conectar conmigo en mi LinkedIn, seguiré generando este tipo de artículos sobre desarrollo frontend.

## 👇👇
## [LinkedIn](https://www.linkedin.com/in/jhon-esteban-herrera)<br/><br />

![](https://media.giphy.com/media/1J2FKJ31JKn4I/giphy.gif)