Как удалять локальные ветки с помощью псевдонимов Git

Оптимизировав рабочий процесс 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 с оператором !, способствующие оптимизации рабочего процесса. 

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Paul Knulst: How to Remove Local Git Branches by Creating Git Aliases

Предыдущая статьяКак выбрать подходящую версию Node.js?
Следующая статья11 новых возможностей JavaScript в ES13