Git se niega a fusionar historias no relacionadas en rebase

2152

Durante git rebase origin/developmentel siguiente mensaje de error se muestra desde Git:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Mi versión de Git es 2.9.0. Solía ​​funcionar bien en la versión anterior.

¿Cómo puedo continuar este rebase permitiendo historias no relacionadas con la bandera forzada introducida en la nueva versión?

Shubham Chaudhary
fuente
12
@Shishya Con el debido respeto, la respuesta más votada no resuelve esta pregunta de manera directa. La pregunta pregunta por la git-rebasesituación, mientras que la respuesta da una bandera paragit-merge
Shubham Chaudhary
13
@AsifMohammed esa no es la respuesta aceptada . Las personas encontrarán automáticamente la respuesta con más votos debido a la clasificación predeterminada por votos.
Glorfindel
2
En caso de que alguien cometió el mismo error, tengo este error después de usar accidentalmente git pull [repo URL]en lugar degit clone [repo URL]
rsoren
35
Se ha hecho un desastre aquí por el hecho de que el título no especifica que esto está en el contexto de una nueva versión, por lo que su pregunta es atraer a los Googlers que están recibiendo este error en diferentes contextos y votando una respuesta que en realidad no aplica a la pregunta que has hecho. No se puede limpiar fácilmente ahora, por lo que el par incoherente de preguntas y respuestas permanecerá en el sitio y estará alto en los resultados de búsqueda de Google para siempre. ¡La moraleja de la historia es que los títulos de preguntas importan!
Mark Amery

Respuestas:

2618

El comportamiento predeterminado ha cambiado desde Git 2.9:

"git merge" solía permitir la fusión de dos ramas que no tienen una base común por defecto, lo que condujo a un nuevo historial de un proyecto existente creado y luego fue arrastrado por un incauto mantenedor, lo que permitió una historia paralela innecesaria fusionada en el proyecto existente . Se le ha enseñado al comando a no permitir esto de manera predeterminada , con una --allow-unrelated-historiesopción de escotilla de escape que se utilizará en un evento raro que fusiona las historias de dos proyectos que comenzaron sus vidas de forma independiente.

Consulte el registro de cambios de la versión de Git para obtener más información.

Puede usar --allow-unrelated-historiespara forzar la fusión.

azul112
fuente
18
Conozca el cambio de fusión, pero esta opción no funcionará con rebase
Shubham Chaudhary
3
¿Hay alguna opción que se encienda --allow-unrelated-historiespermanentemente?
jmarceli
44
@jmarceli "Debido a que tal" fusión de dos proyectos "es un evento raro, no se agrega una opción de configuración para permitir siempre dicha fusión". Entonces no.
blue112
2
Traté de fusionar una sucursal para un repositorio diferente de esta manera, pero creó una nueva confirmación en mi sucursal actual y no mantuvo el historial del otro repositorio. Luego revisé una sucursal local del otro repositorio y solo entonces la fusioné y de repente apareció una confirmación de fusión normal. Extraño.
mgol
13
Excelente, funciona con git pulltambién. Fue en ese "raro evento que fusiona historias de dos proyectos que comenzaron sus vidas de forma independiente". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia
1192

En mi caso, el error fue solo fatal: refusing to merge unrelated historiesen cada intento, especialmente en la primera solicitud de extracción después de agregar de forma remota un repositorio Git.

El uso de la --allow-unrelated-historiesbandera funcionó con una solicitud de extracción de esta manera:

git pull origin branchname --allow-unrelated-histories
adi
fuente
232
Siempre veo este error si cuando creo un nuevo repositorio de Github con un archivo README.md, lo llevo a un repositorio local por primera vez. Muy molesto.
Tien Do
29
Para los repositorios nuevos, los primeros tirones, generalmente es mejor comenzar con a git clone.
Paraguas
3
@PardeepJain Por favor vea este github.com/git/git/blob/master/Documentation/RelNotes/…
adi
2
Esto me detuvo durante varias horas, antes de darme cuenta de que tenía que haber una resolución obvia para fusionar archivos como este si ocurre para los archivos predeterminados. ¡Me alegra no ser el único que ha tenido este problema al menos!
Zibbobz
3
En mi caso sucedió porque agregué el archivo de licencia en github. El comando mencionado anteriormente (y a continuación, son los mismos) funcionó.
uudaddy
582

