CORE Code School

Errores comunes en git y cómo solucionarlos

13 minutos

La mayoría de las veces, si se sigue el protocolo y nos aseguramos de cuidar bien los archivos y el repositorio, las cosas deberían funcionar sin problemas.

Sin embargo, enfrentaremos problemas y complicaciones en el camino, ya sea al trabajar en un proyecto muy grande o en un proyecto compartido con más personas.

Listar todo en cada rama

Si no estás seguro de lo grave que fue tu error, la prioridad debería ser descubrirlo. Además del comando git log que muestra todos los commits en la rama actual, hay otro comando que listaré todo lo que hayas hecho en cualquier rama:

bash
git reflog

Archivo agregado por accidente

Si has agregado accidentalmente un archivo al área de preparación (staging area), por ejemplo, si has agregado muchos cambios con un comando como git add ., puedes deshacer la preparación de un archivo fácilmente con

bash
git restore --staged <file>

El archivo .gitignore

Una de las mejores formas de corregir un error es no tenerlo en primer lugar, así que aquí hay un consejo útil para principiantes para prevenir errores.

A veces hay archivos que debemos tener en nuestro directorio, pero no queremos que se registren en el repositorio final o se carguen en la nube. Esto incluye archivos y carpetas como por ejemplo:

txt
.DS_Store
__pycache__/

O otra información sensible como contraseñas y cualquier otra cosa que desees evitar.

La solución para esto es bastante sencilla, solo crea un archivo llamado .gitignore y enumera todos los archivos que deseas que Git ignore. Estos archivos no se mostrarán como archivos no rastreados, ni como archivos modificados, etc.

⚠️ Esto solo funciona para archivos que nunca se han registrado en tu repositorio.

Si deseas ignorar archivos que se han registrado en el repositorio, primero debes eliminarlos de él. Puedes hacerlo con el siguiente comando

bash
git rm --cached <file>

Esto eliminará el archivo del repositorio, pero lo mantendrá en tu directorio de Trabajo.

Modificar un commit

Si acabas de hacer un commit y te das cuenta de que omitiste un archivo o un pequeño cambio, puedes corregir el commit anterior en lugar de hacer uno nuevo. Simplemente agrega los cambios y ejecuta el siguiente comando:

bash
git commit --amend --no-file

⚠️ NUNCA modifiques un commit público, o un commit que hayas enviado a un repositorio público. Puede haber consecuencias graves. Si se ha enviado a algún lugar, asume la responsabilidad y haz un nuevo commit.

Corregir el mensaje de un commit

Si deseas corregir o cambiar el mensaje del último commit, también puedes hacerlo con la opción --amend:

bash
git commit --amend -m "<new_message>"

Revertir un Commit

A veces, los errores que cometemos requieren que cambiemos el pasado, no solo lo que hemos hecho inmediatamente. Si deseas deshacer un commit en particular, puedes usar git log para encontrar el hash de ese commit. El hash es una larga secuencia de números y letras que identifica de manera única cada commit.

Luego, utiliza el siguiente comando:

bash
git revert <commit_hash>

y Git creará un nuevo commit deshaciendo los cambios del commit especificado.

Revertir solo un archivo

Si deseas deshacer los cambios de un solo archivo a un estado anterior, el procedimiento será un poco diferente. Aún tendrás que encontrar y copiar el hash del commit. Después de eso, utiliza la ruta del archivo en el siguiente comando:

bash
git git checkout <commit_hash> -- <path/to/file>

Retroceder en el tiempo

A veces, sin embargo, dependiendo de cuánto hayamos estropeado las cosas, revertir un commit puede no ser suficiente. En ese caso, podríamos probar una solución diferente, como cancelar varios commits y volver a un punto anterior. Esto hará que parezca como si los commits posteriores a ese punto nunca hubieran sucedido. Hay 3 formas de hacer un reset en Git. Todas ellas cambiarán la rama actual de tu repositorio al commit que elijas. La diferencia está en cómo cada opción manejará los cambios.

--soft

Si usamos el siguiente comando:

bash
git reset --soft <commit_hash>

nuestra rama se restaurará a ese commit y los cambios se desharán, pero se mantendrán como cambios staged (preparados para ser confirmados). Esto significa que si hiciéramos un commit nuevamente, esos cambios se guardarán en el repositorio una vez más.

--mixed

Cambiar "soft" por mixed tendrá una pequeña diferencia. En este caso, los cambios se desharán pero no estarán preparados para ser confirmados, quedarán únicamente en el directorio de trabajo, lo que significa que tendrás que agregarlos nuevamente antes de confirmarlos.

--hard

El tercer y último método de reset es el hard reset, que deshará el commit, los cambios y los eliminará por completo. Esto llevará tu repositorio de vuelta al commit que elegiste y eliminará permanentemente todos los cambios que se hayan realizado. Es una operación muy delicada y debe ejecutarse con cuidado.

Consideracion Final

Como se vio anteriormente, Git puede ayudarnos mucho a corregir posibles errores, pero las herramientas solo nos llevan hasta cierto punto. Lo mejor es mantener todo seguro practicando buenas medidas durante el desarrollo.

  • Mantén el Principio de Responsabilidad Única
  • Haz commits limpios y con un solo propósito
  • Escribe mensajes de commit significativos y claros
  • Haz commits con frecuencia
  • Usa ramas, no commits directamente en la rama principal "main"