¿Qué es el error 'fatal: refusing to merge unrelated histories' en Git?
El mensaje de error fatal: refusing to merge unrelated histories es una medida de seguridad introducida en la versión 2.9 de Git. Aparece cuando intentas realizar un git pull o un git merge entre dos proyectos que no comparten un historial de commits en común.
Esta alerta evita que fusiones accidentalmente dos repositorios completamente diferentes, protegiendo la integridad de tu código fuente y su árbol de commits.
Causas principales del fallo
- Has creado un nuevo repositorio local y otro remoto (por ejemplo, en GitHub o GitLab) de forma independiente y ambos contienen archivos iniciales como
README.mdo.gitignore. - Has inicializado un repositorio local con
git inity has intentado vincularlo a un repositorio remoto existente que ya tiene commits. - La carpeta de historial
.gitfue eliminada o corrupta y se volvió a inicializar el proyecto.
Método 1: Utilizar la bandera --allow-unrelated-histories (Solución Recomendada)
La forma más rápida y directa de resolver este problema es indicarle a Git de forma explícita que permita la unión de estos dos historiales independientes.
- Abre la terminal en la raíz de tu proyecto.
- Ejecuta el comando
git pullañadiendo el parámetro especial:
git pull origin main --allow-unrelated-histories
Nota: Sustituye origin por el nombre de tu remoto y main por el nombre de tu rama si utilizas master o cualquier otra.
- Si existen conflictos entre archivos (como un
README.mdduplicado), Git te pedirá resolverlos manualmente. Edita los archivos con conflicto, guárdalos y ejecuta:
git add .
git commit -m "Solucionado el conflicto de historiales no relacionados"
git push origin main
Método 2: Aplicar Rebase para integrar el historial remoto
Si prefieres mantener un historial de commits lineal y limpio sin crear un commit explícito de merge, puedes usar la opción de rebase.
- Asegúrate de tener tus cambios locales guardados o guardados temporalmente en el stash.
- Ejecuta el siguiente comando para aplicar tus commits locales sobre la rama remota:
git rebase origin/main
- Si aparecen conflictos durante el rebase, resuélvelos en tu editor de código y continúa el proceso con:
git rebase --continue
Método 3: Clonar el repositorio remoto y mover los cambios locales
Si la rama remota apenas contiene la configuración inicial y prefieres evitar cualquier complicación con el historial, este método manual es el más seguro:
- Haz una copia de seguridad de tu carpeta de proyecto local en otra ubicación de tu equipo.
- Clona el repositorio remoto en un nuevo directorio:
git clone https://github.com/usuario/repositorio.git
- Copia los archivos de tu proyecto local antiguo en la nueva carpeta clonada (asegúrate de no copiar la carpeta oculta
.gitantigua). - Sube los cambios actualizados al servidor remoto:
git add .
git commit -m "Integración inicial del proyecto"
git push origin main