Como faço para excluir uma ramificação do Git local e remotamente?


16959

Quero excluir uma ramificação local e remotamente.

Tentativas com falha para excluir uma ramificação remota

$ git branch -d remotes/origin/bugfix
error: branch 'remotes/origin/bugfix' not found.

$ git branch -d origin/bugfix
error: branch 'origin/bugfix' not found.

$ git branch -rd origin/bugfix
Deleted remote branch origin/bugfix (was 2a14ef7).

$ git push
Everything up-to-date

$ git pull
From github.com:gituser/gitproject

* [new branch] bugfix -> origin/bugfix
Already up-to-date.

O que devo fazer de maneira diferente para excluir com êxito a remotes/origin/bugfixramificação local e remotamente?


1059
Nota do moderador: Se você pretende responder a esta pergunta, observe que já existem 40 respostas postadas. Sua nova resposta agregará algum valor substancial?
Robert Harvey

54
Nota: para o Git 2.5+ (Q2 2015), a mensagem exata será " deleted remote-tracking branch": consulte github.com/git/git/commit/…
VonC

Você pode estar interessado neste script que simplifica a diferença entre a exclusão de uma filial local e um remoto: tlbx.app/blog/delete-any-git-branch-the-easy-way
Mig

@RobertHarvey only 39 now
Adam

@Adam: 81. 42 respostas foram excluídas por vários motivos. A obsessão inexplicável do público por um tópico específico é um dos maiores mistérios da vida.
Robert Harvey

Respostas:


21432

Sumário executivo

$ git push -d <remote_name> <branch_name>
$ git branch -d <branch_name>

Observe que na maioria dos casos o nome remoto é origin. Nesse caso, você terá que usar o comando assim.

$ git push -d origin <branch_name>

Excluir filial local

Para excluir a filial local , use um dos seguintes:

$ git branch -d branch_name
$ git branch -D branch_name

Nota: A -dopção é um alias para --delete, que somente exclui a ramificação se ela já tiver sido totalmente mesclada em sua ramificação upstream. Você também pode usar -D, que é um alias para --delete --force, que exclui a ramificação "independentemente de seu status mesclado". [Fonte: man git-branch]

Excluir ramificação remota [Atualizado em 8 / set / 2017]

No Git v1.7.0 , você pode excluir uma ramificação remota usando

$ git push <remote_name> --delete <branch_name>

que pode ser mais fácil de lembrar do que

$ git push <remote_name> :<branch_name>

que foi adicionado no Git v1.5.0 "para excluir uma ramificação remota ou uma marca".

A partir do Git v2.8.0, você também pode usar git pusha -dopção como um alias para --delete.

Portanto, a versão do Git que você instalou determinará se você precisa usar a sintaxe mais fácil ou mais difícil.

Excluir ramificação remota [Resposta original de 5 de janeiro de 2010]

Do capítulo 3 do Pro Git, de Scott Chacon:

Excluindo ramificações remotas

Suponha que você tenha concluído um ramo remoto - digamos, você e seus colaboradores tenham concluído um recurso e o tenham mesclado no ramo mestre do controle remoto (ou em qualquer ramo em que esteja a linha de código estável). Você pode excluir uma ramificação remota usando a sintaxe bastante obtusa git push [remotename] :[branch]. Se você deseja excluir sua ramificação de correção do servidor, execute o seguinte:

$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix

Estrondo. Não há mais ramificações no seu servidor. Você pode querer ouvir esta página, porque precisará desse comando e provavelmente esquecerá a sintaxe. Uma maneira de lembrar esse comando é lembrando a git push [remotename] [localbranch]:[remotebranch]sintaxe que analisamos um pouco antes. Se você deixar de lado a [localbranch]porção, estará basicamente dizendo: "Não tome nada do meu lado e faça acontecer [remotebranch]".

Eu emiti git push origin: bugfixe funcionou lindamente. Scott Chacon estava certo - vou querer colocar a orelha do cão nessa página (ou praticamente a orelha do cachorro, respondendo isso no Stack Overflow).

Então você deve executar isso em outras máquinas