Pruebe el siguiente comando:

git pull origin master --allow-unrelated-histories

Esto debería solucionar tu problema.

Ogbonna Vitalis
fuente
266

Recibí este error cuando configuré un repositorio local primero. Luego fui a GitHub y creé un nuevo repositorio. Entonces corrí

git remote add origin <repository url>

Cuando traté de empujar o tirar, recibí el mismo fatal: unrelated_historieserror cada vez.

Así es como lo arreglé:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master
Adithya Bhat
fuente
Creo que estábamos en el mismo bote. Para agregar algo: mi problema fue que ya había algo en el repositorio remoto. Entonces, en mi carpeta, eliminó la .gitcarpeta, ejecutó git inite hizo lo que Adithya dijo, excepto la parte de fusión.
codepleb
1
¿Cómo presionar el botón INSERTAR en Mac? En realidad, tengo que escribir el mensaje de confirmación y fusionarme desde la línea de comando, pero no sé cómo hacerlo desde la línea de comando.
Shajeel Afzal
¿Abre vim? Si lo hace, es solo SHIFT +:
Adithya Bhat
Incluso yo había creado el repositorio de GitHub primero y estaba siguiendo esos comandos para agregar el repositorio.
Sr. Suryaa Jha
1
Esta es una muy buena respuesta. El punto es que debe forzar la extracción y luego fusionar el repositorio local y remoto.
alanwsx
151

Para esto, ingrese el comando:

git pull origin branchname --allow-unrelated-histories

Por ejemplo,

git pull origin master --allow-unrelated-histories

Referencia:

Problema de historias no relacionadas de GitHub

VIKAS KOHLI
fuente
gracias por primera vez sacar sus obras para mí "maestro de origen git pull --permitir-historias-no relacionadas"
Ankitkumar Makwana
136
git pull origin <branch> --allow-unrelated-histories

Será dirigido a una ventana de edición de Vim:

  • Insertar mensaje de confirmación
  • Luego presione Esc(para salir del modo "Insertar"), luego :(dos puntos), luego x(pequeña "x") y finalmente presione para salir Enterde Vim
  • git push --set-upstream origin <branch>
MJ Montes
fuente
55
Ctrl + X no te sacará de Vim
Ruben
but :x<Enter>will
webKnjaZ
Gracias por especificar cómo salir; ¡Estaba completamente perdido y todas las otras respuestas parecen suponer que es obvio!
Still_learning hace
101

Yo tuve el mismo problema. Prueba esto:

git pull origin master --allow-unrelated-histories 

git push origin master
Aamir Kalimi
fuente
47

Tratar git pull --rebase development

Daniel petrov
fuente
Esto resolvió mi problema. Así es como comenzó el problema
Harlan Nelson el
1
Esto probablemente debería ser:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri
3
@RiccardoMurri Habiendo intentado eso, no lo volvería a hacer. Mi nuevo repositorio tenía algunos archivos de inicialización de muestra, y mi repositorio local valía meses de confirmaciones. Al ejecutar esto (con newOrigin branchmás que development), agregué el commit inicial a la parte superior de mi sucursal local, eliminando efectivamente casi todo. Quería que la confirmación inicial del nuevo control remoto estuviera en la parte inferior.
redOctober13
42

Para Android Studio e IntelliJ:

Primero, comprometerse todo y resuelve cualquier conflicto.

Luego abra la terminal desde abajo del IDE e ingrese:

git pull origin master --allow-unrelated-histories

Ahora puedes empujar.

Amir Hossein Ghasemi
fuente
38

ADVERTENCIA ESTO POSIBLEMENTE SOBRESCRIBIRÁ EL REPOSITORIO REMOTO

Esto funcionó para mí:

git push origin master --force
Aniket Patil
fuente
1
Pero, ¿qué sucede realmente con los archivos locales y remotos?
Prathamesh Más
Según sé y tengo experiencia, los archivos locales están intactos. Se agregan los archivos remotos que desea agregar en una carpeta específica.
Aniket Patil
55
¡No hagas esto! Esto sobrescribe todos los archivos remotos .
Finomnis
Solo incluya un aviso de que este comando anula todos los archivos en la rama maestra . Funcionó bien para mí. Gracias.
Flavio
1
Funciona pero es bastante duro, el --allow-non -lad-historories es más específico y apropiado
bdulac
32

Como todas las otras respuestas no responden realmente la pregunta, aquí hay una solución inspirada en esta respuesta en una pregunta relacionada.

Entonces obtienes tu error haciendo git rebase:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

Este error en realidad no cancela el rebase, pero ahora estás en el medio:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

Entonces ahora puedes hacer la fusión a mano. Descubra los commits principales del commit de fusión original:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

Averigüe cuál de los dos padres de fusión es el que se fusionó con el actual (probablemente el segundo, verifique con git log 222222222), y luego haga la fusión a mano, copiando el mensaje de confirmación del compromiso de fusión original:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.
cdauth
fuente
28

Yo tuve el mismo problema. El problema es que remoto tenía algo que lo impedía.

Primero creé un repositorio local. He añadido una LICENSEy README.mdarchivo a mi local y comprometida.

Entonces quería un repositorio remoto, así que creé uno en GitHub. Aquí cometí un error al marcar "Inicializar este repositorio con un archivo README" , que también creó un archivo README.md en remoto.

Entonces ahora cuando corrí

git push --set-upstream origin master

Tengo:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Ahora para superar esto hice

git pull origin master

Lo que resultó en el siguiente error:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

Lo intenté:

git pull origin master --allow-unrelated-histories

Resultado:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

Solución:

Eliminé el repositorio remoto y creé uno nuevo (creo que solo eliminar el archivo READMEpodría haber funcionado) y luego funcionó lo siguiente:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master
Lokesh Purohit
fuente
25
crear un nuevo repositorio no es una solución
Zach
3
git pull origin master --allow-non-related-historories funcionó para mí .. Gracias
SKalariya
git push --force ... sería una solución adecuada en el paso 1 en este caso particular
Konstantin Pelepelin
2
Esta no es una solución. Si eres principiante, puedes hacerlo, pero si estás trabajando con algunos proyectos reales, deberías tratar de la manera adecuada.
Prathamesh Más
27

Esto suele suceder cuando se compromete por primera vez al repositorio remoto. Como el error dice claramente "negarse a fusionar historias no relacionadas", tenemos que usar el indicador --allow-non-related-historories.

git pull origin master  --allow-unrelated-histories

Ahora habría algunos conflictos que tenemos que resolver manualmente. Después de eso solo confirme el código y empújelo.

Santosh Kadam
fuente
Como se menciona en la pregunta, estoy tratando de hacer un git-rebase y no un git-pull, git-rebase no tiene la --allow-unrelated-historiesbandera.
Shubham Chaudhary
25

Dos posibilidades cuando esto puede suceder:

  1. Has clonado un proyecto y, de alguna manera, el directorio .git se eliminó o corrompió. Esto lleva a Git a no estar al tanto de su historial local y, por lo tanto, hará que arroje este error cuando intente empujar hacia o desde el repositorio remoto.

  2. Ha creado un nuevo repositorio, le ha agregado algunas confirmaciones y ahora está intentando extraerlo de un repositorio remoto que ya tiene algunas confirmaciones propias. Git también arrojará el error en este caso, ya que no tiene idea de cómo se relacionan los dos proyectos.

SOLUCIÓN

git pull origin master --permitir historias no relacionadas

Ref - https://www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error

Satakshi Pandey
fuente
12

También luché con esto, pero logré encontrar una solución.

Cuando se encuentre con el error anterior, simplemente seleccione el compromiso de fusión y luego continúe con el rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue
el_tigro
fuente
3
¿En inglés plano, por favor?
Agente Zebra
@AgentZebra Para cualquier disco en el plano complejo, una integral de ruta cerrada continua es 0.
Admita el
12

En primer lugar, realice los cambios remotos a su local utilizando el siguiente comando:

