Git se recusando a mesclar histórias não relacionadas em rebase

2150

Durante git rebase origin/developmenta seguinte mensagem de erro é mostrada no Git:

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

Minha versão do Git é 2.9.0. Costumava funcionar bem na versão anterior.

Como posso continuar essa reformulação, permitindo históricos não relacionados com a bandeira forçada introduzida no novo lançamento?

Shubham Chaudhary
fonte
12
@Shishya Com todo o respeito, a resposta mais votada não resolve essa questão de maneira direta. A pergunta pede por uma git-rebasesituação enquanto a resposta dá uma bandeira paragit-merge
Shubham Chaudhary 28/12
13
@AsifMohammed não é para isso que serve uma resposta aceita . As pessoas encontrarão automaticamente a resposta com mais votos devido à classificação padrão por votos.
Glorfindel
2
Em caso de alguém cometeu o mesmo erro, eu tenho esse erro depois de acidentalmente usar git pull [repo URL]em vez degit clone [repo URL]
rsoren
4
Possível duplicado de Permitir fusão histórias independentes na rebase git
vossad01
35
Foi feita uma bagunça aqui pelo fato de o título não especificar que isso está no contexto de uma nova rebase. Portanto, sua pergunta está nos Googlers que estão recebendo esse erro em contextos diferentes e votam positivamente em uma resposta que não é realmente aplique à pergunta que você fez. Agora não pode ser facilmente limpo, portanto o par de perguntas e respostas incoerentes permanecerá no site e alto nos resultados de pesquisa do Google para sempre. A moral da história é que os títulos das perguntas são importantes!
Mark Amery

Respostas:

2616

O comportamento padrão mudou desde o Git 2.9:

"git merge" usado para permitir a fusão de duas ramificações que não têm base comum por padrão, o que levou a um novo histórico de um projeto existente criado e depois foi puxado por um mantenedor desavisado, o que permitiu que um histórico paralelo desnecessário fosse mesclado ao projeto existente . O comando foi ensinado a não permitir isso por padrão , com uma --allow-unrelated-historiesopção de hachura de escape a ser usada em um evento raro que mescla os históricos de dois projetos que iniciaram suas vidas independentemente.

Veja o changelog do release do Git para mais informações.

Você pode usar --allow-unrelated-historiespara forçar a mesclagem.

blue112
fonte
18
Conheça a mudança merge, mas esta opção não irá funcionar com rebase
Shubham Chaudhary
3
Existe alguma opção que será ativada --allow-unrelated-historiespermanentemente?
jmarceli
4
@jmarceli "Como uma" mesclagem de dois projetos "é um evento raro, uma opção de configuração para permitir sempre essa mesclagem não é adicionada.". Então não.
blue112
2
Tentei mesclar um ramo para um repositório diferente dessa maneira, mas ele criou um novo commit no meu ramo atual e não manteve o histórico do outro repositório. Depois, fiz check-out de uma ramificação local do outro repositório e só depois a mesclei e, de repente, um commit de mesclagem normal apareceu. Esquisito.
mgol 13/12/16
13
Excelente, funciona git pulltambém. Foi naquele "evento raro que mescla histórias de dois projetos que iniciaram suas vidas de forma independente". git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia
1190

No meu caso, o erro ocorreu fatal: refusing to merge unrelated historiesem todas as tentativas, especialmente na primeira solicitação pull após adicionar remotamente um repositório Git.

O uso do --allow-unrelated-historiessinalizador funcionou com uma solicitação pull desta maneira:

git pull origin branchname --allow-unrelated-histories
adi
fonte
232
Eu sempre vejo esse erro se, ao criar um novo repositório do Github com um README.md, puxo-o para um repositório local na primeira vez. Tão irritante.
Tien Do
29
Para novos repositórios, primeiro puxa, normalmente é melhor começar com a git clone.
Umbrella
2
Isso me parou por várias horas, antes que eu percebesse que tinha que haver uma resolução óbvia para mesclar arquivos como este, se ocorrer nos arquivos padrão - fico feliz por não ser o único que teve esse problema pelo menos!
Zibbobz
3
No meu caso, aconteceu porque adicionei o arquivo de licença no github. O comando mencionado acima (e abaixo, eles são os mesmos) funcionou.
uudaddy
582