# Fetch changes from all remotes and locally delete 
# remote deleted branches/tags etc
# --prune will do the job :-;
git fetch --all --prune

propagar alterações.


353
Não se esqueça de fazer um git fetch --all --pruneem outras máquinas depois de excluir a filial remota no servidor. ||| Depois de excluir a ramificação local git branch -de excluir a ramificação remota com git push origin --deleteoutras máquinas, ainda pode haver "ramificações de rastreamento obsoletas" (para vê-las git branch -a). Para se livrar destes fazer git fetch --all --prune.
Trevor Boyd Smith

14
além do @ TrevorBoydSmith git branch -apara visualizar todas as filiais, você também pode usar git branch -rpara exibir apenas filiais remotas. ver também git remote show origin- fonte: gitready.com/intermediate/2009/02/13/list-remote-branches.html
Sandra

17
Eu tive que correr git branch -D Branch_Namepara me livrar da filial local
Kolob Canyon

11
@KolobCanyon Você só precisa usar -D se o ramo não tiver sido mesclado em outro ramo.
BTRUE

3
A pergunta era "O que preciso fazer de maneira diferente para excluir com êxito a ramificação remotes / origin / bugfix localmente e no GitHub?" Depois de executar os comandos na sua resposta atualizada, a ramificação local ainda está presente. Seria bom se a resposta aceita fosse uma resposta completa . Sua absolutamente incrível o quão difícil Git faz tarefas simples ...
JWW

3316

A resposta de Matthew é ótima para remover ramificações remotas e também aprecio a explicação, mas para fazer uma distinção simples entre os dois comandos:

Para remover uma filial local da sua máquina:

git branch -d {the_local_branch}(use -Dpara forçar a exclusão da ramificação sem verificar o status mesclado)

Para remover uma filial remota do servidor:

git push origin --delete {the_remote_branch}

Referência: Git: Excluir uma ramificação (local ou remota)


250
@megido bem -Dforçar exclusões, -ddá-lhe um aviso se não for já se fundiram em.
TankorSmash

8
Se a sua filial local não é fundir com o mestre e correu 'git branch -d your_branchentão você vai erro comoerror: The branch 'your_branch' is not fully merged. If you are sure you want to delete it, run 'git branch -D your_branch'.
geeks de

12
Eu sugeriria usar -d em vez de -D porque é mais seguro. Se -d falhar devido a confirmações não unidas, será necessário avaliar isso e, se for definitivamente aceitável remover, use -D.
ROOBY

7
Outros com clones de repositório em que as ramificações remotas foram removidas devem executar git remote prune <name>(por exemplo git remote prune origin) para remover localmente ramificações antigas que não existem mais no remoto.
precisa saber é o seguinte

3
Gostaria de acrescentar que -d emite um aviso se não estiver mesclado com o HEAD atual. Se você precisar de clareza, recomendo este comando. git branch -a --merged origin/masterEle listará quaisquer ramificações, locais e remotas; que foram mesclados no mestre. Informações adicionais aqui
Eric

2043

As respostas curtas

Se você quiser explicações mais detalhadas dos comandos a seguir, consulte as respostas longas na próxima seção.

Excluindo uma ramificação remota

git push origin --delete <branch>  # Git version 1.7.0 or newer
git push origin -d <branch>        # Shorter version (Git 1.7.0 or newer)
git push origin :<branch>          # Git versions older than 1.7.0

Excluindo uma ramificação local

git branch --delete <branch>
git branch -d <branch> # Shorter version
git branch -D <branch> # Force-delete un-merged branches

Excluindo uma filial de rastreamento remoto local

git branch --delete --remotes <remote>/<branch>
git branch -dr <remote>/<branch> # Shorter

git fetch <remote> --prune # Delete multiple obsolete remote-tracking branches
git fetch <remote> -p      # Shorter

A resposta longa : existem três ramos diferentes para excluir!

Ao lidar com a exclusão de ramificações local e remotamente, lembre-se de que existem três ramificações diferentes envolvidas :

  1. A filial local X.
  2. A ramificação de origem remota X.
  3. A filial de rastreamento remoto local origin/Xque rastreia a filial remota X.

Visualização de três ramos

