'git branch -av' mostrando o branch remoto que não existe mais

168

Esta é provavelmente uma pergunta idiota, mas sou novato no git e estou vendo um ramo remoto que não existe mais.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

Não acredito que o ramo de produção exista remotamente e não consigo descobrir por que ele ainda é exibido localmente. Como posso excluir / remover esta ramificação? Veja como é uma tentativa de removê-lo:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

Posso fazer o checkout do ramo de produção supostamente remoto, mas recebo o seguinte:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

Não tenho idéia do que diabos estou fazendo. Qualquer ajuda seria apreciada.

Aproveite a noite
fonte
qual é a saída de git branch -adepois de um git fetch?
alediaferia
A duplicata que propus tem uma resposta que explica muito mais do que os manojlds fizeram aqui.
Cascabel

Respostas:

338

Você tem que fazer:

git remote prune origin
manojlds
fonte
8
Obrigado que funcionou! Você pode elaborar o que está acontecendo nos bastidores?
precisa saber é o seguinte
12
Essas são ramificações de rastreamento remoto em seu repositório local e você precisará desativá-las se as ramificações forem excluídas no repositório remoto.
precisa saber é
2
Raramente, encontro e implemento tão rapidamente uma pergunta e uma resposta tão simples.
jleach
Superb one.In meu i local estava vendo ramos estranhos que não tinham nenhuma conexão com o repo base de código .quando eu corri este comando, ele sintonizado meu ramo origem local e então eu adicionei .thanks mestre a montante
Ankur Srivastava
54

Portanto, existem dois problemas. Nos dois casos, lembre-se de que o Git é distribuído.

Primeiro. Quando você faz coisas como

$ git branch -a

a operação é executada no seu repositório local, NÃO no computador remoto. Em outras palavras, seu repositório local está relatando todos os ramos conhecidos. Podem ser ramificações locais (como 'mestre') ou ramificações remotas que foram buscadas em um controle remoto. Desde a última busca, a ramificação 'produção' do repositório remoto foi alterada, mas o repositório local não sabe disso. A resposta dos manojlds está correta. Corre

origem de remoção remota $ git

para remover galhos obsoletos.

O comando 'git push origin: production' é usado para excluir a ramificação do repositório git do computador remoto. Não é o seu representante local. Nesse caso, alguém já excluiu a ramificação no repositório git do computador remoto, para que você veja esta mensagem de erro.

Aqui está um link que resume esses comandos.

O segundo problema lida com o checkout.

Ao fazer check-out de uma ramificação, você deseja fazer isso de uma ramificação local , não da ramificação remota. É por isso que você recebe o erro sobre um HEAD desanexado. O repositório git-notes tem uma boa explicação do problema em detalhes sangrentos. Basicamente, a frase-chave é

No entanto, quando você faz check-out de algo que não é um nome de filial local apropriado, o HEAD não é mais uma referência simbólica a nada. Em vez disso, ele realmente contém o hash SHA-1 (o ID de confirmação) da confirmação para a qual você está alternando.

Agora, como verificar uma filial local, igual à filial remota?

Fácil, você cria uma filial local, no momento da saída da filial remota.

$ git checkout -b my_local_branch origem / produção

Pablo Maurin
fonte
20
git remote prune origin

está certo, basta adicionar a --dry-runopção de usar , que informa quais ramificações serão removidas do seu repositório local, mas na verdade não as remove

git remote prune origin --dry-run
0xcrab
fonte