Tente o seguinte comando:

git pull origin master --allow-unrelated-histories

Isso deve resolver seu problema.

Ogbonna Vitalis
fonte
266

Eu recebi esse erro ao configurar um repositório local primeiro. Então eu fui ao GitHub e criei um novo repositório. Então eu corri

git remote add origin <repository url>

Quando tentei empurrar ou puxar, sempre recebia o mesmo fatal: unrelated_historieserro.

Aqui está como eu o consertei:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master
Adithya Bhat
fonte
Eu acho que estávamos no mesmo barco. Para adicionar algo: Meu problema era que já havia algo no repositório remoto. Então, na minha pasta, ele excluiu a .gitpasta, executou git inite fez o que Adithya disse, exceto a parte de mesclagem.
código é o seguinte
1
Como pressionar o botão INSERT no mac? Na verdade, tenho que digitar a mensagem de confirmação e mesclar na linha de comando, mas não sei como fazê-lo na linha de comando.
Shajeel Afzal
Abre o vim? Se isso acontecer, ele é apenas SHIFT +:
Adithya Bhat
Até eu criei o repositório GitHub primeiro e estava passando por esses comandos para adicionar o repositório.
Sr. Suryaa Jha
1
Esta é uma resposta muito boa. O ponto é que você precisa forçar o pull e mesclar o repositório local e remoto.
alanwsx
151

Para isso, digite o comando:

git pull origin branchname --allow-unrelated-histories

Por exemplo,

git pull origin master --allow-unrelated-histories

Referência:

Problema de histórias não relacionadas ao GitHub

VIKAS KOHLI
fonte
obrigado pela primeira vez retirar suas obras para me "git mestre origem puxar --allow-alheios-histórias"
Ankitkumar Makwana
135
git pull origin <branch> --allow-unrelated-histories

Você será roteado para uma janela de edição do Vim:

  • Inserir mensagem de confirmação
  • Em seguida, pressione Esc(para sair do modo "Inserir"), depois :(dois pontos), depois x(pequeno "x") e, finalmente, pressione Enterpara sair do Vim
  • git push --set-upstream origin <branch>
MJ Montes
fonte
5
Ctrl + X não vai tirá-lo Vim
Ruben
mas :x<Enter>will
webKnjaZ
101

Eu tive o mesmo problema. Tente o seguinte:

git pull origin master --allow-unrelated-histories 

git push origin master
Aamir Kalimi
fonte
47

Tentar git pull --rebase development

Daniel petrov
fonte
Isso resolveu meu problema. Aqui está como o problema começou
Harlan Nelson
1
Provavelmente deve ser:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri
3
@RiccardoMurri Depois de tentar isso, eu não faria isso de novo. Meu novo repositório tinha alguns exemplos de arquivos de inicialização e os meses de repositório local foram confirmados. A execução disso (com o newOrigin branchinvés de development) adicionou a confirmação inicial ao topo da minha filial local, removendo efetivamente quase tudo dela. Eu queria que o commit inicial do novo controle remoto estivesse na parte inferior.
precisa saber é o seguinte
42

Para Android Studio e IntelliJ:

Primeiro, comprometa tudo e resolva quaisquer conflitos.

Em seguida, abra o terminal abaixo do IDE e digite:

git pull origin master --allow-unrelated-histories

Agora você pode empurrar.

Amir Hossein Ghasemi
fonte
38

ADVERTÊNCIA, ISSO PODERÁ SUBSTITUIR O REPOSITÓRIO REMOTO

Isso funcionou para mim:

git push origin master --force
Aniket Patil
fonte
1
Mas o que realmente acontece com arquivos locais e remotos?
Prathamesh Mais
Conforme eu sei e experimentei, os arquivos locais estão intactos. Os arquivos remotos que você deseja adicionar em uma pasta específica são adicionados.
Aniket Patil
5
Não faça isso! Isso substitui todos os arquivos remotos .
Finomnis
Basta incluir um aviso de isenção de responsabilidade que este comando substitui todos os arquivos na ramificação principal . Funcionou bem para mim. Obrigado.
Flavio
1
Ele funciona, mas é bastante dura, os --allow-unrelad-histórias é mais específico e apropriado
bdulac
32