O pôster original usado:

git branch -rd origin/bugfix

Que só apagados seu local de ramo de rastreamento remoto origin/bugfix , e não o ramo remoto real bugfixon origin.

Diagrama 2

Para excluir essa ramificação remota real , você precisa

git push origin --delete bugfix

Diagrama 3

Detalhes adicionais

As seções a seguir descrevem detalhes adicionais a serem considerados ao excluir suas ramificações remotas e de rastreamento remoto.

Pressionar para excluir ramificações remotas também remove ramificações de rastreamento remoto

Observe que excluir a ramificação remota Xda linha de comando usando a git push também removerá a ramificação local de rastreamento remoto origin/X , portanto, não é necessário remover a ramificação obsoleta do rastreamento remoto com git fetch --pruneou git fetch -p. No entanto, não faria mal se você fizesse isso de qualquer maneira.

Você pode verificar se a ramificação de rastreamento remoto origin/Xtambém foi excluída executando o seguinte:

# View just remote-tracking branches
git branch --remotes
git branch -r

# View both strictly local as well as remote-tracking branches
git branch --all
git branch -a

Eliminando a origem obsoleta da filial de rastreamento remoto local / X

Se você não excluiu sua ramificação remota Xda linha de comando (como acima), seu repositório local ainda conterá uma ramificação de rastreamento remoto (agora obsoleta) origin/X. Isso pode acontecer se você excluir uma ramificação remota diretamente pela interface da web do GitHub, por exemplo.

Uma maneira típica de remover essas ramificações obsoletas de rastreamento remoto (desde o Git versão 1.6.6) é simplesmente executar git fetchcom o --pruneou mais curto -p. Observe que isso remove todas as ramificações locais obsoletas de rastreamento remoto de ramificações remotas que não existem mais no controle remoto :

git fetch origin --prune
git fetch origin -p # Shorter

Aqui está a citação relevante das notas de versão 1.6.6 (ênfase minha):

"git fetch" aprendido --all e --multipleopções, para executar a busca em muitos repositórios e --pruneopção para remover ramificações de rastreamento remoto que ficaram obsoletas. Isso torna a "atualização remota git" e a "remoção remota git" menos necessárias (embora não exista nenhum plano para remover a atualização remota nem a remoção remota).

Alternativa à remoção automática acima para ramificações obsoletas de rastreamento remoto

Como alternativa, em vez de remover suas ramificações obsoletas de rastreamento remoto local git fetch -p, você pode evitar a operação de rede extra apenas removendo manualmente as ramificações com os sinalizadores --remoteou -r:

git branch --delete --remotes origin/X
git branch -dr origin/X # Shorter

Veja também


Pela sua ilustração, posso ver que existem repositórios locais de clones e repositórios de origem remota. Portanto, existem pelo menos dois ramos físicos. Onde está o terceiro ramo a ser excluído? A terceira ramificação é apenas um ponteiro apontando para uma confirmação no repositório de clones local?
huggie

6
@ huggie isso é praticamente correto. As ramificações no Git são apenas indicadores anexados a confirmações. Então, nos meus gráficos acima, existem Xe origin/Xfavoritos no clone local (2 filiais) e depois Xno controle remoto (fazendo 3 filiais).

6
+1 para o ramo de rastreamento remoto. Esse ramo é o que causa problemas quando você clona o ramo de outra pessoa. Ele continua rastreando seus commits e perguntando se você deseja enviar para o ramo dessa pessoa.
Kermit_ice_tea

1
Apenas os gráficos são dourados. Muito bem.
Mogens TrasherDK 02/01

1
Para o bem dos futuros leitores: O que o @Kermit_ice_tea está falando acima é uma ramificação local (conforme descrito nesta resposta), não uma ramificação de rastreamento remoto . Quando uma ramificação local possui uma "ramificação upstream" configurada, por padrão, ela é puxada e enviada para essa ramificação remota. Uma ramificação local que possui uma "ramificação upstream" definida é chamada de "ramificação de rastreamento" , portanto, é fácil confundir com ramificações de rastreamento remoto devido à terminologia semelhante.
David P

1521

