Git checkout: atualizar caminhos é incompatível com a alternância de ramificações

467

Meu problema está relacionado ao erro Fatal Git ao mudar de ramificação .

Eu tento buscar uma ramificação remota com o comando

git checkout -b local-name origin/remote-name

mas recebo esta mensagem de erro:

fatal: git checkout: atualizar caminhos é incompatível com a alternância de ramificações.
Você pretendia fazer checkout 'origin / remote-name' que não pode ser resolvido como confirmação?

Se eu criar manualmente uma ramificação e depois puxar a ramificação remota, ele funcionará, assim como criar um novo clone e verificar a ramificação.

Por que não funciona no repositório com o qual trabalho?

Ikke
fonte
1
o que mudou desde a primeira instância desse comando (acionando a mensagem de erro)?
VonC 03/06/2009
git o init git fetch git fetch git: //blabla.com/dir1/Project.git

Respostas:

739

Acredito que isso ocorra quando você estiver tentando efetuar o checkout de uma filial remota da qual seu repositório git local ainda não está ciente. Tentar:

git remote show origin

Se a ramificação remota que você deseja efetuar o checkout estiver em "Novas ramificações remotas" e não em "Ramificações remotas rastreadas", será necessário buscá-las primeiro:

git remote update
git fetch

Agora deve funcionar:

git checkout -b local-name origin/remote-name
user167628
fonte
7
Isso resolveu o problema para mim, não a resposta arbitrária acima.
Jessedc
21
Isso deve ser "git fetch REPOSITORY_NAME" para obter todas as ramificações desse repositório.
Mike Thomsen
1
não necessariamente. git fetchobterá todas as ramificações de todos os repositórios remotos.
Michael Grinich
4
Caso alguém mais lute com a total loucura de tudo isso: git fetch origin / branchname Não é o mesmo que git fetch. O primeiro simplesmente resulta em "new (a próxima busca será armazenada em controles remotos / origem)" exibida em uma coluna visível via git remote show origin.
precisa
7
Se você estiver tentando fazer isso para um controle remoto que você adicionou explicitamente (portanto, qualquer coisa que não seja origem ), precisará fazer git remote updateantes que sua busca o busque. Caso contrário, você receberá mensagens como Did you intend to checkout 'upstream-repo/master' which can not be resolved as commit?Por favor, adicione isso à resposta e economize horas nas pessoas lendo as mesmas respostas que funcionam apenas para a origem.
Bruno Bronosky
150

Sintaxe alternativa,

git fetch origin remote_branch_name:local_branch_name
Prazeres Raros
fonte
12
Isso funcionou para mim. Meu nome de filial remota não é de origem. Não sei se isso faz diferença, pois estou bebendo vodka.
Rimian
13
Este não é apenas uma sintaxe alternativa, mas pode trabalhar quando git checkout -b branch_name origem / branch_name não trabalho
codercake
1
Isso também corrigiu meu problema ao executar o "git checkout --track origin / remote-branch", que originalmente dava o mesmo erro que os OPs antes da correção. Obrigado!
Kakyo
1
Trabalhou para mim depois de executar também a resposta validada.
Aster
2
Sim, suspeito que o --depthqualificador do clone original possa estar errado aqui. Eu tive sucesso, git fetch remote_branch_name:local_branch_namemas todos os outros conselhos falharam.
precisa
46

Depois de ter tentado quase tudo o que pude ler neste tópico sem sucesso, deparei-me com este: O ramo remoto não aparece no "git branch -r"

Aconteceu que meu arquivo .git / config estava incorreto. Depois de fazer uma correção simples, todos os galhos apareceram.

Indo de

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/master:refs/remotes/origin/master

para

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Fez o truque

PålOliver
fonte
4
Essa é realmente uma configuração estranha. Ele diz ao git para buscar apenas a ramificação principal do controle remoto.
Ikke
3
Eu votaria 10 vezes se pudesse! - este parece ser alguma coisa que nova git faz quando clonagem
mpapis
2
Eu tive o mesmo problema, estava me deixando louco. Quem não vê ramificações remotas, verifique isso !!
Carlos Granados
Graças a Deus pela sua resposta :)
Sacha
Mente = queimada! Obrigado!
Chiranjib 28/06/19
12