Como todas as outras respostas não estão realmente respondendo à pergunta, aqui está uma solução inspirada por essa resposta em uma pergunta relacionada.

Então você recebe seu erro git rebase:

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

Na verdade, esse erro não cancela a rebase, mas agora você está no meio dela:

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

Agora você pode fazer a mesclagem manualmente. Descubra as confirmações pai da confirmação de mesclagem 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

Descubra qual dos dois pais de mesclagem é o que foi mesclado ao atual (provavelmente o segundo, verifique com git log 222222222) e faça a mesclagem manualmente, copiando a mensagem de confirmação do commit de mesclagem 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
fonte
28

Eu tive o mesmo problema. O problema é remoto tinha algo impedindo isso.

Eu criei um repositório local pela primeira vez. Eu adicionei um arquivo LICENSEe README.mdao meu local e cometi.

Como eu queria um repositório remoto, criei um no GitHub. Aqui cometi um erro ao verificar "Inicializar este repositório com um README" , que também criou um README.md no controle remoto.

Então agora quando eu corri

git push --set-upstream origin master

Eu tenho:

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.

Agora, para superar isso, eu fiz

git pull origin master

O que resultou no erro abaixo:

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

Eu tentei:

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.

Solução:

Eu removi o repositório remoto e criei um novo (acho que apenas a remoção do arquivo READMEpoderia ter funcionado) e depois disso o seguinte funcionou:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master
Lokesh Purohit
fonte
25
a criação de um novo repositório não é uma solução
Zach
3
git pull origem mestre --allow-alheios-histórias trabalhou para mim .. Obrigado
SKalariya
git push --force ... seria uma solução adequada no passo 1 neste caso particular
Konstantin Pelepelin
2
Esta não é uma solução. Se você é iniciante, pode fazer isso, mas se estiver trabalhando com alguns projetos reais, precisará lidar com a maneira correta.
Prathamesh More
27

Isso geralmente acontece quando você confirma a primeira vez no repositório remoto. Como o erro diz claramente "recusando-se a mesclar históricos não relacionados", precisamos usar o sinalizador --allow-related-related-historories.

git pull origin master  --allow-unrelated-histories

Agora, existem alguns conflitos que temos que resolver manualmente. Depois disso, apenas confirme o código e pressione-o.

Santosh Kadam
fonte
Como mencionado na pergunta, estou tentando fazer um git-rebase e não um git-pull, o git-rebase não tem a --allow-unrelated-historiesbandeira.
Shubham Chaudhary
24

Duas possibilidades quando isso pode acontecer -

  1. Você clonou um projeto e, de alguma forma, o diretório .git foi excluído ou corrompido. Isso faz com que o Git desconheça seu histórico local e, portanto, fará com que ele gere esse erro quando você tenta enviar ou receber do repositório remoto.

  2. Você criou um novo repositório, adicionou algumas confirmações e agora está tentando extrair de um repositório remoto que já possui algumas confirmações. O Git também lançará o erro neste caso, pois não tem idéia de como os dois projetos estão relacionados.

SOLUÇÃO

mestre de origem do git pull --allow-unrelated-historories

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

Satakshi Pandey
fonte
12

Eu lutei com isso também, mas consegui encontrar uma solução alternativa.

Quando você se deparar com o erro acima, basta escolher a confirmação de mesclagem e continuar a rebase:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue
el_tigro
fonte
3
No avião inglês, por favor?
Agent Zebra
@AgentZebra Para qualquer disco no plano complexo, uma integral de caminho fechado contínuo é 0.
Addem 27/04
12

Primeiro, puxe as alterações remotas para o seu local usando o seguinte comando:

git pull origin branchname --allow-unrelated-histories

** branchname é mestre no meu caso.