Etapas para excluir uma ramificação:

Para excluir a ramificação remota:

git push origin --delete <your_branch>

Para excluir a filial local , você tem três maneiras :

1: git branch -D <branch_name>

2: git branch --delete --force <branch_name>  # Same as -D

3: git branch --delete  <branch_name>         # Error on unmerge

Explique: OK, apenas explique o que está acontecendo aqui!

Basta fazer git push origin --deletepara eliminar a sua filial remota única , adicione o nome do ramo no final e isso vai apagar e empurrá-lo para remoto , ao mesmo tempo ...

Além disso, git branch -Dque simplesmente apagar a filial local única ! ...

-Dsignifica --delete --forceque excluirá o ramo, mesmo que ele não seja mesclado (exclusão forçada), mas você também pode usar o -dque significa --deleteque gera um erro respectivo do status de mesclagem do ramo ...

Também crio a imagem abaixo para mostrar as etapas:

Excluir uma ramificação remota e local no git


49
git branch -aexibirá ramos locais e remotos. Será uma ajuda para você introduzir o diagrama.
LoranceChen

4
observe que, se você estiver definindo a filial que deseja excluir, precisará fazer check-out de uma filial diferente daquela que você deseja excluir (por exemplo: master) antes de excluir a filial local.
BaDr Amer

Quando as ramificações são excluídas na origem, seu repositório local não notará isso. Você ainda terá as versões armazenadas em cache localmente desses ramos (o que é realmente bom), mas o git branch -a ainda os listará como ramos remotos. Você pode limpar essas informações localmente assim: git remote prune origin Suas cópias locais de ramificações excluídas não são removidas por isso. O mesmo efeito é alcançado usandogit fetch --prune
vibs2006 8/19/19

2
A imagem é perturbadora e muito grande e não acrescenta nada à resposta. Espero que isso não se torne uma tendência no SO.
jmiserez

797

Você também pode usar o seguinte para excluir a ramificação remota

git push --delete origin serverfix

O que faz a mesma coisa que

git push origin :serverfix

mas pode ser mais fácil lembrar.


1
... e mais seguro de usar: O
cst1992 29/11

1
Você esqueceu a parte sobre como eliminar a filial local que pode ser feito por: git branch -d <local_branch>ou git branch -D <local_branch>por força de exclusão
Amit traço

370

Dica: Ao excluir ramificações usando

git branch -d <branchname> # Deletes local branch

ou

git push origin :<branchname> # Deletes remote branch

somente as referências são excluídas. Mesmo que a ramificação seja realmente removida no controle remoto, as referências a ela ainda existem nos repositórios locais dos membros da sua equipe. Isso significa que, para outros membros da equipe, as ramificações excluídas ainda são visíveis quando fazem umagit branch -a .

Para resolver isso, os membros de sua equipe podem remover os ramos excluídos com

git remote prune <repository>

Isto é tipicamente git remote prune origin.


14
Você deve esclarecer que a git pushoperação acima exclui a filial local e a filial remota.
Annika Backstrom

22
Observe que git remote pruneé uma maneira um tanto obsoleta de remover ramificações obsoletas de rastreamento remoto, a maneira mais nova de fazer isso é usar git fetch --pruneor git fetch -p.

1
@RRMadhav, na verdade, você não verá o ramo excluído depois de excluí-lo, pois a referência ao ramo remoto será removida localmente. Qualquer outra pessoa em sua equipe que tenha feito check-out desse ramo ainda terá essa referência e ainda a verá, a menos que possa podá-lo.
Pfrenssen

362

Se você deseja excluir uma ramificação, primeiro faça o check-out da ramificação que não seja a ramificação a ser excluída.

git checkout other_than_branch_to_be_deleted

Excluindo a filial local:

git branch -D branch_to_be_deleted

Excluindo a ramificação remota:

git push origin --delete branch_to_be_deleted

261
git branch -D <name-of-branch>
git branch -D -r origin/<name-of-branch>
git push origin :<name-of-branch>

7
Observe que -D força a exclusão. É sempre melhor usar -d, o que lembrará se você precisar fazer algo perigoso.
Jonathon Reinhart

