Как удалить все ветки Git, которые были объединены?

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

1084
задан Nyambaa 25 мая '11 в 18:54
источник поделиться

32 ответов

  • 1
  • 2

UPDATE:

Вы можете добавить другие ветки, чтобы исключить их как master и dev, если ваш рабочий процесс имеет их как возможный предок. Обычно я отключаю тег "спринт-старт" и мастер, dev и qa не являются предками.

Чтобы удалить все локальные ветки, которые уже объединены в текущую отмеченную ветку:

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

Вы можете видеть, что мастер и dev исключены, если они являются предками.


Вы можете удалить объединенную локальную ветвь с помощью:

git branch -d branchname

Если он не объединен, используйте:

git branch -d branchname

Чтобы удалить его с пульта в старых версиях Git, используйте:

git push origin :branchname

В более поздних версиях Git используйте:

git push --delete origin branchname

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

git remote prune origin

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

git branch -dr branchname

Надеюсь, что это поможет.

1854
ответ дан Adam Dymitruk 25 мая '11 в 19:40
источник поделиться

Чтобы удалить все ветки на удаленном сервере, которые уже объединены:

git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin

В более поздних версиях Git

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin
262
ответ дан kuboon 09 авг. '13 в 11:45
источник поделиться

Просто расширяя Адама немного:

Добавьте это в конфигурацию Git, запустив git config -e --global

[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

И затем вы можете удалить все локальные объединенные ветки, выполнив простой git cleanup.

102
ответ дан real_ate 18 февр. '14 в 18:08
источник поделиться

Это также позволяет удалить все объединенные ветки, кроме master.

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d
68
ответ дан Ismael Abreu 07 февр. '13 в 4:06
источник поделиться

Вы хотите исключить ветки master и develop из этих команд.

Локальный git очистить:

git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d

Удаленная git очистка:

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

Синхронизировать локальный реестр удаленных ветвей:

git fetch -p
48
ответ дан Guido Bouman 03 июля '14 в 19:18
источник поделиться

Для тех из вас, кто находится в Windows и предпочитает сценарии PowerShell, вот что удаляет локальные объединенные ветки:

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}
23
ответ дан Klas Mellbourn 10 июня '14 в 17:00
источник поделиться

Git Sweep отлично справляется с этим.

16
ответ дан paul 04 февр. '13 в 16:53
источник поделиться

Вы можете добавить фиксацию к опции -merged. Таким образом, вы можете убедиться, что только удалены ветки, которые объединены в i.e origin/master

Следующая команда удалит объединенные ветки из вашего источника.

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

Вы можете проверить, какие ветки будут удалены, заменив начало git push -delete с помощью эха

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo
10
ответ дан Jörn Reimerdes 08 июля '14 в 9:28
источник поделиться

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

#!/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
9
ответ дан mmrobins 28 сент. '12 в 2:41
источник поделиться

Использование Git версии 2.5.0:

git branch -d `git branch --merged`
8
ответ дан drautskis 14 сент. '15 в 19:20
источник поделиться

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

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

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

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

5
ответ дан ralphtheninja 26 мая '11 в 10:41
источник поделиться

Ответ kuboon пропустил удаление ветвей, у которых есть имя слова в имени ветки. Следующее улучшает его ответ:

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

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

5
ответ дан Paras 04 окт. '13 в 9:05
источник поделиться

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

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

Смотрите GitHub для Windows

4
ответ дан Konstantin Tarkus 27 янв. '15 в 17:17
источник поделиться

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

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

4
ответ дан styger 24 окт. '14 в 0:06
источник поделиться

Версия псевдонима Адам обновил ответ:

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

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

3
ответ дан Eliot 30 сент. '16 в 22:54
источник поделиться

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

git-del-br -a

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

pip install git-del-br

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

3
ответ дан tusharmakkar08 19 июля '16 в 21:50
источник поделиться

Попробуйте выполнить следующую команду:

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Используя git rev-parse, вы получите имя текущего ветки, чтобы исключить его. Если вы получили ошибку, это означает, что локальные ветки не удаляются.

