В Git существует два метода, которые показывают удаленные (в смысле расположенные на сервере, а не локально) ветки. Так, во всеком случае, можно понять из документации. На самом деле эти две команды показывают совершенно разные вещи.
* * *
Команда git branch --remotes показывает ссылки на удаленные ветки, которые существуют локально. Грубо говоря, когда происходит связывание локальной и удаленной ветки, тогда локально создается ссылка на удаленную ветку. Именно эти ссылки на удаленные ветки и показываются данной командой.
Кстати, эти ссылки хранятся в файлах с именем ветки, расположенных в каталоге ./git/refs/remotes/origin. Один файл - одна ссылка на удаленную ветку. Имя файла - это имя ветки. В файле находится хеш коммита, на который указывает данная ссылка (здесь надо понимать, что ветка в Git - это всего лишь указатель на определенный коммит, подробности в этой статье).
Если дать команду разрыва связи между локальной и удаленной веткой, это значит только что будет разорвана связь. Это не значит, что ссылка на удаленную ветку будет удалена из локального репозитария. Поэтому команда git branch --remotes все так же будет показывать все ветки, на которые локально хранятся ссылки.
* * *
Команда git ls-remote связывается с удаленным сервером и выводит на экран ветки, которые существуют в репозитарии, и которые находятся на удаленном сервере. По сравнению с предыдущей командой, данная команда может показать больше веток, потому что программист может связывать не все локальные ветки с удаленными.
А если не происходило выкачиваний из удаленного репозитария, то может получиться так, что локальная ветка указывает на удаленную ветку, но этой удаленной ветки уже не существует на сервере. В этом случае может помочь команда:
git fetch --all -p
Она получит список всех веток на удаленном сервере, и локально удалит те внешние ссылки на ветки, для которых которых на сервере нет веток (при этом список локальных веток и сами локальные ветки затронуты не будет).