13
ahahah :) depende de você: use -d se você quiser ver o git chorando ou -D se você quiser chorar.
1313 Felipe

225

Isso é simples: basta executar o seguinte comando:

Para excluir uma ramificação do Git local e remotamente, primeiro exclua a ramificação local usando este comando:

git branch -d example

(Aqui exampleestá o nome do ramo.)

E depois disso, exclua a ramificação remota usando este comando:

git push origin :example

199

Outra abordagem é:

git push --prune origin

AVISO: Isso excluirá todas as ramificações remotas que não existem localmente. Ou mais abrangente,

git push --mirror

efetivamente fará com que o repositório remoto se pareça com a cópia local do repositório (cabeças, controles remotos e tags locais são espelhados no controle remoto).


1
A origem do git push --prune não fez nada por mim no gitlab: git clone git: //repo.git; git branch -d -r origin / some-branches; origem git push --une; rendimentos: tudo atualizado; busca do git; traz ramificações excluídas localmente de volta; git push --mirror; agora eles realmente se foram!
Embee

166

Eu uso o seguinte nas minhas configurações do Bash :

alias git-shoot="git push origin --delete"

Então você pode ligar para:

git-shoot branchname

11
I terminou apenas adicione o alias "disparar" em meu .gitconfig shoot = --delete push origin
hdost

Se sua origem for um Atlassian Stash e o ramo estiver definido como padrão, você receberá um erro "Por padrão, a exclusão do ramo atual é negada ...". Eu tive que alterar a ramificação padrão no Stash para apontar para outra ramificação antes que eu pudesse excluir.
neoscribe

Isso é perfeitamente simples como você fez, mas o fyi git também permite que você faça comandos personalizados. Coloque git push origin --delete $1um arquivo no seu caminho chamado git-shoote git shoot branchnametambém funcionará.
mahemoff

132

Excluir localmente:

Para excluir uma filial local, você pode usar:

git branch -d <branch_name>

Para excluir uma ramificação à força, use em -Dvez de -d.

git branch -D <branch_name>

Excluir remotamente:

Existem duas opções:

git push origin :branchname

git push origin --delete branchname

Eu sugiro que você use a segunda maneira, pois é mais intuitiva.


129

Desde janeiro de 2013, o GitHub incluiu um Delete branch botão ao lado de cada ramificação na sua página "Ramificações".

Postagem relevante no blog: criar e excluir ramificações


3
Eu só comecei a usar o Github este ano, então fiquei me perguntando por que essa pergunta era tão bem classificada e por que nenhuma das principais respostas sugeria apenas excluí-la da interface da Web do Github! Interessante que é apenas uma adição recente.
Cam Jackson

6
Eu ia apontar isso. Observe que o botão não excluirá sua ramificação local ... consulte esta resposta para saber como fazer isso: stackoverflow.com/a/10999165/901641
ArtOfWarfare

127

Se você deseja concluir essas duas etapas com um único comando, é possível criar um alias adicionando o seguinte ao seu ~/.gitconfig:

[alias]
    rmbranch = "!f(){ git branch -d ${1} && git push origin --delete ${1}; };f"

Como alternativa, você pode adicionar isso à sua configuração global na linha de comando usando

git config --global alias.rmbranch \
'!f(){ git branch -d ${1} && git push origin --delete ${1}; };f'

NOTA : Se estiver usando -d(d minúsculo), a ramificação será excluída apenas se tiver sido mesclada. Para forçar a exclusão, você precisará usar -D(D maiúsculo).


6
Era isso que eu estava procurando. Meu próprio apelido de função de shell não funcionou (EOF inesperado) e eu não conseguia descobrir o porquê, mas isso funciona muito bem! A única mudança que eu fiz foi substituir &&com ;modo que mesmo se o primeiro comando falhar o segundo ainda irá executar (por vezes apenas local ou única remota).
user1021726

116

Para excluir sua filial local e remotamente

  • Caixa para master branch - git checkout master

  • Exclua sua filial remota - git push origin --delete <branch-name>

  • Exclua sua filial local - git branch --delete <branch-name>


113

Você também pode fazer isso usando git remote prune origin

