git control de versiones

¿Quieres patrocinar?

¿Quieres aparecer aquí? Si quieres patrocinar este blog, ponte en contacto conmigo a través de este formulario

Aprende Git de manera sencilla: Deshaciendo y modificando commits

En este sexto artículo sobre la guía para aprender Git de manera sencilla y desde cero, vamos a ver cómo podemos deshacer commits. Git es un sistema de gestión de versiones, por lo tanto nos permite acceder a las diferentes versiones de un proyecto, y volver a una versión anterior del mismo.

Deshacer cambios no indexados

Este es el caso más sencillo de resolver. Simplemente tenemos cambios en uno o varios ficheros pero aún sin comitear. Para deshacer estos cambios, podemos usar el comando git reset con la siguiente sintaxis:

git reset --hard

Esto descartará los cambios que hemos hecho en local, dejando el repositorio con la última versión que teníamos indexada del proyecto en Git.

Si son pocos ficheros podemos deshacer también los cambios con git checkout:

# Un archivo concreto
git checkout [file_name]

# Varios archivos
git checkout .

Revisando el estado del repositorio en un commit anterior

El comando git checkout nos permitirá retroceder en el tiempo, hasta la versión indexada en un determinado commit. Para ello, usaremos la siguiente sintaxis:

# Para ir a un commit concreto utilizaremos su hash
git checkout [hash_commit]

# Para ir n commits hacia atrás podemos utilizar esta sintaxis
git checkout HEAD~[n]

Esto nos permitirá retroceder a versiones anteriores y detectar dónde se ha podido producir algún error. Esta acción no deshace ningún commit, simplemente nos sitúa en una versión concreta de nuestro proyecto.

Deshacer commits

Una situación bastante común. Se produce cuando hemos hecho cambios que queremos descartar, pero ya los hemos commiteado. En este caso, se pueden dar varias situaciones:

  1. Queremos deshacer el último (o los n últimos) commits realizados
  2. Queremos deshacer el último (o los n últimos) commits sin perder los cambios
  3. Queremos deshacer un único commit realizado hace tiempo
  4. Queremos deshacer todo en local y dejar el repo con la versión del repositorio remoto

1. Deshacer los últimos n commits

Utilizaremos el comando git reset con la siguiente sintaxis:

git reset --hard HEAD~[n]

Esto llevará la cabecera (el HEAD) de Git n commits hacia atrás, borrando esos últimos n commits del historial de Git. El flag --hard fuerza a los ficheros a volver a su estado anterior. Si n es 1 desharemos el último commit, si n es 2 desharemos los dos últimos commits y así sucesivamente.

NOTA

El uso de git reset en commit ya subidos al repositorio remoto puede provocar conflictos. Se recomienda utilizarlo únicamente para commits del repositorio local

2. Deshacer los últimos n commits sin perder los cambios

En ciertas ocasiones, nos puede interesar eliminar algunos commits del índice, pero sin perder los cambios realizados en ellos, por ejemplo si hemos comenzado a trabajar sobre la rama master y no nos hemos dado cuenta, nos va a interesar deshacer el commit pero preservar en local el trabajo realizado.

Utilizaremos el comando git reset, pero sin el flag --hard. Este comando deshace el commit, pero manteniendo el directorio en su estado actual.

git reset HEAD~[n]

Esto devolverá la cabecera del índice n commits mas abajo, pero manteniendo los ficheros del directorio de trabajo en su estado actual.

3. Deshacer un commit específico

Para deshacer un commit específico pero manteniendo los cambios de los commits realizados posteriormente, utilizaremos el comando git revert con la siguiente sintaxis:

git revert [hash_commit]

El hash de un commit es su identificador, y podremos obtenerlo con git log, comando que nos listará el historial de commits.

Para deshacer los cambios, git revert genera un nuevo commit, inverso al original. Esto permite que, dado el caso, podamos recuperar el commit revertido.

4. Deshacer todo y recuperar la versión del repositorio remoto

En algunas ocasiones, nos puede interesar descartar totalmente los cambios realizados en nuestro repositorio local y reemplazarlos por los del repositorio remoto.

Para esto, utilizaremos el comando git reset indicando en el origen nuestro repositorio remoto, de esta forma:

git reset --hard origin/[branch_name]

Esto deshará todos los cambios del stage, y los commit que tengamos sin subir, reemplazando estos por los últimos cambios almacenados en la rama indicada del repositorio remoto. Es descartar todo y empezar de nuevo como si hiciéramos un git clone.

Modificando commits

A veces necesitas añadir o quitar algo al último commit que se te ha podido pasar. No es necesario deshacer el commit para esto, siempre y cuando aún no lo hayas pusheado.

El argumento --amend de git commit nos permite hacer algunas modificaciones básicas, como añadir/quitar algún fichero o cambiar el mensaje asociado al commit. La sintaxis es sencilla:

git commit --amend

NOTA

Es recomendable modificar el commit antes de hacer el push. Modificarlo a posteriori puede dar lugar a conflictos

¿Te ha resultado útil esta información?

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.