Ramificação remota do Git excluída, mas ainda aparece em 'branch -a'

552

Digamos que eu tenha um ramo nomeado coolbranchno meu repositório.

Agora, decidi excluí-lo (remotamente e localmente) com:

git push origin :coolbranch
git branch -D coolbranch

Ótimo! Agora o ramo é realmente excluído.

Mas quando eu corro

git branch -a

Eu ainda recebo:

remotes/origin/coolbranch

Algo a se notar é que, quando clono um novo repositório, tudo está bem e git branch -anão mostra o ramo.

Eu quero saber - existe uma maneira de excluir o ramo da branch -alista sem clonar uma nova instância?

yonix
fonte
58
Se você git fetch -p(ou git pull -p), as ramificações remotas serão removidas.
yoyo

Respostas:

688

git remote prune origin, conforme sugerido na outra resposta, removerá todos esses ramos obsoletos. Provavelmente, é isso que você deseja na maioria dos casos, mas se você deseja remover apenas esse ramo de rastreamento remoto específico, deve:

git branch -d -r origin/coolbranch

( -rÉ fácil esquecer ...)

-rnesse caso, "Listará ou excluirá (se usado com -d) as ramificações de rastreamento remoto". de acordo com a documentação do Git encontrada aqui: https://git-scm.com/docs/git-branch

Mark Longair
fonte
11
git remote prune originou qualquer forma de git fetch --prunesinalização não funcionou para mim no meu caso. ... Mas git branch -d -r origin/feature/branch-namefuncionou. Não tenho certeza se isso tem algo a ver com estar sob o featurenamespace (fluxo git), mas foi assim que aconteceu, no caso de algum googler descobrir que isso acontece com eles.
Misterparker
8
Existe uma razão para isso ser necessário? Parece muito ruim deixar esses nomes de ramo inexistentes na lista e não removê-los automaticamente.
akronymn
296

Tentar:

git remote prune origin

Na documentação remota do Git :

ameixa seca

Exclui todas as ramificações de rastreamento remoto antigas em <name>. Essas ramificações antigas já foram removidas do repositório remoto referenciado por <name>, mas ainda estão disponíveis localmente em "remotes / <name>".

Com a opção --dry-run, relate quais ramificações serão removidas, mas na verdade não podem ser removidas.

Brian Phillips
fonte
1
Para completar: deve ser semelhante ao git pull --prunemencionado no stackoverflow.com/a/17983126/94687 E:git remote update --prune
IMZ - Ivan Zakharyaschev
230

Não se esqueça do incrível

git fetch -p

que busca e poda todas as origens.

orip
fonte
Para completar: deve ser igual git remote prune origine semelhante ao git pull --prunemencionado em stackoverflow.com/a/6127884/94687 e stackoverflow.com/a/17983126/94687, respectivamente. E:git remote update --prune
imz - Ivan Zakharyaschev
2
Mas ramos será ainda visível se u executargit branch -a
Nikhil Sahu
1
@NikhilSahu: Eu não estou vendo as filiais remotas que foram removidos mais comgit branch -a
user276648
20

No nosso caso particular, usamos o Stash como nosso repositório Git remoto. Tentamos todas as respostas anteriores e nada estava funcionando. Acabamos tendo que fazer o seguinte:

git branch –D branch-name (delete from local)
git push origin :branch-name (delete from remote)

Então, quando os usuários foram buscar alterações, eles precisavam fazer o seguinte:

git fetch -p
Shadowvail
fonte
git branch -d branch-nametrabalhou para mim. Observe -Dpara -d. De fato, quando tentei com D maiúsculo, -Dele criou um novo ramo com o nome -D
RP-
1
o "-D" é uma maneira de forçar a exclusão, independentemente do status de envio ou mesclagem. Obviamente, tenha cuidado ao usá-lo, mas em muitos casos, isso foi necessário.
Shadowvail
19

Usar:

git remote prune <remote>

Onde <remote>está um nome de fonte remota, como origem ou upstream .

Exemplo: git remote prune origin

likaiguo.happy
fonte
3
para futuros leitores, aqui está a diferença entre git remote prune, git prune,git fetch --prune .
Emile Bergeron