$ git remote prune origin
Pruning origin
URL: git@example.com/yourrepo.git
 * [pruned] origin/some-branchs

Ele remove e exclui ramificações de rastreamento remoto de uma git branch -rlistagem.


108

Além das outras respostas, costumo usar a ferramenta git_remote_branch . É uma instalação extra, mas oferece uma maneira conveniente de interagir com ramificações remotas. Nesse caso, para excluir:

grb delete branch

Acho que também uso os comandos publishe com trackbastante frequência.


98

Um comando de uma linha para excluir local e remoto :

D=branch-name; git branch -D $D; git push origin :$D

Ou adicione o alias abaixo ao seu ~ / .gitconfig . Uso:git kill branch-name

[alias]
    kill = "!f(){ git branch -D \"$1\";  git push origin --delete \"$1\"; };f"

17
Use️ Use com git branch -Dcuidado em um script, pois ele exclui forçosamente uma ramificação sem verificar se foi mesclada. Use -dpara ser seguro.
caesarsol

94

Exclusão de ramificações

Vamos supor que nosso trabalho no ramo "formulário de contato" esteja concluído e já o integramos no "mestre". Como não precisamos mais dele, podemos excluí-lo (localmente):

$ git branch -d contact-form

E para excluir a filial remota:

git push origin --delete contact-form

87

Excluir filial remota

git push origin :<branchname>

Excluir filial local

git branch -D <branchname>

Exclua as etapas da filial local:

  1. checkout para outro ramo
  2. excluir filial local

3
A exclusão da ramificação remota requer "git push" posteriormente?
Samitha Chathuranga

@SamithaChathuranga não, git push origin :<branchname>já empurra um 'ramo empty` para o controle remoto (daí exclui a filial remota)
Michał Szajbe

86

Basta dizer:

git branch -d <branch-name>
git push origin :<branch-name>

Isso funciona se for seu próprio ramo. Mas se você está podando todos os ramos desnecessários no repo (alguns dos quais não são seu) não seria suficiente
Kermit_ice_tea

83
git push origin --delete <branch Name>

é mais fácil lembrar do que

git push origin :branchName

81

Agora você pode fazer isso com a área de trabalho do GitHub aplicativo .

Depois de iniciar o aplicativo

  1. Clique no projeto que contém a filial
  2. Alterne para o ramo que você deseja excluir

    Ramo de comutação

  3. No menu "Filial", selecione "Cancelar publicação ..." para excluir a filial dos servidores GitHub.

    Cancelar publicação de ramificação

  4. No menu "Filial", selecione "Excluir" branch_name "..." para excluir a ramificação da sua máquina local (também conhecida como a máquina em que você está trabalhando).

    Excluir filial local


15
Não diminuí o voto, mas meu pensamento é que isso não está ajudando substancialmente. Obviamente, a pergunta está pedindo uma resposta mais do tipo linha de comando sem a necessidade de usar um programa externo; se as pessoas clicarem aqui, provavelmente não estarão procurando um github para formas de área de trabalho.
Daemedeor 06/11

12
@ Daemedeor, eu discordo. Em 2010, quando o OP fez a pergunta, a maneira de fazer isso da interface do usuário não existia e a única opção era a linha de comando. Para indicar que você deseja apenas uma opção de linha de comando, ela deve ser declarada na pergunta ou com a tag interface da linha de comandos , que neste caso não está presente.
Eric

3
O comando git para excluir uma ramificação remota é uma porcaria e eu costumo esquecê-la (nova e antiga). Felizmente, existem ferramentas GUI que têm a opção. Git Gui, TortoiseGit e GitHub Desktop têm isso - eu gostaria que o Git Extensions também tivesse essa funcionalidade. Enfim, o que me lembro é de iniciar o Git Gui no Git Extensions quando preciso excluir uma ramificação remota.
vezenkov 25/03

81

É muito simples:

Para excluir a ramificação remota

git push -d origin <branch-name>

Ou

git push origin :<branch-name>

Para excluir ramificação local

git branch -D <branch-name>

2
Eu precisava usar em --deletevez de -dexcluir a filial remota.
ZakJ

