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

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

Ответы [ 40 ]

4 голосов
/ 17 декабря 2016

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

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, чтобы найти потерянные коммиты.

4 голосов
/ 19 января 2018

Ниже запрос работает для меня

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

, и это отфильтрует любую ветвь в трубе grep.

Хорошо работает через клон http, но не очень хорошо для соединения ssh

3 голосов
/ 23 мая 2018

В Windows с установленным git bash egrep -v не будет работать

git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d

, где grep -E -v эквивалентно egrep -v

Использовать -dудалить уже объединенные ветви или -D удалить необработанные ветви

3 голосов
/ 01 июля 2018

По состоянию на 2018.07

Добавьте это в [alias] раздел вашего ~/.gitconfig:

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

Теперь вы можете просто позвонить git sweep, чтобы выполнить необходимую очистку.

3 голосов
/ 09 августа 2017

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

Затем выполните 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
2 голосов
/ 15 июня 2018

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

Если вы посмотрите на вывод, вы увидите что-то вроде

$ 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

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

1 голос
/ 09 сентября 2018

Для Windows вы можете установить Cygwin и удалить все удаленные ветви, используя следующую команду:

git branch -r --merged | "C:\cygwin64\bin\grep.exe" -v master | "C:\cygwin64\bin\sed.exe" 's/origin\///' | "C:\cygwin64\bin\xargs.exe" -n 1 git push --delete origin
1 голос
/ 10 июля 2018
$ 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, потому что мы не хотим удалять их в нормальных условиях.

Разбивая это, вот что он делает:

  1. git config --global alias.cleanup
    • Это создает глобальный псевдоним под названием «очистка» (для всех ваших репозиториев)
  2. ! в начале команды говорит, что мы будем использоватьнекоторые не-git команды являются частью этого псевдонима, поэтому нам нужно запустить здесь команды bash
  3. git branch --merged origin/master
    • Эта команда возвращает список имен веток, которые уже были объединены в origin/master
  4. egrep -v "(^\*|master|staging|dev)"
    • Это удаляет основную, промежуточную и разветвленную ветвь из списка веток, которые уже были объединены.Мы не хотим удалять эти ветви, так как они не являются функциями.
  5. xargs git branch -d
    • При этом будет запускаться команда git branch -d xxxxx для каждой из незакрытых ветвей,Это удаляет локальные ветви по одному.
1 голос
/ 20 января 2014

Чтобы избежать случайного запуска команды из любой другой ветки, кроме 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
0 голосов
/ 10 марта 2019

Вот способ удалить ветку git

git branch -D BranchName
...