git pull origin branchname --allow-unrelated-histories

** branchname es master en mi caso.

Cuando finaliza el comando de extracción, se produce un conflicto. Deberías resolver los conflictos. Yo uso Android Studio para resolver conflictos. ingrese la descripción de la imagen aquí

Cuando se resuelven los conflictos, la fusión está hecha.

Ahora puedes empujar con seguridad.

oiyio
fuente
He estado buscando el botón Resolve Conflicten AS. A veces, la ventana emergente / globo inferior derecha desaparece y no puedo hacer nada. Gracias @oiyio
mochadwi
12

Acabo de hacer un

  git pull --allow-unrelated-histories
sana ebadi
fuente
A mi no me funciona.
Bishwas Mishra
7

Al hacer una git pull, recibí este mensaje fatal: refusing to merge unrelated histories para un módulo de repositorio donde no había actualizado la copia local durante un tiempo.

Ejecuté este comando solo para actualizar local desde el origen. Solo quería lo último del control remoto y no necesitaba ningún cambio local.

git reset --hard origin/master

Esto lo solucionó en mi caso.

striker77
fuente
12
ADVERTENCIA: Esto eliminó TODOS mis archivos. ¡Ten cuidado si no sabes lo que estás haciendo!
Salvi Pascual
2
¡Esto eliminará todos los cambios pendientes!
Orestis P.
1

Estoy usando el rebase durante años y nunca me había encontrado con ese problema. Sin embargo, su primer problema es que intenta hacerlo directamente en la rama remota developmentdesde el repositorio remoto, llamadoorigin . Eso es literalmente incorrecto porque rebase es un comando peligroso, que reestructura el historial de git. Dicho esto, primero debe probar su repositorio local y presionarlo solo, si funciona para usted como se esperaba.

Por lo tanto, mi flujo de trabajo de rebase habitual es el siguiente (pero tenga en cuenta que no debe usar rebase en las ramas, que no es el único comité. Para tales ramas, use simplemente fusionar y resolver conflictos, si corresponde):

  1. asegúrese de tener un árbol de trabajo limpio (sin cambios no confirmados)
  2. pagar a la rama en la que desea volver a basar (por ejemplo, digamos que es master; como un comando de una línea):git checkout master && git pull origin master && git checkout development
  3. Hacer el rebase real: git rebase master
  4. Si está hecho y todo funciona como se esperaba, llévelo a su control remoto. Para hacerlo, debe forzarlo, ya que el host remoto ya tiene el historial en otro orden, el control remoto respondería sin nada que presionar. Entonces, tenemos que decir "mi versión local del historial es correcta, sobrescribir todo en esa rama remota usando mi versión local del historial":git push -f origin development

Como ya mencioné, tenga en cuenta que rebase manipula la historia de git, eso generalmente es algo malo. Sin embargo, es posible hacerlo en las sucursales, donde nadie más se compromete. Para mantener la rama extraíble para los otros desarrolladores, use otra estrategia de fusión como fusionarse, squash o cherrypick. En otras palabras: Rebase no debería ser su herramienta en el desarrollo distribuido. Funciona bien para ti si eres el único que trabaja en este repositorio.

Utilizamos la estrategia de ramificación de características. En esto, usualmente uso rebase para obtener las "actualizaciones" de los otros desarrolladores, eso sucedió mientras tanto en la rama maestra. Al hacerlo, reduce el tamaño de las confirmaciones que son visibles en una solicitud de extracción. Por lo tanto, facilita que el revisor de código vea mis cambios realizados en esta rama de características.

alpham8
fuente
En este caso, en realidad quería continuar con el rebase y la respuesta no aborda eso. Conozco los riesgos de rebase y cuándo debería y no debería usar git-rebase. Esta es una guía general (obstinada) para el flujo de trabajo de git y no responde directamente a la pregunta. En cuanto a usar rebase durante años, este error particular se agregó en v2.9.0 de git y el flujo solía funcionar bien antes de esa versión. Lo que has publicado en esta respuesta aquí ya está respondido en preguntas mucho más antiguas como stackoverflow.com/a/11566503/2670370 y git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary