Оптимизировав рабочий процесс 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