Eu tenho muitos ramos do Git. Como excluo ramificações que já foram mescladas? Existe uma maneira fácil de excluir todos eles, em vez de excluí-los um por um?
git
github
version-control
branch
feature-branch
Nyambaa
fonte
fonte
git branch -D
exclui qualquer ramificação, mesclada ou não.master
cada filial está. No entanto, seu cliente local ainda listará as ramificações antigas se você executargit branch -a
; usegit fetch --prune
para removê-los (conforme esta resposta ).git delete-merged --doit origin
ougit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
ao longo dos anos tornou-se a maneira mais fácil de sair de um problema com o git.Respostas:
ATUALIZAR:
Você pode adicionar outros ramos para excluir como mestre e desenvolvedor, se o seu fluxo de trabalho tiver esses como um possível ancestral. Normalmente, eu ramifico uma tag "sprint-start" e o master, dev e qa não são ancestrais.
Primeiro, liste todas as ramificações que foram mescladas no controle remoto.
Você pode ver alguns ramos que não deseja remover. podemos adicionar alguns argumentos para pular ramificações importantes que não queremos excluir como mestre ou um desenvolvimento. O comando a seguir pulará o branch master e qualquer coisa que tenha dev nele.
Se você quiser pular, pode adicioná-lo ao comando egrep, como a seguir. A ramificação
skip_branch_name
não será excluída.Para excluir todas as ramificações locais que já foram mescladas na ramificação com check-out atualmente:
Você pode ver que master e dev são excluídos caso sejam ancestrais.
Você pode excluir uma ramificação local mesclada com:
Se não for mesclado, use:
Para excluí-lo do uso remoto:
Depois de excluir a ramificação do controle remoto, você pode remover as ramificações de rastreamento remoto com:
ou podar ramificações de rastreamento remoto individuais, como a outra resposta sugere, com:
Espero que isto ajude.
fonte
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
se você não tiver ramificações que devam ser excluídas. Para evitar que você possa passar-r
paraxargs
, ele não será executadogit branch -d
se o stdin estiver vazio. (Essa é uma extensão GNU xargs, de acordo com a página do manual).Para excluir todas as ramificações no controle remoto que já foram mescladas:
Nas versões mais recentes do Git
UPDATE (por @oliver; já que não cabe no comentário, mas já há respostas suficientes) : se você estiver no ramo ABC, o ABC aparecerá nos resultados de
git branch -r --merged
porque o ramo não foi especificado, portanto, o padrão do ramo é o ramo atual e um ramo sempre se qualifica como mesclado consigo mesmo (porque não há diferenças entre um ramo e ele próprio!).Então, especifique o ramo:
OU primeiro mestre de checkout:
fonte
dev
então eu tive que mudar isso| grep origin
depoisgrep -v master
para evitar empurrar ramificações de outros controles remotos para a origem. Altamente recomendar testar a saída de antemão, usandogit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
ramo também.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Agora isso acabou sendo o meu apelido.-r
argumento, que não vi mencionado em nenhum outro lugar. É um dado adquirido que apenas as agências locais valem a pena fazer algumas tarefas domésticas. Mas os controles remotos também estão cheios de lixo.myFeatureBranch
nela, a limpeza será feitaorigin/myFeatureBranch
. Provavelmente é melhorgit checkout master
primeiro.Apenas estendendo um pouco a resposta de Adam:
Adicione isso à sua configuração do Git executando
git config -e --global
E então você pode excluir todas as ramificações mescladas locais de maneira simples
git cleanup
.fonte
git branch --merged master
como você deseja ver o que foi mesclado no mestre, o ramo não está atualmente com check-out?develop
oudev
e, nesse caso, o comando falhará comfatal: malformed object name
ele é melhor ter um comando genérico e você tem a responsabilidade de executá-lo-r
axargs
, evitará erros desnecessários (branch name required
) ao executar esse alias várias vezes ou quando não houver nenhum ramo a ser excluído. Meu pseudônimo é assim:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Isso também funciona para excluir todas as ramificações mescladas, exceto a principal.
fonte
master
nele. Tentegrep -v ^master$
pelo meio.| grep -v '^\*'
para evitar deletting ramificação atual se você estiver não no mestregrep -v '^ master$'
. Se você digitar e perder um, será excluídomaster
se não estiver nele.git branch
listará cada nome de filial em uma nova linha com dois espaços à esquerda, se não for a filial com check-out no momento. Você basicamente garantiu que qualquer pessoa que execute esse comando excluirá sua ramificação principal, a menos que seja a ramificação com check-out atualmente.Você deseja excluir os
master
&develop
branches desses comandos.Git local claro:
Remoto git clear:
Sincronize o registro local de filiais remotas:
fonte
git config --global --add fetch.prune true
podar automaticamente ao buscar ou puxar.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Para aqueles que estão no Windows e preferem scripts do PowerShell, aqui está um que exclui ramificações locais mescladas:
fonte
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(suspiro, substitua aspas duplas por simples, não sei como formatar um literal que contém aspas)Eu tenho usado a resposta de Adam há anos. Dito isto, há alguns casos em que não estava se comportando como eu esperava:
1 e 2 foram diretos, com apenas uma alteração no regex. 3 depende do contexto do que você deseja (ou seja, exclua apenas os ramos que não foram mesclados no mestre ou no ramo atual). 4 tem o potencial de ser desastroso (embora recuperável com
git reflog
), se você o executou acidentalmente no estado HEAD desanexado.Finalmente, eu queria que tudo isso estivesse em uma linha única que não exigisse um script separado (Bash | Ruby | Python).
TL; DR
Crie um alias do git "sweep" que aceite um
-f
sinalizador opcional :e invoque-o com:
ou:
A resposta longa e detalhada
Para mim, foi mais fácil criar um exemplo de repositório git com algumas ramificações e se comprometer a testar o comportamento correto:
Crie um novo repositório git com um único commit
Crie algumas novas ramificações
Comportamento desejado: selecione todas as ramificações mescladas, exceto: mestre, desenvolvimento ou atual
O regex original perde os ramos "masterful" e "notmaster":
Com o regex atualizado (que agora exclui "develop" em vez de "dev"):
Alterne para o ramo foo, faça um novo commit e faça o checkout de um novo ramo, foobar, com base no foo:
Minha ramificação atual é foobar, e se eu executar novamente o comando acima para listar as ramificações que desejo excluir, a ramificação "foo" será incluída mesmo que não tenha sido mesclada no master:
No entanto, se eu executar o mesmo comando no mestre, o ramo "foo" não será incluído:
E isso é simplesmente porque o
git branch --merged
padrão é o HEAD do ramo atual, se não especificado de outra forma. Pelo menos para o meu fluxo de trabalho, não desejo excluir ramificações locais, a menos que tenham sido mescladas para mestre, por isso prefiro a seguinte variante:Estado HEAD desanexado
Confiar no comportamento padrão de
git branch --merged
tem consequências ainda mais significativas no estado HEAD desanexado:Isso teria excluído o ramo em que eu estava, "foobar" junto com "foo", que quase certamente não é o resultado desejado. Com nosso comando revisado, no entanto:
Uma linha, incluindo a exclusão real
Tudo embrulhado em um apelido git "varredura":
O alias aceita um
-f
sinalizador opcional . O comportamento padrão é excluir apenas as ramificações que foram mescladas no mestre, mas o-f
sinalizador excluirá as ramificações que foram mescladas na ramificação atual.fonte
git config
atômico?!f(){ git branch ...
. É uma declaração de função, certo? Por que não começar diretamentegit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Exceto que isso excluiriadevelop
, mas pode ser uma abordagem mais simples.Git Sweep faz um ótimo trabalho nisso.
fonte
Usando o Git versão 2.5.0:
fonte
master
ramo btw!master
.git branch -d $(git branch --merged | grep -v master)
Você pode adicionar o commit à opção --merged. Desta forma, você pode ter certeza de remover apenas as ramificações que são mescladas, como a origem / mestre
O comando a seguir removerá as ramificações mescladas de sua origem.
Você pode testar quais ramificações serão removidas substituindo a origem do git push --delete by echo
fonte
Eu uso o seguinte script Ruby para excluir minhas ramificações locais e remotas já mescladas. Se eu estiver fazendo isso para um repositório com vários controles remotos e quiser excluir apenas um, basta adicionar uma instrução select à lista de controles remotos para obter apenas os controles remotos desejados.
fonte
\/
no início da declaração de rejeição para aremote_branches
linha. Isso é um erro de digitação ou serve a um propósito?b.split(/\//)
linha agoraComo excluir ramificações mescladas no console do PowerShell
Se você deseja excluir nomes principais ou outros ramos, pode canalizar com o PowerShell Select-String como este e passar o resultado para
git branch -d
:fonte
* master
:) #A resposta de kuboon perdeu a exclusão de ramificações que possuem a palavra mestre no nome da ramificação. O seguinte melhora sua resposta:
Obviamente, ele não exclui o ramo "mestre" em si :)
fonte
Não há nenhum comando no Git que faça isso automaticamente por você. Mas você pode escrever um script que use os comandos Git para fornecer o que você precisa. Isso pode ser feito de várias maneiras, dependendo do modelo de ramificação que você está usando.
Se você precisar saber se um ramo foi mesclado no mestre, o comando a seguir não produzirá saída se o myTopicBranch foi mesclado (ou seja, você pode excluí-lo)
Você pode usar o comando Git branch e analisar todos os branches no Bash e fazer um
for
loop sobre todos os branches. Nesse loop, você verifica com o comando acima se pode excluir o ramo ou não.fonte
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
excluirá todas as filiais locais, exceto a filial com check-out atual e / oumaster
.Aqui está um artigo útil para quem procura entender esses comandos: Git Clean: Excluir ramos já mesclados, de Steven Harman .
fonte
Nota : Não estou satisfeito com as respostas anteriores (não estou trabalhando em todos os sistemas, não estou trabalhando no controle remoto, não especificando a ramificação --merged, não filtrando exatamente). Então, adiciono minha própria resposta.
Existem dois casos principais:
Local
Você deseja excluir as ramificações locais que já foram mescladas com outra ramificação local . Durante a exclusão, você deseja manter alguns ramos importantes, como mestre, desenvolvimento etc.
Notas :
git branch output --format
".." é remover os espaços em branco e permitir a correspondência exata de grepgrep -E
é usado em vez deegrep
, portanto, também funciona em sistemas sem egrep (ou seja: git para windows).grep -E -v '^master$|^feature/develop$'
é especificar ramificações locais que não quero excluirxargs -n 1 git branch -d
: executa a exclusão de ramificações locais (não funcionará em ramificações remotas)Controlo remoto
Você deseja excluir ramificações remotas que já foram mescladas com outra ramificação remota . Durante a exclusão, você deseja manter algumas ramificações importantes, como HEAD, master, releases, etc.
Notas :
-r
opção e fornecemos o nome completo da filial :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
é combinar as ramificações remotas que não queremos excluir.cut -d/ -f2-
: remova o prefixo 'origin /' desnecessário que, caso contrário, é impresso pelogit branch
comando.xargs -n 1 git push --delete origin
: executa a exclusão de ramificações remotas.fonte
Se você estiver no Windows, poderá usar o Windows Powershell ou o Powershell 7 com Out-GridView para ter uma boa lista de ramificações e selecionar com o mouse qual você deseja excluir:
depois de clicar em OK, o PowerShell passará os nomes desses ramos para
git branch -d
comandá-los e excluí-losfonte
Você pode usar a
git-del-br
ferramenta .Você pode instalá-lo
pip
usandoPS: Eu sou o autor da ferramenta. Quaisquer sugestões / comentários são bem-vindos.
fonte
Se você deseja excluir todos os ramos locais que já estão mesclados no ramo em que está atualmente, criei um comando seguro para fazer isso, com base nas respostas anteriores:
Este comando não afetará sua ramificação atual ou sua ramificação mestre. Ele também informará o que está fazendo antes, usando o sinalizador -t do xargs.
fonte
Versão em alias da resposta atualizada de Adam :
Além disso, consulte esta resposta para obter dicas úteis sobre como escapar de aliases complexos.
fonte
Eu uso um esquema de nomeação de esquemas git-flow, então isso funciona com muita segurança para mim:
Ele basicamente procura confirmações mescladas que começam com string
fix/
oufeature/
.fonte
Tente o seguinte comando:
Ao usar
git rev-parse
, obterá o nome do ramo atual para excluí-lo. Se você encontrou o erro, isso significa que não há ramificações locais para remover.Para fazer o mesmo com ramificações remotas (mude
origin
com seu nome remoto), tente:Caso você tenha vários controles remotos, adicione
grep origin |
antescut
para filtrar apenas oorigin
.Se o comando acima falhar, tente excluir primeiro as ramificações de rastreamento remoto mescladas:
Em seguida,
git fetch
controle remoto novamente e use ogit push -vd
comando anterior novamente.Se você o estiver usando com frequência, considere adicionar como alias ao seu
~/.gitconfig
arquivo.Caso você tenha removido algumas ramificações por engano, use
git reflog
para encontrar as confirmações perdidas.fonte
Com base em algumas dessas respostas, eu criei meu próprio script Bash para fazer isso também !
Ele usa
git branch --merged
egit branch -d
exclui as ramificações que foram mescladas e solicita a você cada uma das ramificações antes de excluir.fonte
A consulta abaixo funciona para mim
e isso filtrará qualquer ramificação no tubo grep.
Funciona bem no clone http, mas não tão bem na conexão ssh.
fonte
A partir de 2018.07
Adicione isso à sua
[alias]
seção~/.gitconfig
:Agora você pode simplesmente ligar
git sweep
para executar a limpeza necessária.fonte
No Windows com o git bash instalado, o egrep -v não funcionará
onde
grep -E -v
é equivalente aegrep -v
Use
-d
para remover ramificações já mescladas ou-D
para remover ramificações não imersasfonte
Eu tenho usado o seguinte método para remover ramificações locais e remotas mescladas em um cmd.
Eu tenho o seguinte no meu
bashrc
arquivo:fonte original
Isso não exclui a ramificação principal, mas remove ramificações locais E remotas mescladas . Depois de ter isso em seu arquivo rc, basta executar
rmb
, você verá uma lista de ramos mesclados que serão limpos e solicitados para confirmação da ação. Você pode modificar o código para não pedir confirmação também, mas provavelmente é bom mantê-lo.fonte
Escreva um script no qual o Git verifique todas as ramificações que foram mescladas no mestre.
Então faça
git checkout master
.Por fim, exclua as ramificações mescladas.
fonte
A solução aceita é muito boa, mas o problema é que ela também exclui ramificações locais que ainda não foram mescladas em um controle remoto.
Se você olhar para a saída, verá algo como
Ramificações
bla
eissue_248
ramificações locais que seriam excluídas silenciosamente.Mas você também pode ver a palavra
[gone]
, que indica ramificações que foram enviadas para um controle remoto (que agora se foi) e, portanto, indica que ramificações podem ser excluídas.A resposta original pode, portanto, ser alterada para (dividida em várias linhas para menor comprimento de linha)
para proteger os ramos ainda não mesclados. Também não é necessário o grepping para o mestre protegê-lo, pois ele tem um controle remoto na origem e não aparece como desaparecido.
fonte
Para mim
git branch --merged
, não mostra ramificações que foram mescladas via GitHub PR. Não tenho certeza dos motivos, mas uso a seguinte linha para excluir todas as ramificações locais que não possuem ramificação de rastreamento remoto :Explicação:
git branch --format "%(refname:short)"
fornece uma lista de filiais locaisgit branch -r | grep -v HEAD | cut -d/ -f2-
fornece uma lista de ramificações remotas, filtrandoHEAD
diff <(...) <(...)
fornece uma diferença de saída de dois comandos entre parêntesesgrep '<'
filtra ramificações existentes na primeira lista, mas não na segundacut -c 3-
fornece uma linha a partir do terceiro caractere, removendo assim o prefixo<
xargs git branch -D
executagit branch -D
contra cada nome de filialComo alternativa, você pode evitar
grep -v '<'
assim:fonte