У меня много ветвей Git. Как удалить ветви, которые уже были объединены? Есть ли простой способ удалить их все вместо того, чтобы удалять их по одной?
UPDATE:
Вы можете добавить другие ветви для исключения, такие как master и dev, если ваш рабочий процесс имеет их в качестве возможных предков. Обычно я делаю ответвления от тега "sprint-start", и master, dev и qa не являются предками.
Сначала перечислите все ветки, которые были объединены в remote.
git branch --merged
Вы можете увидеть несколько веток, которые вы не хотите удалять. Мы можем добавить несколько аргументов, чтобы пропустить важные ветки, которые мы не хотим удалять, например master или develop. Следующая команда пропустит ветку master и все, в которых есть dev.
git branch --merged| egrep -v "(^\*|master|dev)"
Если вы хотите пропустить ветку, вы можете добавить ее к команде egrep, как показано ниже. Ветвь skip_branch_name
не будет удалена.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Чтобы удалить все локальные ветки, которые уже слиты с текущей проверенной веткой:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Видно, что master и 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
Надеюсь, это поможет.
Чтобы удалить все ветки на пульт, который уже слился:
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
Обновление (на @Оливер; так как не помещается в комментарий, но мало ответов уже): если вы находитесь на ветке Азбука потом букварь появится в результатах `Git в ветке-Р --слился, потому что филиал не указан, так что ветка по умолчанию текущая ветка, и ветка всегда квалифицируется как слился к себе (потому что нет никаких различий между филиалом и себя!).
Так что либо указывать ветке:
git branch -r --merged master | grep -v master ...
Или первый мастер-кассе:
git checkout master | git branch -r --merged | grep -v ...
Просто расширение Адам'ответом немного:
Добавить в вашу конфигурацию Git с помощью команды git config не -е-Глобал
[alias]
cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"
И затем вы можете удалить все местные слили ветки делаем простой очистки ЖКТ`.
Это также работает, чтобы удалить все слил ветки, кроме хозяина.
git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d
Вы'll хочу исключить мастер
& развивать
филиалы этих команд.
Локальные 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
Для тех из вас, которые находятся в Windows и предпочитаю скрипты PowerShell, вот один, который удаляет местных объединены филиалы:
function Remove-MergedBranches
{
git branch --merged |
ForEach-Object { $_.Trim() } |
Where-Object {$_ -NotMatch "^\*"} |
Where-Object {-not ( $_ -Like "*master" )} |
ForEach-Object { git branch -d $_ }
}
Я've использовали Адам'ы ответьте на протяжении нескольких лет. Что сказал, что есть некоторые случаи, где это было'т ведет себя так, как я ожидал:
1 &ампер; 2 были легко разрешить, просто изменить регулярное выражение. 3 зависит от контекста того, что вы хотите (т. е. удалить только те ветви, которые еще'т быть объединены в мастер или против ваших текущих филиал). 4 имеет потенциал, чтобы быть катастрофическими (хотя извлекаемые с помощью Git reflog`), если вы случайно запустили этот в отдельной главе государства.
Наконец, я хотел, чтобы это все было в один вкладыш, что я'т требуют отдельного (Баш|Руби|питон) сценарий.
Создать ГИТ псевдоним на "лапу", которую можно флаг необязательный -Ф
:
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
и вызывать его с:
git sweep
или:
git sweep -f
Это был легкий для меня, чтобы создать пример репозитория 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
бар развивать ФОО
- мастер мастерское notmaster
Исходное выражение не попадает в филиалы на "мастерски" и "notmaster и" :
git checkout foo
git branch --merged | egrep -v "(^\*|master|dev)"
бар
С обновленным регулярных выражений (который теперь исключает, что "развивать" и скорее, чем на "Дева", у):
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
бар мастерское notmaster
echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"
Моя текущая ветка называется foobar, и если я повторно выполнить эту команду в список филиалов я хочу удалить, ветку-то "фу" и входит, даже если он еще'т быть объединены в мастер:
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
бар ФОО мастерское notmaster
Однако, если я запускаю эту же команду на мастер филиала с "фу" не включено:
git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
бар мастерское notmaster
И это просто потому, ветку в Git --слился по умолчанию руководителю в текущей ветке, если не указано иное. По крайней мере для моего рабочего процесса, я не'т хотите, чтобы удалить местные отделения, если они не'вэ были объединены в мастер, поэтому предпочитаю следующий вариант:
git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
бар мастерское notmaster
Полагаться на поведение по умолчанию-ветку в Git --слияния и даже более серьезные последствия в отдельной главе государства:
git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
бар ФОО фрагментик мастерское notmaster
Это бы удалил ветку я как раз, "с программой" по вместе с "фу", который почти наверняка не желаемого результата. С года вступают в силу новые команды, однако:
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
бар мастерское notmaster
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'
Псевдоним принимает необязательный флаг-F. Поведение по умолчанию-только удалять ветки, которые были объединены в мастер, но флаг
-Ф` будет удалить ветви, которые были объединены в текущей ветке.
git sweep
удаленная ветка-бар (был 9a56952). удаленный филиал виртуозный (был 9a56952). удаленная ветка notmaster (был 9a56952).
git sweep -f
удаляются ветви фу (был 2cea1ab).
Вы можете добавить фиксации --объединены вариант. Таким образом, вы можете убедиться только в том, чтобы удалить ветви, которые объединяются в т. е. происхождения/мастер
Следующая команда удалит слил ветки из своего происхождения.
git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete
Вы можете проверить, какие ветви будут удалены заменив ГИТ пуш происхождения-удалить с Эхо
git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo
Я использую следующий Ruby-сценарий для удаления уже объединенных локальных и удаленных ветвей. Если я делаю это для репозитория с несколькими удалёнными ветками и хочу удалить только одну из них, я просто добавляю оператор 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
git branch --merged | %{git branch -d $_.Trim()}
Если вы хотите исключить мастер или любые другие наименования филиала, можно передать с помощью PowerShell выберите строку, как это и сдать результат филиал -д ГИТ
:
филиал-д ЖКТ $(филиал в Git --слили | выберите строку -NotMatch на "Мастер" по - | %{$_.Метод toString().Отделка()})
kuboon'ы ответ пропустил удаление ветки где есть слово мастер в название ветки. Следующим улучшает его ответ:
git branch -r --merged | grep -v "origin/master$" | sed 's/\s*origin\///' | xargs -n 1 git push --delete origin
Конечно, это не удалить в "Мастер" в себя ветки :)
В Git'е нет команды, которая сделает это за вас автоматически. Но вы можете написать сценарий, который, используя команды Git, даст вам то, что вам нужно. Это можно сделать разными способами в зависимости от того, какую модель ветвления вы используете.
Если вам нужно узнать, была ли ветвь объединена с master, следующая команда не даст никакого результата, если myTopicBranch была объединена (т.е. вы можете удалить ее).
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Вы можете использовать команду Git branch, разобрать все ветки в Bash и сделать цикл for
по всем веткам. В этом цикле вы проверяете с помощью вышеуказанной команды, можете ли вы удалить ветку или нет.
создать ветку в Git --слили | грэп -Эв '^(. мастер|\*)' | команды xargs -Н 1 отделения -д ГИТ
приведет к удалению всех местных отделений, за исключением текущих проверили филиал Мастер и/или``.
Здесь'с полезная статья для тех, кто хочет понять этих команд: ГИТ очистить: удалить уже слил ветки, Стивен Гарман.
Вы можете использовать команду git-дель-БР инструмент.
git-del-br -a
Вы можете установить его через Пип
, используя
pip install git-del-br
P. S: Я являюсь автором инструмента. Любые предложения/обратная связь приветствуются.
Если вы'd, как удалить все локальные ветки, которые уже объединены в филиал, что вы находитесь в настоящее время, тогда я'вэ придумать безопасный команды, на основе предыдущих ответов:
git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d
Эта команда не влияет на текущую ветку или ветку master. Это также скажет вам, что это'ы делаешь, прежде чем он делает это, используя параметр-t флаг команды xargs.
Я использую ГИТ-схему именования эска, так что это очень безопасно для меня:
git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d
Он в основном ищет слили коммиты, которые начинаются с ремонта либо строку /
или характеристика
.
Псевдоним версия Адам'ы обновил ответ:
[alias]
branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"
Также, смотрите этот ответ полезные советы о побеге сложные псевдонимы.
Запрос ниже работает для меня
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
и это будет фильтровать любой филиал в трубе грэп.
Хорошо работает над клоном HTTP, но не так хорошо для подключения по SSH.