-dA opção é um alias para --deletee se o --deletetrabalho -dtambém deve funcionar, se você deseja excluir com força uma ramificação, pode usar em -Dvez de -dou --delete.
Vivek Maru

78

Para excluir localmente - (normal)

git branch -d my_branch

Se sua ramificação estiver em progresso de reestruturação / mesclagem e isso não foi feito corretamente, significa que você receberá um erro, Rebase/Merge in progress ; portanto, nesse caso, não será possível excluir sua ramificação.

Então, você precisa resolver a reestruturação / mesclagem. Caso contrário, você pode forçar a exclusão usando,

git branch -D my_branch

Para excluir no controle remoto :

git push --delete origin my_branch

Você pode fazer o mesmo usando:

git push origin :my_branch   # Easy to remember both will do the same.

Representação gráfica:

Digite a descrição da imagem aqui


68

Isso não funcionará se você tiver uma tag com o mesmo nome da filial no controle remoto:

$ git push origin :branch-or-tag-name
error: dst refspec branch-or-tag-name matches more than one.
error: failed to push some refs to 'git@github.com:SomeName/some-repo.git'

Nesse caso, você precisa especificar que deseja excluir a ramificação, não a tag:

git push origin :refs/heads/branch-or-tag-name

Da mesma forma, para excluir a tag em vez da ramificação, você usaria:

git push origin :refs/tags/branch-or-tag-name

1
Isso é bom, mas as pessoas realmente não deveriam nomear seus ramos e tags com o mesmo nome e o mesmo esquema de nomes em primeiro lugar.

3
Bem, meu cenário era que eu estava convertendo um ramo em uma marca e fazia sentido que a marca tivesse o mesmo nome que a filial. Ao converter quero dizer fusão ramo B para A e marcar a última confirmação no ramo B com tag B de modo que após a exclusão ramo B pode ainda ser facilmente restaurada por simplesmente verificar tag B.
Greg

53

Muitas das outras respostas levarão a erros / avisos. Essa abordagem é relativamente à prova de idiotas, embora você ainda possa precisar git branch -D branch_to_deletese não estiver totalmente integrada some_other_branch, por exemplo.

git checkout some_other_branch
git push origin :branch_to_delete
git branch -d branch_to_delete

A remoção remota não é necessária se você excluiu a ramificação remota. Ele é usado apenas para obter os controles remotos mais atualizados disponíveis em um repositório que você está rastreando. Eu observei git fetchadicionará controles remotos, não os removerá. Aqui está um exemplo de quando git remote prune originrealmente fará algo:

O usuário A executa as etapas acima. O usuário B executaria os seguintes comandos para ver as ramificações remotas mais atualizadas:

git fetch
git remote prune origin
git branch -r

51

Fiquei cansado de pesquisar essa resposta no Google, então adotei uma abordagem semelhante à resposta que o crizCraig postou anteriormente.

Adicionei o seguinte ao meu perfil do Bash:

function gitdelete(){
    git push origin --delete $1
    git branch -D $1
}

Então, toda vez que termino uma ramificação (mesclada master, por exemplo), corro o seguinte no meu terminal:

gitdelete my-branch-name

... que em seguida, exclui my-branch-namede origincomo, bem como localmente.


7
expandindo isso --delete "$@"e , em -D "$@"vez de $1, lidará com isso para várias ramificações.
kunl

3
Eu sugiro que execute git branch -d(com letras minúsculas 'd') primeiro para garantir mudanças foram incorporadas, e em seguida, empurre se bem sucedida (colocar &&entre comandos)
Bryn

49

Antes de executar

git branch --delete <branch>

certifique-se de determinar primeiro qual é o nome exato da ramificação remota executando:

git ls-remote

Isso informará o que digitar exatamente para o <branch>valor. ( branchdiferencia maiúsculas de minúsculas!)


46

Usar:

git push origin :bugfix  # Deletes remote branch
git branch -d bugfix     # Must delete local branch manually

Se tiver certeza de que deseja excluí-lo, execute

git branch -D bugfix

Agora, para limpar ramificações remotas excluídas, execute

git remote prune origin
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.