- 1. Git Config
- 2. Iniciando o Clonando un repositorio
- 3. Comandos Básicos
- 4. El archivo .gitignore
- 5. Trabajando con ramas
- 6. Deshaciendo y modificando commits
- 7. Commits Semánticos
- 8. Tags
- 9. Comandos Avanzados
- 10. Gita Aliases
- 11. Git Flow
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:
- Queremos deshacer el último (o los n últimos) commits realizados
- Queremos deshacer el último (o los n últimos) commits sin perder los cambios
- Queremos deshacer un único commit realizado hace tiempo
- 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