Curso
Si alguna vez has trabajado en un proyecto de codificación en grupo, sabrás lo rápido que pueden torcerse las cosas cuando intentas deshacer un cambio. Un movimiento en falso, y podrías echar por tierra tu propio trabajo, o peor aún: romper algo que tu compañero de equipo acaba de empujar.
Por eso es tan importante entender qué ofrece Git para deshacer errores, y cuándo utilizar cada opción. Algunos comandos son seguros para entornos de equipo, mientras que otros son mejores para la limpieza local de , donde no te importa reescribir la historia.
Esta guía te lo explica todo. Aprenderás las distintas formas de deshacer commits, cómo funcionan y a cuál recurrir en función de la situación.
Comprender el historial de confirmaciones de Git
¿Alguna vez has pulsado "Ctrl+S" para guardar una versión de un documento y volver a ella más tarde? Eso es exactamente lo que hace un commit de Git, pero para toda tu base de código.
¿Qué es un commit en Git?
Un git commit es la instantánea de tu proyecto en un momento determinado. Congela el estado actual de todos tus archivos y asigna a esa versión un ID único, como si hicieras una foto con fecha y hora de tu código. Siempre puedes rebobinar hasta ese punto si algo se rompe más tarde.
¿Cómo funciona? Cuando modificas un archivo de tu repositorio, los cambios no se almacenan inmediatamente. En su lugar, existen localmente en tu directorio de trabajo actual. Para guardarlos, estos cambios se ponen en escena y luego se envían al repositorio. Tu historial de confirmaciones es el registro de todas las confirmaciones realizadas en un repositorio.
Confirmaciones locales frente a remotas
Los commits locales permanecen en tu máquina y no son visibles para tus colegas o colaboradores hasta que decidas compartirlos. Eso significa que tienes más control sobre ellos: puedes reescribir el historial, aplastar, borrar o restablecer sin afectar a nadie más.
Los commits remotos, en cambio, son accesibles a todos los que trabajan en el repositorio. Eso significa que no debes reescribir ni borrar estos commits. Hacerlo rompe las cosas para tus compañeros de equipo si están utilizando la misma rama remota. Así que debes ser prudente y consciente de lo que haces antes de reescribir la historia compartida.
Deshacer localmente la última confirmación Git
En Git, HEAD apunta a la última confirmación en el historial de tu proyecto. Cuando utilizas el comando git reset
, le estás diciendo a Git que mueva ese puntero a una confirmación diferente.
Veamos cómo utilizar git reset
para deshacer la última confirmación en varios casos.
Usando git reset --soft HEAD~1
Hace retroceder a HEAD a una confirmación, pero deja tus cambios en el área de preparación. Tus archivos están intactos, y todo lo que comprometiste sigue en cola en la zona del escenario. Utilízalo cuando quieras deshacer la confirmación en sí, pero manteniendo todos los cambios preparados y organizados.
Usando git reset --mixed HEAD~1
Éste va un paso más allá. También hace retroceder a HEAD a un commit, pero despeja el área de preparación. Tus archivos siguen en tu directorio de trabajo, pero ya no hay nada preparado. Este es el modo por defecto de git reset
.
Usando git reset --head HEAD~1
Hace retroceder a HEAD, limpia el área de preparación y borra los cambios en tu directorio de trabajo. Es como si el último commit (y todos los cambios que lo acompañan) nunca hubieran existido.
Utilízalo con cuidado: una vez que esos cambios desaparecen, es difícil recuperarlos. Por tanto, ejecuta esto sólo si estás absolutamente seguro de que no necesitas nada de esa última confirmación.
Ejemplo 1: Deshacer la última confirmación localmente (reelaboración segura)
Digamos que acabas de hacer un commit, pero te has dado cuenta de que has olvidado actualizar el archivo README.
Escenario:
Confirmaste cambios en main.py
, pero olvidaste actualizar README.md
. Quieres modificar la última confirmación sin afectar a nadie más, y aún no has enviado nada.
Solución:
Utiliza git reset --soft HEAD~1
para deshacer la confirmación y mantener tus cambios:
git reset --soft HEAD~1
Ahora, actualiza tu archivo README, añádelo al escenario y vuelve a comprometerlo todo:
git add README.md
git commit -m "Update main.py and README.md"
✅ Por qué funciona: Como la confirmación no se ha enviado, puedes reescribir la historia local sin afectar a nadie.
Deshacer una Confirmación Git Empujada
Así que empujaste un commit... y ahora te arrepientes. Todos hemos pasado por eso. Pero, ¿cómo deshacerlo sin romper el trabajo de los miembros de tu equipo?
Reescribiendo el historial con git push --force
Normalmente, Git sólo te permite hacer push si tu rama local está recién sacada y actualizada con la remota. Pero puedes anular esta regla utilizando un comando de superpoder como push --force
. Sobrescribe todo el historial remoto con lo que haya en tu rama local.
Por eso --force
es poderoso pero peligroso. En un entorno de equipo, puede eliminar los commits de tus compañeros si no han sido arrastrados a tu rama local. Úsalo sólo cuando sepas exactamente lo que estás haciendo, e idealmente, cuando seas el único que trabaja en ese repositorio.
Además de push --force
, también existe pull --force
, otro potente comando que debe utilizarse con cuidado. Learn sobre ello aquí.
Alternativas más seguras usando git revert
Si quieres deshacer una confirmación sin borrar el historial, git revert
es tu mejor opción. No elimina la confirmación, sino que crea una nueva que deshace los cambios.
Supongamos que has confirmado un archivo llamado streamlit_app.py
, y quieres deshacerte de él. git revert
generará una nueva confirmación que borrará sólo ese archivo, dejando intacto el resto del historial.
Por defecto, git revert
se dirige al commit más reciente. Sin embargo, también puedes revertir confirmaciones anteriores especificando su ID de confirmación.
Ejemplo 2: Deshacer una confirmación enviada de forma segura en una rama compartida
Supongamos que has introducido un cambio de configuración incorrecto y necesitas revertirlo sin borrar el historial.
Escenario:
Has enviado un commit que añade una línea incorrecta en config.yaml
. Tu equipo ya está trabajando en la misma rama remota (main
), por lo que no puedes utilizar reset
o force-push.
Solución:
Utiliza git revert
para deshacer la confirmación de forma segura:
git revert <commit-hash>
Esto abrirá un editor de texto para confirmar el mensaje de revertir. Guarda y cierra el editor para crear una nueva confirmación que deshaga la anterior.
Si el último commit es el que hay que revertir:
git revert HEAD
Luego introduce los cambios:
git push origin main
✅ Por qué funciona: git revert
no reescribe el historial, sino que añade un nuevo commit. Eso lo hace seguro para las ramas compartidas y los flujos de trabajo en equipo.
Visualizar y confirmar los cambios
A veces, sólo quieres ver lo que ha pasado hasta ahora, algo así como retroceder a versiones anteriores para encontrar ese commit que quieres deshacer. Git te da herramientas para hacer exactamente eso.
Utilizar git log para comprobar el historial de confirmaciones
Ejecuta git log
en tu terminal, y obtendrás una lista completa de todos los commits de tu rama actual. Puedes utilizarlo para identificar una confirmación concreta que quieras deshacer o modificar.
Por ejemplo: la salida de git log
podría tener este aspecto:
- e3a1b7f Corregir error tipográfico en README
- 4f2c9a1 Añadir validación de inicio de sesión
- 9d5b3e8 Confirmación inicial
Cada línea muestra un hash de confirmación y un mensaje. Si alguna vez quieres deshacer un cambio concreto, sólo tienes que copiar ese hash de confirmación y utilizarlo con git revert
.
Utilizar herramientas GUI o extensiones
Si no eres programador o no has trabajado antes con el control de versiones, todas esas instrucciones de la línea de comandos pueden parecerte un idioma extranjero. Ahí es donde entran en juego las herramientas GUI. Hacen que Git sea visual y fácil de usar para principiantes, para que puedas centrarte en lo que importa sin memorizar comandos.
GitHub Desktop
GitHub Desktop es una aplicación gratuita que proporciona una interfaz limpia y sencilla para trabajar con tus repositorios de GitHub. Una vez instalado, puedes utilizarlo para crear ramas, hacer commits, hacer push a remoto y gestionar tu proyecto, todo con clics en lugar de comandos Git.
Es perfecto si eres nuevo en Git o simplemente quieres una experiencia más fluida en la gestión de cambios.
Interfaz de usuario de escritorio de GitHub. Fuente de la imagen.
Árbol de fuentes
Sourcetree es una herramienta Git GUI gratuita para Mac y Windows. Te proporciona una forma visual de gestionar ramas, commits y fusiones sin tocar el terminal. Es ligero, fácil de usar para principiantes y funciona bien con plataformas populares como GitHub, GitLab y Bitbucket.
Puesto que ha sido creado por Atlassian, también funciona bien con otras herramientas de Atlassian como Jira, Confluence y Bamboo, lo que lo convierte en una gran elección si tu equipo ya utiliza ese ecosistema.
Interfaz de usuario de Sourcetree. Fuente de la imagen.
GitKraken
GitKraken es una interfaz gráfica de usuario Git rica en funciones que hace que trabajar con repositorios resulte fluido y visual. Lo más destacado es la vista gráfica: una línea de tiempo interactiva y colorida del historial de tu repositorio que facilita el seguimiento de ramas, fusiones y confirmaciones.
A la izquierda, verás el árbol de archivos de tu proyecto. A la derecha, obtendrás información detallada sobre cualquier confirmación, archivo o rama en la que hagas clic. Es intuitiva, fácil de usar para principiantes y está repleta de potentes funciones también para usuarios avanzados.
GitKraken es gratuito para uso personal, pero si trabajas en una empresa o gestionas repos privados, necesitarás un plan de pago.
Gitkraken user interface. Fuente de la imagen.
Buenas prácticas para deshacer confirmaciones Git
Deshacer una confirmación no es algo que haya que temer, siempre que sigas unas buenas prácticas. Hablemos de lo que son.
Utiliza ramas para experimentar
Siempre que estés construyendo algo nuevo o corrigiendo un error, crea una rama separada de la principal. Haz todo tu trabajo allí, pruébalo a fondo, y sólo entonces fúndelo de nuevo en la rama principal.
De este modo, cualquier error o retroceso se arreglará de forma segura en tu rama sin estropear el trabajo del resto del equipo.
En caso de duda, utiliza git revert
Supongamos que has hecho algunos commits en una rama local y accidentalmente los has empujado a la rama principal. Uy. Ahora quieres deshacer uno de esos commits sin estropear el historial compartido. Ahí es donde git revert
salva el día.
Ejecuta git revert HEAD~1
. Esto crea una nueva confirmación que deshace los cambios de la penúltima confirmación (porque HEAD~1 apunta a ella). No borra nada, sino que invierte los cambios de forma limpia y rastreable.
Una vez hecho esto, no olvides enviar la corrección al mando a distancia utilizando git push origin
.
Nota: Si los cambios ya se han enviado a una rama compartida, utiliza git revert
. Mantiene intacto el historial de confirmaciones y no interrumpirá a tus compañeros de equipo.
Documenta tus cambios
No necesitas abrir una página de Confluence sólo para mantener tu historial de versiones, porque Git ya lo hace por ti. El truco está en utilizarlo inteligentemente.
Empieza con mensajes de compromiso claros y significativos. Si estás revirtiendo algo, asegúrate de que el mensaje explica por qué lo estás deshaciendo.
Y anota el ID de confirmación y un breve resumen de lo que ha cambiado. Eso suele bastar para cumplir el objetivo de la documentación.
Colaborar en equipo
Cuando utilizas comandos como git reset
, rebase
, o commit --amend
en una rama que otros también están utilizando, estás cambiando el historial de confirmaciones. Cualquiera que haya tirado de la vieja historia se enfrentará ahora a conflictos.
Por tanto, utiliza comandos de reescritura sólo en ramas locales o de características. Si debes forzar o reescribir la historia compartida, comunícalo a tu equipo lo antes posible.
Conclusión
Git te ofrece distintas formas de deshacer errores; pero saber cuándo y cómo utilizar cada herramienta es lo que separa a los programadores seguros de los confundidos.
Exploramos cómo funciona git reset
en diferentes modos, cuándo utilizar git revert,
y por qué es crucial elegir la herramienta adecuada en función de tu situación.
En resumen:
- Evitar reescribir el historial tras pasar a ramas compartidas
- Comunícate pronto si debes forzar la presión
- Utiliza
git revert
para deshacer de forma segura los commits pushed
Para los siguientes pasos, aprendecómo puedes revertir una confirmación de fusión aquí. Si ya has aprendido lo básico y estás listo para profundizar, ¡consulta nuestro curso de git intermedio!
Aprende hoy los fundamentos de Git
Preguntas frecuentes
¿Qué hace realmente git reset --soft HEAD~1?
Desplaza tu puntero HEAD una confirmación hacia atrás, pero deja todos los cambios preparados. Es perfecto cuando quieres revisar el commit sin perder nada de trabajo.
¿Cuándo debo utilizar git reset --mixto en lugar de --soft?
Utiliza --mixed
cuando quieras conservar los cambios en tus archivos pero eliminarlos del área de preparación. Es útil para hacer ediciones antes de volver a comprometerte.
¿Es peligroso utilizar git push --force?
Sí, sobre todo en un entorno de equipo. Reescribe el historial de confirmaciones en la rama remota y puede borrar el trabajo de los compañeros de equipo si no se utiliza con cuidado.
¿Cuál es la diferencia entre git revert y git reset?
git revert
añade un nuevo commit que deshace los cambios sin tocar el historial, mientras que git reset
mueve el HEAD y puede alterar el historial -especialmente arriesgado si se empuja-.
¿Puedo deshacer una confirmación sin perder mis cambios?
Sí, utiliza git reset --soft
para mantener tus cambios en fase o --mixed
para mantenerlos en tu directorio de trabajo.
¿Cuál es la forma más segura de deshacer un commit en un repositorio compartido?
Utiliza git revert
. Conserva la historia creando una nueva confirmación que anule los cambios, evitando conflictos con los compañeros de equipo.
¿Cómo encuentro el commit que quiero deshacer?
Utiliza git log
para listar los commits anteriores. Copia el hash de confirmación del que quieres revertir o restablecer.
¿Pueden las herramientas GUI como GitHub Desktop revertir confirmaciones?
Sí, las herramientas GUI proporcionan formas sencillas de deshacer confirmaciones sin necesidad de recordar la sintaxis de la línea de comandos. Son ideales para principiantes.
¿Qué ocurre con el historial de confirmaciones tras un reinicio?
Con git reset
, la confirmación o confirmaciones se eliminan de tu historial, a menos que se hayan enviado. Entonces, el mando sigue teniendo un registro a menos que fuerces la pulsación.
¿Está bien modificar una confirmación después de enviarla?
No, no sin coordinación. Modificar y luego forzar puede perturbar el trabajo compartido. Hazlo sólo en ramas aisladas o proyectos en solitario.
Srujana es una redactora técnica autónoma con una licenciatura de cuatro años en Informática. Escribir sobre diversos temas, como la ciencia de datos, la computación en la nube, el desarrollo, la programación, la seguridad y muchos otros, le resulta natural. Le encanta la literatura clásica y explorar nuevos destinos.