Não tenho certeza se isso é útil ou exatamente relevante para sua pergunta, mas se você estiver tentando buscar e efetuar check-out apenas uma única ramificação do repositório remoto, os seguintes comandos git farão o truque:

url= << URL TO REPOSITORY >>
branch= << BRANCH NAME >>

git init
git remote add origin $url
git fetch origin $branch:origin/$branch
git checkout -b $branch --track origin/$branch
VirtualStaticVoid
fonte
11

nenhuma das opções acima funcionou para mim. Minha situação é um pouco diferente, minha filial remota não está na origem . mas em um repositório diferente.

git remote add remoterepo GIT_URL.git
git fetch remoterepo
git checkout -b branchname remoterepo/branchname

dica: se você não vir a ramificação remota na saída a seguir, git branch -v -anão há como fazer check-out.

Trabalho confirmado em 1.7.5.4

Olivier Refalo
fonte
arf, basta perceber que o VirtualStaticVoid tinha a mesma solução!
Olivier Refalo 11/07
+1 para git branch -v -a: eu tinha um controle remoto configurado incorretamente que dizia fetch = +refs/heads/*:refs/remotes/master/*mesmo que o controle remoto fosse chamado upstream.
Keflavich
7

Para mim, o que funcionou foi:

git fetch

O que puxa todos os árbitros para a sua máquina para todos os ramos no controle remoto. Então eu poderia fazer

git checkout <branchname>

e isso funcionou perfeitamente. Semelhante à resposta mais votada, mas um pouco mais simples.

Matt
fonte
4

Suspeito que não haja uma filial remota chamada remote-name, mas que você inadvertidamente criou uma filial local chamada origin / remote-name.

É possível que você em algum momento tenha digitado:

origem do ramo git / nome remoto

Assim, criando um ramo local chamado origem / nome remoto? Digite este comando:

origem do git checkout / nome remoto

Você verá:

Alterado para a ramificação "origin / remote-name"

o que significa que é realmente um ramo local com nome incorreto ou

Nota: movendo-se para "origin / rework-isscoring" que não é uma filial local
Se você deseja criar uma nova ramificação a partir deste checkout, faça isso
(agora ou mais tarde) usando -b com o comando checkout novamente. Exemplo:
  git check--b 

o que significa que realmente é um ramo remoto.

Don Branson
fonte
3

Não é muito intuitivo, mas funciona bem para mim ...

  mkdir remote.git & cd remote.git & git init
  git remote add origin $REPO
  git fetch origin $BRANCH:refs/remotes/origin/$BRANCH        

ENTÃO, execute o comando git branch --track ...

  git branch --track $BRANCH origin/$BRANCH
Eddie B
fonte
2

Para mim, eu tive um erro de digitação e minha filial remota não existia

Use git branch -apara listar ramificações remotas

Thomas
fonte
1

Seu problema pode estar vinculado a essa outra pergunta do SO "problema de pagamento" ?

ou seja: um problema relacionado a:

  • uma versão antiga do Git
  • uma sintaxe de checkout curiosa, que deve ser :, git checkout -b [<new_branch>] [<start_point>]com [<start_point>]referência ao nome de um commit no qual iniciar a nova ramificação, e 'origin/remote-name'não é isso.
    (considerando git branchque suporta um ponto de partida sendo o nome de uma ramificação remota)

Nota: o que o script checkout.sh diz é:

  if test '' != "$newbranch$force$merge"
  then
    die "git checkout: updating paths is incompatible with switching branches/forcing$hint"
  fi

É como se a sintaxe git checkout -b [] [remote_branch_name] estivesse renomeando a ramificação e redefinindo o novo ponto inicial da nova ramificação, que é considerada incompatível.

VonC
fonte
O problema está resolvido. git checkout -b locais-nome remoto / remoto ramo realmente funciona
Ikke
1
Interessante, o que mudou desde a primeira instância desse comando (acionando a mensagem de erro)?
VonC 03/06/2009
1

Depois de buscar um zilhão de vezes, os controles remotos ainda não apareceram, embora as bolhas estivessem na piscina. Acontece que a opção --tags não deve ser dada git remote addpor qualquer motivo. Você pode removê-lo manualmente do .git / config para fazer o git fetch criar as referências.

eMPee584
fonte