Чтобы сделать то же самое с удаленными ветвями (измените origin на свое удаленное имя), попробуйте:

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

Если у вас несколько пультов, добавьте grep origin | до cut, чтобы фильтровать только origin.

Если команда выше не выполняется, попробуйте сначала удалить объединенные ветки удаленного отслеживания:

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

Затем git fetch удаленный снова и снова используйте предыдущую команду git push -vd.

Если вы часто используете его, подумайте о том, чтобы добавить в свой файл ~/.gitconfig псевдонимы.

Если вы удалили несколько ветвей по ошибке, используйте git reflog, чтобы найти потерянные коммиты.

2
ответ дан kenorb 17 дек. '16 в 15:17
источник поделиться

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

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

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

2
ответ дан Chad M 23 авг. '16 в 4:15
источник поделиться

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

Он использует 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
}
2
ответ дан earlonrails 15 окт. '13 в 20:13
источник поделиться

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

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

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

1
ответ дан chrismendis 23 янв. '14 в 19:24
источник поделиться

Напишите script, в котором Git проверяет все ветки, которые были объединены с мастером.

Затем выполните 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 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
1
ответ дан Komu 09 авг. '17 в 16:42
источник поделиться

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

git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git push origin --delete _br'
0
ответ дан Ikar Pohorský 20 апр. '16 в 17:29
источник поделиться

Чтобы избежать случайного запуска команды из любой другой ветки, кроме мастера, я использую следующий bash script. В противном случае запуск 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
0
ответ дан Robert Kajic 20 янв. '14 в 20:05
источник поделиться
for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ 
git branch -D $b; done && git fetch -p
0
ответ дан 030 04 мая '17 в 16:08
источник поделиться

Мой вклад Bash script основан на mmrobin answer.

Требуется указать некоторые полезные параметры, включающие и исключающие, или для проверки/удаления только локальных или удаленных ветвей вместо них.

#!/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
0
ответ дан Raman 23 июня '16 в 22:13
источник поделиться

Чтобы удалить локальные ветки, которые были объединены в master-ветку, я использую следующий псевдоним (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., в то время как моя текущая проверка отличается от основной ветки.

0
ответ дан dgt 09 окт. '14 в 11:45
источник поделиться

Скажем, у меня есть удаленный названный upstream и origin (стиль GitHub, моя вилка - начало, вверх по потоку вверх).

Я не хочу удалять ЛЮБЫХ мастеров, HEAD или что-либо из восходящего потока. Я также не хочу удалять ветку разработки, так как это наша общая ветка, из которой мы создаем PR.

Перечислите все удаленные ветки, отфильтрованные с помощью тех, которые были объединены:

git branch -r

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

sed '/develop\|master\|HEAD\|upstream/d'

Удалите удаленное имя из имени ссылки (origin/somebranch становится somebranch):

sed 's/.*\///'

Используйте xargs для вызова однострочного интерфейса:

xargs git push --delete origin

Соедините все это вместе:

git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' |  sed 's/.*\///' | xargs git push --delete origin

Это оставит меня только с некоторыми ветвями, над которыми я работал, но не слился. Затем вы можете удалить их один за другим, так как их должно быть не так много.

Найти ветки, которые больше не нужны:

git branch -ar

Скажем, вы найдете ветку 1, ветвь2 и ветвь 3, которые хотите удалить:

git push --delete origin branch1 branch2 branch3
0
ответ дан miigotu 02 июля '15 в 11:54
источник поделиться

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

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

0
ответ дан bedrin 26 февр. '15 в 17:02
источник поделиться

Windoze-friendly Python script (потому что git-sweep подавлен в репозитории Wesnoth):

#!/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())

https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc

0
ответ дан anatoly techtonik 06 янв. '15 в 21:52
источник поделиться

Если они объединены и удалены по источнику (например, github), мы можем обновить список ветвей с помощью команды

git fetch -p
-1
ответ дан Bunyk 04 дек. '17 в 23:40
поделиться
  • 1
  • 2

Другие вопросы по меткам