Оптимизировав рабочий процесс Git и приступив к пул-реквестам, вы обнаруживаете гору объединенных локальных веток, которые стоило бы удалить.
Данное руководство научит не только с легкостью решать эту задачу, но и создавать псевдонимы Git (англ. alias) с возможностью повсеместного переиспользования.
Удаление одной локальной ветки
Для удаления одной локальной ветки достаточно открыть интерфейс Git GUI и нажать delete применительно к выбранной ветке.
Однако оправдаем свое звание разработчика, продемонстрировав умение работать с терминалом.
Переключаемся на терминал и удаляем ветку следующей командой:
git branch -d YOUR_BRANCH
К сожалению (или к счастью), команда подходит для удаления ветки, которая уже подверглась слиянию. При желании удалить ветку, которая еще не прошла эту процедуру, задействуем заглавную букву D:
git branch -D YOUR_BRANCH
Удаление всех локальных веток
При наличии нескольких локальных веток целесообразно удалить все одной командой, а не применять delete к каждой по отдельности.
Для реализации функции, выполняющей данную задачу, важно знать, что git branch -D может обрабатывать одновременно несколько файлов.
С учетом этого сначала напишем команду для поиска всех веток в репозитории:
git branch | grep -v \*
При выполнении данной команды в CLI вы увидите, что в поиск также включены главная и/или защищенные ветки: master, main, release и т.д.
Вы можете настроить вышеуказанную команду под свои потребности (в данном случае main/master/develop). Рассмотрим пример:
git branch | grep -v "main\|master\|develop"
Кроме того, можно добавить флаг --merged, ограничивающий поиск только объединенными ветками:
git branch --merged | grep -v "main\|master\|develop"
Теперь передаем результат в команду delete, рассмотренную в предыдущем разделе:
git branch --merged | grep -v "main\|master\|develop" | xargs git branch -D
Выполнение данной команды в любом репозитории Git (в котором main/master являются защищенной веткой) приведет к удалению всех объединенных веток, не имеющих локальных изменений. С помощью -d можно отменить команду, если вдруг вы забыли --merged.
Важное примечание
Если при выполнении этого скрипта вы находитесь на измененной ветке, то операция закончится ошибкой not found (не найдено):
error: branch '*' not found.
Во избежание данной проблемы скорректируем команду, добавив в конце \|*. Пример:
git branch --merged | grep -v "main\|master\|develop\*" | xargs git branch -D
Создание псевдонима Git
Простые псевдонимы Git
Псевдонимы Git — это функциональность, которая упрощает и оптимизирует работу с Git. Она объединяет команды в псевдоним, которым можно воспользоваться в любое время.
Приведем примеры востребованных псевдонимов:
coдля переключения веток и выгрузки их содержимого в рабочий каталог;ciдля коммита.
Для настройки этих псевдонимов выполняем:
git config --global alias.co checkout
git config --global alias.ci commit
К сожалению, простые псевдонимы Git не позволяют корректно задействовать оператор конвейера и передавать результаты одной команды в другую.
К счастью, Git позволяет использовать оболочку в создании псевдонимов!
Сложные псевдонимы Git
С помощью оператора ! псевдонимы могут переходить в оболочку, открывая мир новых возможностей для работы с ними. Эта технология позволяет применять:
- параметры и расширения оболочки;
- многочисленные команды git;
- утилиту
grep, конвейеры (англ. pipe) и другие установленные инструменты командной строки Unix.
Для создания нового псевдонима Git можно воспользоваться следующим шаблоном и добавить свою команду:
fancy_alias = "!f() { (your complex commands here) }; f"
В этом псевдониме применяется простой прием обертывания фактической команды git в анонимную функцию bash (или, точнее сказать, в функцию с именем f()). При таком подходе получить доступ к переменным командной строки и расширениям оболочки можно следующим образом:
- использовать
$1,$2и$3для первого, второго и третьего параметров, переданных в псевдоним Git; - связать команды
gitв цепочки с помощью&&; - передать результаты по конвейеру посредством
|; - задействовать полный набор инструментов Unix.
Рассмотрим действие функциональности сложных псевдонимов Git на двух практических примерах:
1. Показ коммитов с момента последней команды git
git config --global alias.new = !sh -c 'git log $1@{1}..$1@{0} "$@"'
Данный псевдоним запускается в работу путем выполнения git new и предоставления HEAD:
git new HEAD
2. Добавление удаленного репозитория в локальный
git config --global alias.ra = "!f() { git remote add $1 $2; }; f"
Псевдоним готов к работе после выполнения git ra и добавления имени и URL удаленного репозитория:
git ra cool_remote [email protected]:paulknulst/nestjs-starter.git
Создание псевдонима для удаления веток
Зная способ создания расширенного псевдонима Git, воспользуемся предыдущей информацией и обернем команду анонимной функцией bash с именем f():
'!f() { git branch --merged | grep -v "main\|master\|develop\|*" | xargs git branch -D; }; f'
Далее с помощью команды git config создаем глобальный псевдоним Git для пользователя, в настоящий момент вошедшего в систему:
git config --global alias.clean-branches '!f() { git branch --merged | grep -v "main\|master\|develop\|*" | xargs git branch -D; }; f'
Заключение
Бывает, что вы забываете удалять локальные ветки сразу же после закрытия пул-реквеста, и они со временем накапливаются. Возможно, удаленная ветка уже устранена, но зато ежедневно растет локальный каталог. К счастью, теперь вы знаете способ решения этой проблемы и можете реализовать его в CLI для удаления окончательно объединенных локальных веток.
Кроме того, вы научились использовать простые и сложные псевдонимы Git с оператором !, способствующие оптимизации рабочего процесса.
Читайте также:
- Как написать хороший README: краткий курс
- 7 малоизвестных команд и приемов Git
- Руководство для начинающих по Git: что такое журнал изменений и как его создать
Читайте нас в Telegram, VK и Дзен
Перевод статьи Paul Knulst: How to Remove Local Git Branches by Creating Git Aliases





