как я могу удалить все ветки git, которые были объединены?

<p>у меня много веток git. как удалить ветки, которые уже были объединены? есть ли простой способ удалить их все вместо того, чтобы удалять их по одному?</p>

<p>обновление:</p><p>вы можете добавить другие ветви, чтобы исключить их как master и dev, если ваш рабочий процесс имеет их в качестве возможного предка. обычно я разветвляюсь от тега «sprint-start» и master, dev и qa не являются предками.</p><p>сначала перечислите все ветви, которые были объединены в удаленном.</p><pre><code>git branch --merged </code></pre><p>вы можете увидеть несколько веток, которые не хотите удалять. мы можем добавить несколько аргументов, чтобы пропустить важные ветки, которые мы не хотим удалять, как master или development. следующая команда пропустит основную ветвь и все, что содержит dev.</p><pre><code>git branch --merged| egrep -v "(^\*|master|dev)" </code></pre><p>если вы хотите пропустить, вы можете добавить его в команду egrep, как показано ниже. ветка <code>skip\_branch\_name</code> не будет удалена. </p><pre><code>git branch --merged| egrep -v "(^\*|master|dev|skip\_branch\_name)" </code></pre><p>чтобы удалить все локальные ветви, которые уже объединены в текущую извлеченную ветку:</p><pre><code>git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d </code></pre><p>вы можете видеть, что master и dev исключены, если они являются предками.</p><hr><p>вы можете удалить объединенную локальную ветку с помощью:</p><pre><code>git branch -d branchname </code></pre><p>если он не объединен, используйте:</p><pre><code>git branch -d branchname </code></pre><p>чтобы удалить его с пульта в старых версиях git, используйте:</p><pre><code>git push origin :branchname </code></pre><p>в более поздних версиях git используют:</p><pre><code>git push --delete origin branchname </code></pre><p>как только вы удалите ветку с удаленного компьютера, вы можете удалить prune для удаленного отслеживания веток с помощью:</p><pre><code>git remote prune origin </code></pre><p>или обрезать отдельные ветви удаленного отслеживания, как предполагает другой ответ, с помощью:</p><pre><code>git branch -dr branchname </code></pre><p>надеюсь это поможет.</p>

<p>чтобы удалить все удаленные ветви, которые уже объединены:</p><pre><code>git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin </code></pre><p>в более поздних версиях git</p><pre><code>git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin </code></pre>

<p>просто немного расширив ответ адама:</p><p>добавьте это в свою конфигурацию git, запустив <code>git config -e --global</code></p><pre><code>[alias] cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d" </code></pre><p>и тогда вы можете удалить все локальные объединенные ветви, выполнив простой <code>git cleanup</code>.</p>

<p>это также работает для удаления всех объединенных ветвей, кроме главной.</p><pre><code>git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d </code></pre>

<p>вы захотите исключить ветви <code>master</code> & <code>develop</code> из этих команд.</p><p>локальный мерзавец ясно: </p><pre><code>git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d </code></pre><p>удаленный git clear: </p><pre><code>git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin </code></pre><p>синхронизация локального реестра удаленных филиалов: </p><pre><code>git fetch -p </code></pre>

<p>для тех из вас, кто работает в windows и предпочитает скрипты powershell, вот тот, который удаляет локальные объединенные ветви:</p><pre><code>function remove-mergedbranches { git branch --merged | foreach-object { $_.trim() } | where-object {$\_ -notmatch "^\*"} | where-object {-not ( $_ -like "master" )} | foreach-object { git branch -d $\_ } } </code></pre>

<p> <a href="https://github.com/arc90/git-sweep">git sweep</a> делает большую работу из этого.</p>

<p>использование git версии 2.5.0:</p><pre><code>git branch -d `git branch --merged` </code></pre>

<p>я использовал ответ адама в течение многих лет. тем не менее, есть некоторые случаи, когда он не вел себя так, как я ожидал:</p><ol> <li>ветви, которые<em> содержали </em>слово "мастер" были проигнорированы, например, "notmaster" или "masterful", а не только основная ветвь</li> <li>ветви, которые<em> содержали </em>слово "dev" были проигнорированы, например, "dev-test", а не только ветка dev</li> <li>удаление веток, которые доступны из заголовка<em> current </em>branch (то есть не обязательно master)</li> <li>в отключенном состоянии head, удаление<em> каждой </em>ветви, достижимой из текущего коммита</li> </ol><p>1 и 2 были просты для решения, просто изменив регулярное выражение. 3 зависит от контекста того, что вы хотите (т.е. удаляете только те ветки, которые не были объединены с master или с вашей текущей веткой) . 4 может привести к катастрофическим последствиям (хотя их можно восстановить с помощью <code>git reflog</code>), если вы непреднамеренно запустили это в отсоединенном состоянии head.</p><p>наконец, я хотел, чтобы все было в одной строке, для которой не требовался отдельный скрипт (bash | ruby | python).</p><h2>tl; dr</h2><p>создайте псевдоним git «sweep», который принимает необязательный флаг <code>-f</code>:</p><pre><code>git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]] \ && git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"  | xargs git branch -d; }; f' и вызвать его с помощью:git sweep или же:git sweep -f длинный, подробный ответмне было проще создать пример git-репо с некоторыми ветками и коммитами для проверки правильности поведения:создать новый репозиторий git с одним коммитомmkdir sweep-test && cd sweep-test && git init echo "hello" > hello git add . && git commit -am "initial commit" создайте несколько новых ветокgit branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful git branch --list <blockquote>  bar develop foo  master masterful notmaster  </blockquote>желаемое поведение: выберите все объединенные ветви, кроме: master, development или current в оригинальном регулярном выражении пропущены ветки "masterful" и "notmaster":git checkout foo git branch --merged | egrep -v "(^|master|dev)" <blockquote>  bar  </blockquote>с обновленным регулярным выражением (которое теперь исключает «развернуть», а не «dev»):git branch --merged | egrep -v "(^|^s(master|develop)$)" </code></pre><blockquote> <pre><code>bar masterful notmaster </code></pre> </blockquote><h3>переключитесь на ветку foo, сделайте новый коммит, затем извлеките новую ветку foobar на основе foo:</h3><pre><code>echo "foo" > foo git add . && git commit -am "foo" git checkout -b foobar echo "foobar" > foobar git add . && git commit -am "foobar" </code></pre><p>моя текущая ветка - это foobar, и если я перезапущу приведенную выше команду для вывода списка веток, которые я хочу удалить, ветка "foo" будет включена, даже если она не была объединена с master:</p><pre><code>git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" <blockquote>  bar foo masterful notmaster  </blockquote>однако, если я запускаю ту же команду на master, ветка "foo" не включается:git checkout master && git branch --merged | egrep -v "(^|^s(master|develop)$)" </code></pre><blockquote> <pre><code> bar masterful notmaster </code></pre> </blockquote><p>и это просто потому, что <code>git branch --merged</code> по умолчанию равен head текущей ветви, если не указано иное. по крайней мере, для моего рабочего процесса я не хочу удалять локальные ветви, если они не были объединены с master, поэтому я предпочитаю следующий вариант:</p><pre><code>git checkout foobar git branch --merged $(git rev-parse master) | egrep -v "(^|^s(master|develop)$)" </code></pre><blockquote> <pre><code> bar masterful notmaster </code></pre> </blockquote><h3>отделенное состояние head</h3><p>использование стандартного поведения <code>git branch --merged</code> имеет еще более существенные последствия в отключенном состоянии head:</p><pre><code>git checkout foobar git checkout head~0 git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)" <blockquote>  bar foo foobar masterful notmaster  </blockquote>это удалило бы ветку, на которой я только что находился, «foobar» вместе с «foo», что почти наверняка не является желаемым результатом…. однако с нашей пересмотренной командой:git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" <blockquote>  bar masterful notmaster  </blockquote>одна строка, включая фактическое удалениеgit branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d все закутано в git псевдоним "sweep":git config --global alias.sweep '!f(){ git branch --merged $([[ $1 != "-f" ]]  && git rev-parse master) | egrep -v "(^|^s(master|develop)$)" \ | xargs git branch -d; }; f' </code></pre><p>псевдоним принимает необязательный флаг <code>-f</code>. поведение по умолчанию - удаление только тех веток, которые были объединены в master, но флаг <code>-f</code> удалит ветки, которые были объединены в текущую ветку.</p><pre><code>git sweep </code></pre><blockquote> <pre><code>deleted branch bar (was 9a56952). deleted branch masterful (was 9a56952). deleted branch notmaster (was 9a56952). </code></pre> </blockquote><pre><code>git sweep -f </code></pre><blockquote> <pre><code>deleted branch foo (was 2cea1ab). </code></pre> </blockquote>

<p>вы можете добавить коммит в опцию --merged . таким образом, вы можете быть уверены, что удаляете только ветки, которые объединены в то есть в origin/master.</p><p>следующая команда удалит объединенные ветви из вашего происхождения.</p><pre><code>git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete </code></pre><p>вы можете проверить, какие ветви будут удалены, заменив git push origin --delete на echo</p><pre><code>git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo </code></pre>

<p>я использую следующий скрипт ruby для удаления уже слитых локальных и удаленных веток. если я делаю это для репозитория с несколькими пультами и хочу удалить только с одного, я просто добавляю оператор выбора в список удаленных, чтобы получить только те пульты, которые мне нужны.</p><pre class="lang-ruby prettyprint-override"><code>#!/usr/bin/env ruby current\_branch = `git symbolic-ref --short head`.chomp if current\_branch != "master" if $?.exitstatus == 0 puts "warning: you are on branch #{current_branch}, not master." else puts "warning: you are not on a branch" end puts end puts "fetching merged branches..." remote_branches= git branch -r --merged. split("n"). map(&:strip). reject {|b| b =~ //(#{current_branch}|master)/} local_branches= git branch --merged. gsub(/^ /, ''). split("n"). map(&:strip). reject {|b| b =~ /(#{current_branch}|master)/} if remote_branches.empty? && local_branches.empty? puts "no existing branches have been merged into #{current_branch}." else puts "this will remove the following branches:" puts remote_branches.join("n") puts local_branches.join("n") puts "proceed?" if gets =~ /^y/i remote_branches.each do |b| remote, branch = b.split(///) git push #{remote} :#{branch} end # remove local branches git branch -d #{local_branches.join(' ')} else puts "no branches removed." end end 

как удалить объединенные ветви в консоли powershellgit branch --merged | %{git branch -d $\_.trim()} </code></pre><p>смотрите <a href="https://windows.github.com/">github для windows</a> </p>

<p>в git нет команды, которая сделает это автоматически. но вы можете написать скрипт, который использует команды git, чтобы дать вам то, что вам нужно. это может быть сделано разными способами в зависимости от используемой модели ветвления. </p><p>если вам нужно знать, была ли ветка объединена с главной, следующая команда не выдаст выходных данных, если mytopicbranch был объединен (т.е. вы можете удалить ее)</p><pre><code>$ git rev-list master | grep $(git rev-parse mytopicbranch) </code></pre><p>вы можете использовать команду ветки git, проанализировать все ветви в bash и выполнить цикл <code>for</code> по всем веткам. в этом цикле вы проверяете вышеуказанной командой, можете ли вы удалить ветку или нет.</p>

<p>в ответе kuboon пропущено удаление веток, в имени ветки которых есть мастер word . в его ответе улучшено следующее:</p><pre><code>git branch -r --merged | grep -v "origin/master$" | sed 's/sorigin///' | xargs -n 1 git push --delete origin конечно, это не удаляет саму "главную" ветку :)

git branch --merged | grep -ev '^(. master|)' | xargs -n 1 git branch -d удалит все локальные ветви, кроме текущей отмеченной ветви и/или master.вот полезная статья для тех, кто хочет понять эти команды: <a href="http://stevenharman.net/git-clean-delete-already-merged-branches">git clean: удалить уже объединенные ветви, автор стивен харман .

вы можете использовать git-del-br <a href="https://pypi.python.org/pypi/git-del-br">инструмент .git-del-br -a вы можете установить его через pip, используяpip install git-del-br п.с .: я автор инструмента. любые предложения/отзывы приветствуются. 

псевдоним версия <a href="https://stackoverflow.com/a/6127884/350761">обновленный ответ адама :[alias] branch-cleanup = "!git branch --merged | egrep -v "(^|master|dev)" | xargs git branch -d #" также см. <a href="https://stackoverflow.com/a/39616600/350761">этот ответ для получения полезных советов по выходу из сложных псевдонимов.

если вы хотите удалить все локальные ветви, которые уже объединены с той ветвью, в которой вы сейчас находитесь, я предложил безопасную команду, основанную на предыдущих ответах:git branch --merged | grep -v  | grep -v '^smaster$' | xargs -t -n 1 git branch -d </code></pre><p>эта команда не повлияет на вашу текущую ветку или вашу основную ветку. он также скажет вам, что он делает, прежде чем он это сделает, используя флаг -t xargs.</p>

<p>попробуйте следующую команду:</p><blockquote> <p><code>git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref head))</code></p> </blockquote><p>используя <code>git rev-parse</code>, мы получим <a href="https://stackoverflow.com/q/6245570/55075">имя текущей ветви</a> , чтобы исключить его. если вы получили ошибку, это означает, что нет локальных веток для удаления.</p><p>чтобы сделать то же самое с удаленными ветвями (измените <code>origin</code> на ваше удаленное имя), попробуйте:</p><blockquote> <p><code>git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref head) | cut -d/ -f2)</code></p> </blockquote><p><sup>если у вас несколько пультов, добавьте <code>grep origin |</code> перед <code>cut</code>, чтобы отфильтровать только <code>origin</code>.</sup></p><p>если вышеприведенная команда не удалась, попробуйте сначала удалить объединенные ветви удаленного отслеживания:</p><blockquote> <p><code>git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref head))</code></p> </blockquote><p>затем снова введите <code>git fetch</code> и снова используйте предыдущую команду <code>git push -vd</code>.</p><p>если вы часто используете его, рассмотрите возможность добавления псевдонимов в ваш файл <code>~/.gitconfig</code>.</p><p>если вы удалили несколько веток по ошибке, используйте <code>git reflog</code>, чтобы найти потерянные коммиты.</p>

<p>у меня ниже работает запрос </p><pre><code>for branch in `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'nr > 0 {print$1}'|awk '{gsub(/origin//, "")}1';do git push origin --delete $branch; done </code></pre><p>и это отфильтрует любую ветвь в трубе grep.</p><p>хорошо работает с http-клоном, но не очень хорошо для ssh-соединения.</p>

<p>основываясь на некоторых из этих ответов, я сделал <a href="https://gist.github.com/earlonrails/6994990">свой собственный скрипт bash, чтобы сделать это тоже</a> !</p><p>он использует <code>git branch --merged</code> и <code>git branch -d</code> для удаления объединенных ветвей и запрашивает каждую ветку перед удалением.</p><pre><code>merged\_branches(){ local current\_branch=$(git rev-parse --abbrev-ref head) for branch in $(git branch --merged | cut -c3-) do echo "branch $branch is already merged into $current\_branch." echo "would you like to delete it? [y]es/[n]o " read reply if [[ $reply =~ ^[yy] ]]; then git branch -d $branch fi done } </code></pre>

<p>я использую схему именования git-flow esque, поэтому она работает для меня очень безопасно:</p><pre><code>git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d </code></pre><p>он в основном ищет объединенные коммиты, которые начинаются со строки <code>fix/</code> или <code>feature/</code>.</p>

<p>напишите скрипт, в котором git проверяет все ветви, которые были объединены с master.</p><p>затем выполните <code>git checkout master</code>.</p><p>наконец, удалите объединенные ветви.</p><pre><code>for k in $(git branch -ra --merged | egrep -v "(^|master)"); do branchnew=$(echo $k | sed -e "s/origin///" | sed -e "s/remotes///") echo branch-name: $branchnew git checkout $branchnew done git checkout master for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git push origin --delete $branchnew done </code></pre>

<p>принятое решение довольно хорошее, но есть одна проблема, заключающаяся в удалении локальных веток, которые еще не были объединены в удаленный.</p><p>если вы посмотрите на вывод, вы увидите что-то вроде </p><pre><code>$ git branch --merged master -v api_doc 3a05427 [gone] start of describing the java api bla 52e080a update wording. branch-1.0 32f1a72 [maven-release-plugin] prepare release 1.0.1 initial_proposal 6e59fb0 [gone] original proposal, converted to asciidoc. issue_248 be2ba3c skip unit-for-type checking. this needs more work. (#254) master be2ba3c skip unit-for-type checking. this needs more work. (#254) ветви bla и issue_248 являются локальными ветвями, которые будут удалены без вывода сообщений.но вы также можете увидеть слово [gone], которое указывает ветви, которые были перенесены на удаленный (который теперь исчез) и, следовательно, обозначает, что ветви могут быть удалены.исходный ответ, таким образом, можно изменить на (разделить на многострочный для более короткой длины строки)git branch --merged master -v |  grep "[gone]" |  sed -e 's/^..//' -e 's/s .//' |  xargs git branch -d для защиты еще не слитых веток . кроме того, подсказка для мастера по его защите не нужна, так как у нее есть удаленный источник в источнике, и он не отображается как пропавший.

для windows вы можете установить <a href="https://cygwin.com/install.html">cygwin и удалить все удаленные ветки, используя следующую команду:git branch -r --merged | "c:cygwin64bingrep.exe" -v master | "c:cygwin64binsed.exe" 's/origin///' | "c:cygwin64binxargs.exe" -n 1 git push --delete origin 

в windows с <a href="https://gitforwindows.org/">git bash установленным egrep -v не будет работатьgit branch --merged | grep -e -v "(master|test|dev)" | xargs git branch -d где grep -e -v эквивалентен egrep -vиспользуйте -d, чтобы удалить уже <strong>объединенные</strong> ветки, или -d, чтобы удалить <strong>не объединенные</strong> ветки

чтобы избежать случайного запуска команды из любой другой ветки, кроме master, я использую следующий скрипт bash. в противном случае запуск git branch --merged | grep -v "" | xargs -n 1 git branch -d из ветви, которая была объединена с главной веткой, может удалить главную ветку.#!/bin/bash branch_name="$(git symbolic-ref head 2>/dev/null)" || branch\_name="(unnamed branch)" # detached head branch\_name=${branch_name##refs/heads/} if [[ $branch\_name == 'master' ]]; then read -r -p "are you sure? [y/n] " response if [[ $response =~ ^([yy][ee][ss]|[yy])$ ]]; then git branch --merged | grep -v "\*" | xargs -n 1 git branch -d fi else echo "refusing to delete branches that are not merged into '$branch_name'. checkout master first." fi 

по состоянию на 2018.07добавьте это в раздел [alias] вашего ~/.gitconfig:sweep = !"f() { git branch --merged | egrep -v "(^|master|dev)" || true | xargs git branch -d; }; f" теперь вы можете просто вызвать git sweep, чтобы выполнить необходимую очистку.

чтобы удалить локальные ветви, которые были объединены с главной веткой, я использую следующий псевдоним (git config -e --global):cleanup = "!git branch --merged master | grep -v '^|master' | xargs -n 1 git branch -d" я использую git branch -d, чтобы избежать сообщений error: the branch 'some-branch' is not fully merged., в то время как моя текущая проверка отличается от основной ветви.

скрипт python, дружественный к windoze (потому что git-sweep захлебнулся в репозитории wesnoth):<pre class="lang-py prettyprint-override">#!/usr/bin/env python # remove merged git branches. cross-platform way to execute: # # git branch --merged | grep -v master | xargs git branch -d # # requires gitapi - https://bitbucket.org/haard/gitapi # license: public domain import gitapi repo = gitapi.repo('.') output = repo.git_command('branch', '--merged').strip() for branch in output.split('n'): branch = branch.strip() if branch.strip(' ') != 'master': print(repo.git_command('branch', '-d', branch).strip())  <a href="https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc">https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc  

если вы используете модель ветвления, такую как hubflow или gitflow, вы можете использовать эту команду для удаления объединенных ветвей объектов:git branch --merged | grep feature. | grep -v "" | xargs -n 1 git branch -d

<blockquote> вот способ удалить ветку git </blockquote>git branch -d branchname 

 <a href="https://gist.github.com/rocketraman/edb0a2aac74004d8d6b482690d7c62e3">мой вклад в сценарий bash свободно основан на <a href="https://stackoverflow.com/a/12631656/430128">ответ mmrobin .требуются некоторые полезные параметры, определяющие включения и исключения, или для проверки/удаления только локальных или удаленных ветвей вместо обоих.<pre class="lang-bash prettyprint-override">#!/bin/bash # exclude branches regex, configure as "(branch1|branch2|etc)$" excludes\_default="(master|next|ag/doc-updates)$" excludes="__nothing__" includes= merged="--merged" local=1 remote=1 while [ $# -gt 0 ]; do case "$1" in -i) shift; includes="$includes $1" ;; -e) shift; excludes="$1" ;; --no-local) local=0 ;; --no-remote) remote=0 ;; --all) merged= ;; *) echo "unknown argument $1"; exit 1 ;; esac shift # next option done if [ "$includes" == "" ]; then includes=".*" else includes="($(echo $includes | sed -e 's/ /|/g'))" fi current\_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^]/d' -e 's/ (.)/1/') if [ "$current\_branch" != "master" ]; then echo "warning: you are on branch $current_branch, not master." fi echo -e "fetching branches...n" git remote update --prune remote_branches=$(git branch -r $merged | grep -v "/$current\_branch$" | grep -v -e "$excludes" | grep -v -e "$excludes_default" | grep -e "$includes") local\_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -e "$excludes" | grep -v -e "$excludes\_default" | grep -e "$includes") if [ -z "$remote\_branches" ] && [ -z "$local_branches" ]; then echo "no existing branches have been merged into $current\_branch." else echo "this will remove the following branches:" if [ "$remote" == 1 -a -n "$remote\_branches" ]; then echo "$remote_branches" fi if [ "$local" == 1 -a -n "$local_branches" ]; then echo "$local\_branches" fi read -p "continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "y" ]; then if [ "$remote" == 1 ]; then remotes=$(git remote) # remove remote branches for remote in $remotes do branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote/(.)/:1 /g" | tr -d 'n') git push $remote $branches done fi if [ "$local" == 1 ]; then # remove local branches locals=$(echo "$local\_branches" | sed 's/origin\///g' | tr -d '\n') if [ -z "$locals" ]; then echo "no branches removed." else git branch -d $(echo "$locals" | tr -d 'n') fi fi fi fi 

если вы работаете в windows, вы можете использовать windows powershell с <a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-gridview?view=powershell-5.1">out-gridview (к сожалению, в powershell core пока нет), чтобы получить список ветвей nice и выбрать с помощью мыши ту ветку, которую вы хотите удалить:git branch --merged | out-gridview -passthru | % { git branch -d $\_.trim() } </code></pre><p> <a href="https://i.stack.imgur.com/78h7g.png"> <img src="https://i.stack.imgur.com/78h7g.png" alt="enter image description here"> </a> после нажатия ok powershell передаст имена этих веток команде <code>git branch -d</code> и удалит их <a href="https://i.stack.imgur.com/rbgwd.png"> <img src="https://i.stack.imgur.com/rbgwd.png" alt="enter image description here"> </a> </p>

<pre><code>for b in $(git branch -a | grep -v "(master|remotes)"); do  git branch -d $b; done && git fetch -p </code></pre>

<p><code>git-delete-merged-branches</code> из <code>git-extras</code> репо.</p><p> <a href="https://github.com/tj/git-extras/blob/master/commands.md#git-delete-merged-branches">https://github.com/tj/git-extras/blob/master/commands.md#git-delete-merged-branches</a> </p>

<p>допустим, у меня есть пульт с именем upstream и origin (стиль github, мой форк - origin, upstream - upstream).</p><p>я не хочу удалять любых мастеров, head или что-либо из вышестоящего. я также не хочу удалять ветку разработки, так как это наша общая ветка, из которой мы создаем pr.</p><p>список всех удаленных веток, отфильтрованных по тем, которые были объединены</p><pre><code>git branch -r </code></pre><p>удалите строки из этого списка, содержащие слова, которые я знаю, в названиях ветвей, которые я не хочу удалять:</p><pre><code>sed '/develop\|master\|head\|upstream/d' </code></pre><p>удалите удаленное имя из ссылочного имени (origin/somebranch становится somebranch):</p><pre><code>sed 's/.*\///' </code></pre><p>используйте xargs для вызова однострочника:</p><pre><code>xargs git push --delete origin </code></pre><p>труба все это вместе, вы получите:</p><pre><code>git branch -r --merged | sed '/develop\|master\|head\|upstream/d' | sed 's/.*\///' | xargs git push --delete origin </code></pre><p>это оставит мне только некоторые ветви, над которыми я работал, но не слился. вы можете удалить их один за другим, так как их не должно быть слишком много.</p><p>найдите ветки, которые вам больше не нужны:</p><pre><code>git branch -ar </code></pre><p>скажем, вы найдете branch1, branch2 и branch3, которые хотите удалить:</p><pre><code>git push --delete origin branch1 branch2 branch3 </code></pre>

<pre><code>$ git config --global alias.cleanup '!git branch --merged origin/master | egrep -v "(^|master|staging|dev)" | xargs git branch -d'  (разделить на несколько строк для удобства чтения) вызов «git cleanup» удалит локальные ветви, которые уже были объединены в origin/master. он пропускает master, staging и dev, потому что мы не хотим удалять их в обычных условиях.разбивая это, вот что он делает: git config --global alias.cleanup  это создает глобальный псевдоним под названием «очистка» (для всех ваших репозиториев)  ! в начале команды говорит, что мы будем использовать некоторые не-git команды как часть этого псевдонима, поэтому нам нужно на самом деле запускать команды bash здесь git branch --merged origin/master  эта команда возвращает список имен филиалов, которые уже были объединены в origin/master  egrep -v "(^|master|staging|dev)"  это удаляет ветку master, staging и dev из списка веток, которые уже были объединены. мы не хотим удалять эти ветви, так как они не являются функциями.  xargs git branch -d  это запустит команду git branch -d xxxxx для каждой из неразделенных ветвей. это удаляет локальные ветви по одному.  

я использовал следующий метод для <strong>удаления объединенных локальных и удаленных веток</strong> в одном cmd. в моем файле bashrc есть следующее:function rmb { current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') if [ "$current_branch" != "master" ]; then echo "warning: you are on branch $current\_branch, not master." fi echo "fetching merged branches..." git remote prune origin remote\_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$") local\_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$") if [ -z "$remote_branches" ] && [ -z "$local\_branches" ]; then echo "no existing branches have been merged into $current_branch." else echo "this will remove the following branches:" if [ -n "$remote\_branches" ]; then echo "$remote_branches" fi if [ -n "$local\_branches" ]; then echo "$local_branches" fi read -p "continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "y" ]; then # remove remote branches git push origin git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/origin\//:/g' | tr -d '\n'` # remove local branches git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current\_branch$" | sed 's/origin\///g' | tr -d '\n'` else echo "no branches removed." fi fi } </code></pre><p>оригинал <a href="http://rob.by/2013/remove-merged-branches-from-git">источник</a> </p><p>это не удаляет основную ветку, но <strong>удаляет объединенные локальные и удаленные ветви</strong>. как только вы получите это в своем rc-файле, просто запустите <code>rmb</code>, вы увидите потерянные объединенные ветви, которые будут очищены и запросят подтверждение действия. вы можете изменить код так, чтобы он не запрашивал подтверждения, но, вероятно, его стоит сохранить.</p>

<p>если вы хотите удалить локальные ветви, которые были объединены, а также удалить их пульты, вот одна строка, которую я предпочитаю:</p><pre class="lang-bash prettyprint-override"><code>git branch --merged | xargs -i\_br -- sh -c 'git branch -d \_br; git push origin --delete \_br' </code></pre>