Quando o comando pull é executado, ocorre conflito. Você deve resolver os conflitos. Eu uso o Android Studio para resolver conflitos. insira a descrição da imagem aqui

Quando os conflitos são resolvidos, a mesclagem é feita!

Agora você pode empurrar com segurança.

oiyio
fonte
Estive procurando o botão Resolve Conflictno AS. Às vezes, o pop-up / balão inferior direito desaparece e não consigo fazer nada. Obrigado @oiyio
mochadwi
11

Eu acabei de fazer

  git pull --allow-unrelated-histories
sana ebadi
fonte
Isso não funciona para mim.
Bishwas Mishra
7

Ao fazer um git pull, recebi esta mensagem fatal: refusing to merge unrelated histories para um módulo de repo onde não havia atualizado a cópia local por um tempo.

Eu executei este comando apenas para atualizar o local da origem. Eu só queria as últimas informações do controle remoto e não precisava de alterações locais.

git reset --hard origin/master

Isso corrigiu no meu caso.

striker77
fonte
12
AVISO: Isso excluiu TODOS os meus arquivos. Tenha cuidado se você não sabe o que está fazendo!
Salvi Pascual
2
Isso excluirá todas as alterações pendentes!
Orestis P.
1

Estou usando a rebase há anos e nunca havia encontrado esse problema. No entanto, seu primeiro problema é que você tenta fazê-lo diretamente na ramificação developmentremota do repositório remoto, chamadoorigin . Isso está literalmente errado porque rebase é um comando perigoso, que reestrutura a história do git. Dito isto, você deve primeiro tentar seu repositório local e pressioná-lo apenas, se ele funcionar para você conforme o esperado.

Portanto, meu fluxo de trabalho de rebase usual se parece com o seguinte (mas lembre-se de que você não deve usar rebase em ramificações, o qual não é o único comitê. Para essas ramificações, use simplesmente mesclar e resolver conflitos, se aplicável):

  1. verifique se você tem uma árvore de trabalho limpa (sem alterações sem compromisso)
  2. checkout para a ramificação na qual você deseja refazer a recuperação (por exemplo, digamos que seja master; como um comando de uma linha):git checkout master && git pull origin master && git checkout development
  3. Faça o rebase real: git rebase master
  4. Se estiver pronto e tudo funcionar como esperado, envie-o para o controle remoto. Para fazer isso, você precisa forçá-lo, porque o host remoto já possui o histórico em outra ordem, o remoto responderia sem nada para empurrar. Portanto, precisamos dizer "minha versão local do histórico está correta, substitua tudo nesse ramo remoto usando minha versão local do histórico":git push -f origin development

Como já mencionei, lembre-se de que a reorganização manipula a história do git, que geralmente é uma coisa ruim. No entanto, é possível fazer isso em filiais, onde ninguém mais se compromete. Para manter a ramificação flexível para os outros desenvolvedores, use outra estratégia de mesclagem, como mesclagem em si, squash ou cherrypick. Portanto, em outras palavras: Rebase não deve ser sua ferramenta no desenvolvimento distribuído. Funciona bem se você é o único que trabalha neste repositório.

Usamos a estratégia de ramificação de recursos. Nisso, eu costumo usar rebase para obter as "atualizações" de outros desenvolvedores, que entretanto aconteceram no ramo mestre. Fazendo isso, reduz o tamanho das confirmações visíveis em uma solicitação de recebimento. Portanto, torna mais fácil para o revisor de código ver minhas alterações feitas neste ramo de recursos.

alpham8
fonte
Nesse caso, eu realmente queria continuar com o rebase e a resposta não aborda isso. Conheço os riscos de rebasear e quando devo e não devo usar o git-rebase. Esta é uma diretriz geral (opinativa) para o fluxo de trabalho git e não responde diretamente à pergunta. Quanto ao uso de rebase por anos, esse erro específico foi adicionado na v2.9.0 do git e o fluxo costumava funcionar bem antes desse lançamento. O que você postou nesta resposta aqui já está respondido em perguntas muito mais antigas, como stackoverflow.com/a/11566503/2670370 e git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary,