Как я могу удалить все ветки Git, которые были объединены? - PullRequest
1655 голосов
/ 25 мая 2011

У меня много веток Git. Как удалить ветви, которые уже были объединены? Есть ли простой способ удалить их все вместо того, чтобы удалять их по одному?

Ответы [ 40 ]

12 голосов
/ 28 сентября 2012

Я использую следующий скрипт Ruby для удаления уже слитых локальных и удаленных веток.Если я делаю это для хранилища с несколькими пультами и хочу удалить только с одного, я просто добавляю оператор выбора в список удаленных, чтобы получить только те пульты, которые мне нужны.

#!/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
10 голосов
/ 27 января 2015

Как удалить объединенные ветви в консоли PowerShell

git branch --merged | %{git branch -d $_.Trim()}

Если вы хотите исключить master или любые другие имена веток, вы можете передать с помощью PowerShell Select-String, как это, и передатьрезультат до git branch -d:

git branch -d $(git branch --merged | Select-String -NotMatch "master" | %{$_.ToString().Trim()})
8 голосов
/ 04 октября 2013

в ответе kuboon пропущено удаление веток, в названии которых есть слово master.Его ответ улучшает следующее:

git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin

Конечно, он не удаляет саму "главную" ветку:)

8 голосов
/ 26 мая 2011

В Git нет команды, которая сделает это автоматически.Но вы можете написать скрипт, который использует команды Git, чтобы дать вам то, что вам нужно.Это можно сделать разными способами в зависимости от используемой модели ветвления.

Если вам нужно знать, была ли ветка объединена с мастером, следующая команда не выдаст выходных данных, если myTopicBranch был объединен (то есть вы можете удалить ее)

$ git rev-list master | grep $(git rev-parse myTopicBranch)

Вы можете использоватькоманда Git branch и анализирует все ветви в Bash и делает цикл for по всем веткам.В этом цикле вы проверяете вышеуказанной командой, можете ли вы удалить ветку или нет.

6 голосов
/ 24 октября 2014

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d удалит все локальные ветви, кроме текущей извлеченной ветви и / или master.

Вот полезная статья для тех, кто хочет понять эти команды: Git Clean: Удалить уже объединенные ветви, Стивен Харман .

5 голосов
/ 19 июля 2016

Вы можете использовать git-del-br инструмент .

git-del-br -a

Вы можете установить его через pip, используя

pip install git-del-br

PS: я авторинструмента.Любые предложения / отзывы приветствуются.

5 голосов
/ 30 сентября 2016

Псевдоним версии Обновленный ответ Адама :

[alias]
    branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"

Также см. этот ответ для получения полезных советов по выходу из сложных псевдонимов.

4 голосов
/ 15 октября 2013

На основании некоторых из этих ответов я сделал свой собственный скрипт Bash, чтобы сделать это тоже !

Он использует git branch --merged и git branch -d для удаления объединенных ветвей и запрашивает каждую ветвь перед удалением.

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
}
4 голосов
/ 23 августа 2016

Я использую схему именования git-flow esque, поэтому она работает для меня очень безопасно:

git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d

Он в основном ищет объединенные коммиты, которые начинаются со строки fix/ или feature/.

4 голосов
/ 23 января 2014

Если вы хотите удалить все локальные ветви, которые уже объединены с той ветвью, в которой вы находитесь, я предложил безопасную команду, основанную на предыдущих ответах:

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

Эта команда не повлияет на вашу текущую ветку или вашу основную ветку.Он также скажет вам, что он делает, прежде чем он это сделает, используя флаг -t xargs.

...