Внимание! Возможно, все ниже описываемое написано неправильно, возможно что автор не понимает, какая ситуация с ветками произошла и где существуют ветки, и где хранятся ссылки на ветки. Но по-факту, написанная здесь команда помогла в похожем случае.
Если сложилась такая ситуация, что локальная ветка была удалена, а внешняя ветка, расположенная на удаленном репозитарии, не удаляется, то скорее всего это значит, что удаленная ветка изначально не была связана с локальной.
Проблема в том, что удаление внешней неотслеживаемой ветки будет приводить к ошибке:
git push origin -d unnecessaryBranch
error: unable to delete 'unnecessaryBranch': remote ref does not exist
error: не удалось отправить некоторые ссылки в «ssh://user@server:/home/git/repo.git»
git push origin -d remotes/origin/unnecessaryBranch
error: unable to delete 'remotes/origin/unnecessaryBranch': remote ref does not exist
error: не удалось отправить некоторые ссылки в «ssh://user@server:/home/git/repo.git»
Удаление через опцию -r команды git branch тоже будет невозможно, так как удаляемая ветка не привязана к локальной:
git branch -d -r unnecessaryBranch
error: внешняя отслеживаемая ветка «unnecessaryBranch» не найдена.
git branch -d -r remotes/origin/unnecessaryBranch
error: внешняя отслеживаемая ветка «remotes/origin/unnecessaryBranch» не найдена.
Что делать в этом случае? Нужно дать команду, которая получит изменения с сервера и засинхронизирует локальные и удаленные ветки:
git fetch --all -p
Что делает эта команда - понять довольно сложно. Перевод документации на опцию -p достаточно безумен, чтобы его рассматривать как внятное объяснение:
Вариант 1: Перед извлечением удалите все ссылки на удаленное отслеживание, которые больше не существуют на удаленном устройстве. Теги не подлежат удалению, если они извлекаются только из-за автоматического следования тегов по умолчанию или из-за параметра --tags. Однако, если теги извлекаются из-за явного указания refspec (либо в командной строке, либо в удаленной конфигурации, например, если удаленный сервер был клонирован с параметром --mirror), то они также подлежат удалению. Предоставление --prune-tags - это сокращение от предоставления tag refspec.
Вариант 2: Перед извлечением удалите любые удаленные отслеживаемые ссылки, которых больше нет на удаленном сервере. Теги не подвергаются усечению, если они извлекаются только из-за автоматического следования за тегами по умолчанию или из-за опции --tags. Однако, если теги извлекаются из-за явного refspec'а (либо в командной строке, либо в конфигурации удаленного сервера, например, если удаленный сервер был клонирован с опцией --mirror), то они также подвержены усечению. Указание --prune-tags является сокращением для предоставления refspec'а тегов.
Но факт в том, что эта команда поможет удалить реально неиспользуемые ветки на удаленном сервере.