¿Qué es el error 'fatal: refusing to merge unrelated histories' y por qué ocurre?
El error fatal: refusing to merge unrelated histories es un mensaje de seguridad que introduce Git (a partir de la versión 2.9.0) cuando intentas fusionar (merge o pull) dos repositorios que no comparten un historial común de commits. Esto es muy frecuente al inicializar un repositorio de manera local y otro en una plataforma como GitHub o GitLab de forma independiente, y luego intentar unirlos.
Git, por defecto, asume que intentar mezclar dos proyectos con pasados totalmente distintos es un error accidental que podría sobrescribir código valioso. A continuación, te presentamos las soluciones más eficaces para resolver esta situación sin perder tu trabajo.
Método 1: Forzar la fusión con el parámetro --allow-unrelated-histories
La solución estándar y más sencilla consiste en indicarle explícitamente a Git que eres consciente de que los historiales no coinciden y que deseas proceder con la fusión de todas formas. Para ello, utilizamos la bandera --allow-unrelated-histories.
- Abre tu terminal o consola de comandos en la carpeta de tu proyecto.
- Si estás intentando traer los cambios desde una rama remota (por ejemplo,
mainomaster), ejecuta el siguiente comando: - Si el comando anterior abre un editor de texto (como Nano o Vim) para ingresar un mensaje de confirmación de merge, simplemente guarda el archivo para finalizar la fusión.
git pull origin main --allow-unrelated-historiesMétodo 2: Solucionar el error durante un Merge local
Si el problema ocurre al intentar fusionar dos ramas locales independientes que acabas de añadir a tu entorno de desarrollo, el procedimiento es similar pero enfocado al comando merge:
- Asegúrate de estar posicionado en la rama que recibirá los cambios utilizando:
git checkout rama-destino - Ejecuta la fusión forzada con el siguiente comando reemplazando 'rama-origen' por el nombre de la rama que quieres acoplar:
- Si surgen conflictos de código durante la fusión, edita los archivos afectados, resuelve las diferencias manualmente, añade los archivos al área de preparación con
git add .y finaliza el proceso congit commit -m "Fusión de historiales completada".
git merge rama-origen --allow-unrelated-historiesMétodo 3: Alternativa mediante Rebase (Reorganización de commits)
Si prefieres mantener un historial lineal y limpio en lugar de crear un commit de fusión intermedio, puedes optar por realizar un rebase. Ten en cuenta que este método reescribirá el historial de commits local.
- Ejecuta el comando de pull indicando la reorganización y permitiendo los historiales no relacionados:
- Git aplicará tus commits locales encima de los commits del repositorio remoto. Si hay conflictos, resuélvelos en tu editor de código.
- Una vez resueltos los conflictos, continúa el proceso ejecutando:
git pull --rebase origin main --allow-unrelated-historiesgit rebase --continue