У меня много веток Git. Как удалить ветви, которые уже были объединены? Есть ли простой способ удалить их все вместо того, чтобы удалять их по одному?
git
github
version-control
branch
feature-branch
Nyambaa
источник
источник
git branch -D
удаляет любую ветку, независимо от того, была ли она объединена или нет.master
каждой ветви. Тем не менее, ваш локальный клиент будет по-прежнему перечислять старые ветви, если вы запуститеgit branch -a
; используйте,git fetch --prune
чтобы удалить их (согласно этому ответу ).git delete-merged --doit origin
илиgit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
с годами стал самый простой способ выбраться из маринада с мерзавцем.Ответы:
ОБНОВИТЬ:
Вы можете добавить другие ветви для исключения, такие как master и dev, если ваш рабочий процесс имеет их в качестве возможного предка. Обычно я разветвляюсь от тега "sprint-start" и master, dev и qa не являются предками.
Сначала перечислите все ветви, которые были объединены в удаленном.
Вы можете увидеть несколько веток, которые не хотите удалять. мы можем добавить несколько аргументов, чтобы пропустить важные ветви, которые мы не хотим удалять, как master или development. Следующая команда пропустит основную ветку и все, что содержит dev.
Если вы хотите пропустить, вы можете добавить его в команду egrep, как показано ниже. Ветка
skip_branch_name
не будет удалена.Чтобы удалить все локальные ветви, которые уже объединены в текущую извлеченную ветку:
Вы можете видеть, что master и dev исключены, если они являются предками.
Вы можете удалить объединенную локальную ветку с помощью:
Если это не объединено, используйте:
Чтобы удалить его из удаленного использования:
После того как вы удалите ветку с пульта, вы можете удалить ветки удаленного отслеживания с помощью:
или обрезать отдельные ветви удаленного отслеживания, как предлагает другой ответ, с помощью:
Надеюсь это поможет.
источник
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
если у вас нет веток, которые должны быть удалены. Чтобы избежать этого, вы можете перейти-r
к нему,xargs
чтобы он не работал,git branch -d
если стандартный ввод пуст. (Это расширение GNU xargs, согласно man-странице).Чтобы удалить все удаленные ветви, которые уже объединены:
В более поздних версиях Git
ОБНОВЛЕНИЕ (от @oliver; поскольку не помещается в комментарии, но уже содержит достаточно ответов) : если вы находитесь в ветви ABC, то в результатах появится ABC,
git branch -r --merged
потому что ветка не указана, поэтому ветвь по умолчанию имеет текущую ветвь и ветвь всегда квалифицируется как объединенный с самим собой (поскольку нет различий между ветвью и самим собой!).Так что либо укажите ветку:
ИЛИ первый мастер проверки:
источник
dev
поэтому мне пришлось это изменить| grep origin
после,grep -v master
чтобы предотвратить подталкивание веток других пультов к источнику. Настоятельно рекомендуем предварительно проверить вывод, используяgit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
ветку.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
, Теперь это оказался мой псевдоним.-r
аргумент, который я не видел нигде. Считается само собой разумеющимся, что только местные филиалы стоят того, чтобы заниматься уборкой. Но пульты тоже полны мусора.myFeatureBranch
ней, то сотретеorigin/myFeatureBranch
. Наверное, лучшеgit checkout master
сначала.Просто немного расширив ответ Адама:
Добавьте это в свою конфигурацию Git, запустив
git config -e --global
И тогда вы можете удалить все локальные объединенные ветви, выполнив простую процедуру
git cleanup
.источник
git branch --merged master
так как вы хотите посмотреть, что было объединено с главной, а не проверенной веткой?develop
или,dev
и в этом случае команда потерпит неудачуfatal: malformed object name
, лучше иметь универсальную команду, и вы несете ответственность за ее запуск-r
кxargs
предотвратит ненужные ошибки (branch name required
) при многократном запуске этого псевдонима или при отсутствии ветви, подлежащей удалению. Мой псевдоним выглядит так:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Это также работает для удаления всех объединенных ветвей, кроме главной.
источник
master
ним. Попробуйтеgrep -v ^master$
для середины.| grep -v '^\*'
избежать удаления текущей ветки, если вы не на mastergrep -v '^ master$'
. Если вы введете его в себя и пропустите один, вы удалите его,master
если его нет.git branch
как каждое ветвь будет перечисляться в новой строке с двумя пробелами слева, если это не текущая извлеченная ветвь. Вы по сути гарантировали, что любой, кто запускает эту команду, удалит свою основную ветвь, если только она не является в настоящий момент извлеченной веткой.Вы хотите исключить
master
&develop
ветви из этих команд.Локальный мерзавец ясно:
Удаленный git clear:
Синхронизация локального реестра удаленных филиалов:
источник
git config --global --add fetch.prune true
автоматически обрезать при извлечении или извлечении.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Для тех из вас, кто работает в Windows и предпочитает скрипты PowerShell, вот тот, который удаляет локальные объединенные ветви:
источник
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(вздох, замените двойныеЯ использовал ответ Адама в течение многих лет. Тем не менее, есть некоторые случаи, когда он не вел себя так, как я ожидал:
1 и 2 были просты для решения, просто с изменением в регулярном выражении. 3 зависит от контекста того, что вы хотите (т.е. удаляете только те ветки, которые не были объединены в master или с вашей текущей веткой). 4 может привести к катастрофическим последствиям (хотя их можно будет восстановить
git reflog
), если вы непреднамеренно запустили это в отключенном состоянии HEAD.Наконец, я хотел, чтобы все было в одной строке, для которой не требовался отдельный скрипт (Bash | Ruby | Python).
TL; DR
Создайте псевдоним git «sweep», который принимает необязательный
-f
флаг:и вызвать его с помощью:
или:
Длинный, подробный ответ
Мне было проще создать пример git repo с некоторыми ветками и коммитами для проверки правильности поведения:
Создать новый репозиторий Git с одним коммитом
Создайте несколько новых веток
Желаемое поведение: выберите все объединенные ветви, кроме: master, development или current
Оригинальное регулярное выражение пропускает ветки "masterful" и "notmaster":
С обновленным регулярным выражением (которое теперь исключает «развернуть», а не «dev»):
Переключитесь на ветку foo, сделайте новый коммит, затем извлеките новую ветку foobar на основе foo:
Моя текущая ветка - это foobar, и если я перезапущу приведенную выше команду для вывода списка веток, которые я хочу удалить, ветка "foo" будет включена, даже если она не была объединена с master:
Однако, если я запускаю ту же команду на master, ветка "foo" не включается:
И это просто потому, что по
git branch --merged
умолчанию используется заголовок текущей ветви, если не указано иное. По крайней мере, для моего рабочего процесса я не хочу удалять локальные ветви, если они не были объединены с master, поэтому я предпочитаю следующий вариант:Отделенное состояние HEAD
Опора на поведение по умолчанию
git branch --merged
имеет еще более существенные последствия в отключенном состоянии HEAD:Это удалило бы ветку, на которой я только что находился, «foobar» вместе с «foo», что почти наверняка не является желаемым результатом. С нашей пересмотренной командой, однако:
Одна строка, включая фактическое удаление
Все закутано в псевдоним git "sweep":
Псевдоним принимает необязательный
-f
флаг. Поведение по умолчанию - удаление только тех веток, которые были объединены с главной, но-f
флаг удалит ветки, которые были объединены с текущей веткой.источник
git config
атомно?!f(){ git branch ...
. Это объявление функции, верно? Почему бы не начать прямо сgit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
За исключением того, что он будет удалятьdevelop
, но может быть более простой подход.Git Sweep отлично справляется с этой задачей.
источник
Использование Git версии 2.5.0:
источник
master
ветку кстати!master
.git branch -d $(git branch --merged | grep -v master)
Вы можете добавить коммит к опции --merged. Таким образом, вы можете быть уверены, что удаляете только те ветви, которые объединены, т.е.
Следующая команда удалит объединенные ветви из вашего источника.
Вы можете проверить, какие ветви будут удалены, заменив git push origin --delete на echo
источник
Я использую следующий скрипт Ruby для удаления уже слитых локальных и удаленных веток. Если я делаю это для репозитория с несколькими пультами и хочу удалить только с одного, я просто добавляю оператор выбора в список удаленных, чтобы получить только те пульты, которые мне нужны.
источник
\/
в начале оператора отклонения дляremote_branches
строки. Это опечатка или она служит цели?b.split(/\//)
теперь я вижу чертуКак удалить объединенные ветви в консоли PowerShell
Если вы хотите исключить master или любые другие имена веток, вы можете передать с помощью PowerShell Select-String, как это, и передать результат
git branch -d
:источник
* master
:)В ответе kuboon пропущено удаление веток, в названии которых есть слово master. Следующий ответ улучшает его ответ:
Конечно, это не удаляет саму "главную" ветку :)
источник
В Git нет команды, которая сделает это автоматически. Но вы можете написать скрипт, который использует команды Git, чтобы дать вам то, что вам нужно. Это можно сделать разными способами в зависимости от используемой модели ветвления.
Если вам нужно знать, была ли ветка объединена с главной, следующая команда не выдаст выходных данных, если myTopicBranch был объединен (то есть вы можете удалить ее)
Вы можете использовать команду ветки Git, проанализировать все ветви в Bash и выполнить
for
цикл по всем веткам. В этом цикле вы проверяете вышеуказанной командой, можете ли вы удалить ветку или нет.источник
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
удалит все локальные ветки, кроме текущей извлеченной ветки и / илиmaster
.Вот полезная статья для тех, кто хочет понять эти команды: Git Clean: Удалить уже слитые ветки, Стивен Харман .
источник
Примечание : меня не устраивают предыдущие ответы (не работает на всех системах, не работает на удаленном компьютере, не указывает ветку --merged, не выполняется точная фильтрация). Итак, я добавляю свой ответ.
Есть два основных случая:
Местный
Вы хотите удалить локальные ветви , которые уже объединены с другой локальной веткой . Во время удаления вы хотите сохранить некоторые важные ветки, такие как master, development и т. Д.
Примечания :
git branch output --format
«..» - убрать пробелы и разрешить точное соответствие grepgrep -E
используется вместоegrep
, поэтому он работает и в системах без egrep (то есть: git для windows).grep -E -v '^master$|^feature/develop$'
это указать локальные ветви, которые я не хочу удалятьxargs -n 1 git branch -d
: выполнить удаление локальных веток (для удаленных не будет)Дистанционный пульт
Вы хотите удалить удаленные ветви , которые уже объединены с другой удаленной веткой . Во время удаления вы хотите сохранить некоторые важные ветки, такие как HEAD, master, релизы и т. Д.
Ноты :
-r
опцию и предоставляем полное имя ветви :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
должен соответствовать удаленным ветвям, которые мы не хотим удалять.cut -d/ -f2-
: удалите ненужный префикс origin /, который в противном случае выводитсяgit branch
командой.xargs -n 1 git push --delete origin
: выполнить удаление удаленных веток.источник
Если вы работаете в Windows, вы можете использовать Windows Powershell или Powershell 7 с Out-GridView, чтобы получить хороший список ветвей и выбрать мышью, какую из них вы хотите удалить:
после нажатия OK Powershell передаст имена этих веток
git branch -d
команде и удалит ихисточник
Вы можете использовать
git-del-br
инструмент .Вы можете установить его с
pip
помощьюPS: я автор инструмента. Любые предложения / отзывы приветствуются.
источник
Если вы хотите удалить все локальные ветви, которые уже объединены с той ветвью, в которой вы сейчас находитесь, я предложил безопасную команду, основанную на предыдущих ответах:
Эта команда не повлияет на вашу текущую ветку или вашу основную ветку. Он также скажет вам, что он делает, прежде чем это сделать, используя флаг -t xargs.
источник
Псевдоним версия обновленного ответа Адама :
Также см. Этот ответ для полезных советов по выходу из сложных псевдонимов.
источник
Я использую схему именования git-flow esque, поэтому она работает для меня очень безопасно:
Он в основном ищет объединенные коммиты, которые начинаются со строки
fix/
илиfeature/
.источник
Попробуйте следующую команду:
С помощью
git rev-parse
получит текущее название ветки , чтобы исключить его. Если вы получили ошибку, это означает, что нет локальных веток для удаления.Чтобы сделать то же самое с удаленными ветками (измените
origin
с вашим удаленным именем), попробуйте:Если у вас несколько пультов, добавьте
grep origin |
перед,cut
чтобы отфильтровать толькоorigin
.Если вышеприведенная команда не выполнена, попробуйте сначала удалить объединенные ветви удаленного отслеживания:
Затем
git fetch
снова пульт и используйте предыдущийgit push -vd
команду.Если вы часто используете его, рассмотрите возможность добавления псевдонимов в свой
~/.gitconfig
файл.Если вы удалили несколько веток по ошибке, используйте,
git reflog
чтобы найти потерянные коммиты.источник
Основываясь на некоторых из этих ответов, я сделал свой собственный скрипт Bash, чтобы сделать это тоже !
Он использует
git branch --merged
иgit branch -d
для удаления слитых ветвей и запрашивает каждую ветку перед удалением.источник
Ниже запрос работает для меня
и это отфильтрует любую ветвь в трубе grep.
Хорошо работает с http-клоном, но не очень хорошо для ssh-соединения.
источник
По состоянию на 2018.07
Добавьте это в
[alias]
раздел вашего~/.gitconfig
:Теперь вы можете просто позвонить,
git sweep
чтобы выполнить необходимую очистку.источник
В Windows с установленным git bash egrep -v работать не будет
где
grep -E -v
эквивалентноegrep -v
Используйте
-d
для удаления уже слитых веток или-D
для удаления не слитых ветокисточник
Я использовал следующий метод, чтобы удалить объединенные локальные и удаленные ветви в одном cmd.
У меня есть следующее в моем
bashrc
файле:Оригинальный источник
Это не удаляет основную ветку, но удаляет объединенные локальные и удаленные ветви . Когда у вас есть это в вашем файле rc, просто запустите
rmb
, вам будет показан список объединенных ветвей, которые будут очищены, и будет запрошено подтверждение действия. Вы можете изменить код так, чтобы он не запрашивал подтверждения, но, вероятно, его стоит сохранить.источник
Напишите скрипт, в котором Git проверяет все ветви, которые были объединены с master.
Тогда делай
git checkout master
.Наконец, удалите объединенные ветви.
источник
Принятое решение довольно хорошее, но есть одна проблема, заключающаяся в удалении локальных веток, которые еще не были объединены в удаленный.
Если вы посмотрите на вывод, вы увидите что-то вроде
Ветви
bla
иissue_248
являются локальными ветвями, которые будут удалены без уведомления.Но вы также можете увидеть слово
[gone]
, которое указывает на ветви, которые были перенесены на удаленный (который теперь исчез) и, следовательно, обозначает, что ветви могут быть удалены.Исходный ответ, таким образом, может быть изменен на (разделить на многострочный для более короткой строки)
защитить еще не слитые ветки. Кроме того, подсказка для мастера для его защиты не требуется, поскольку она имеет удаленный источник и не отображается как пропавшая.
источник
Для меня
git branch --merged
не показывает ветки, которые были объединены через GitHub PR. Я не уверен в причинах, но я использую следующую строку, чтобы удалить все локальные ветви, у которых нет удаленной ветви отслеживания :Объяснение:
git branch --format "%(refname:short)"
дает список местных филиаловgit branch -r | grep -v HEAD | cut -d/ -f2-
выдает список удаленных веток, отфильтровываяHEAD
diff <(...) <(...)
дает разницу вывода двух команд в скобкахgrep '<'
фильтрует ветки, которые существуют в первом списке, но не во второмcut -c 3-
дает строку, начинающуюся с 3-го символа, таким образом удаляя префикс<
xargs git branch -D
выполняетсяgit branch -D
против каждого имени ветвиВ качестве альтернативы, вы можете избежать
grep -v '<'
так:источник