unrelated - git push tag
Git se niega a fusionar historias no relacionadas en rebase (13)
Durante el
git rebase origin/development
Git muestra el siguiente mensaje de error:
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?
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 al hacer
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 realice 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.
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 forma predeterminada , con una
--allow-unrelated-histories
escotilla de escape:--allow-unrelated-histories
que se utilizará en un evento raro que fusiona 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-histories
para forzar la fusión.
En mi caso, el error fue
fatal: refusing to merge unrelated histories
en cada intento, especialmente la primera solicitud de extracción después de agregar de forma remota un repositorio Git.
El uso del
--allow-unrelated-histories
funcionó con una solicitud de extracción de esta manera:
git pull origin branchname --allow-unrelated-histories
Esto funcionó para mí:
git push --set-upstream origin master
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 el
development
de la sucursal remota desde el repositorio remoto, llamado
origin
.
Eso es literalmente incorrecto, porque rebase es un comando peligroso, que reestructura la historia git.
Dicho esto, primero debe probar en 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):
- asegúrese de tener un árbol de trabajo limpio (sin cambios no confirmados)
-
checkout 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
-
Hacer la rebase aguda:
git rebase master
-
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 remoto respondería sin nada que presionar.
Entonces, necesitamos 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 rama característica. 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.
Para esto, ingrese el comando:
git pull origin branchname --allow-unrelated-histories
Por ejemplo,
git pull origin master --allow-unrelated-histories
Referencia:
Prueba
git pull --rebase development
Pruebe el siguiente comando:
git pull origin master --allow-unrelated-histories
Esto debería solucionar tu problema.
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 / tirar, obtuve el mismo error
fatal: unrelated_histories
.
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
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
Yo tuve el mismo problema. El problema es que remoto tenía algo que lo impedía.
Primero creé un repositorio local.
README.md
archivo
LICENSE
y
README.md
a mi local y comprometido.
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í
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.
Tengo:
git pull origin master
Ahora para superar esto hice
From https://github.com/lokeshub/myTODs
branch master -> FETCH_HEAD
fatal: refusing to merge unrelated histories**
Lo que resultó en el siguiente error:
git pull origin master --allow-unrelated-histories
Lo intenté:
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.
Resultado:
git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master
Solución:
Eliminé el repositorio remoto y creé uno nuevo (creo que solo eliminar el archivo
README
podría haber funcionado) y luego funcionó lo siguiente:
git push origin master --force
Yo tuve el mismo problema. Prueba esto:
git pull origin master --allow-unrelated-histories
git push origin master
git pull origin <branch> --allow-unrelated-histories
Será dirigido a una ventana de edición de Vim:
- Insertar mensaje de confirmación
- Luego presione Ctrl + X para salir de Vim
-
git push --set-upstream origin <branch>