Удаленная ветка Git удалена, но все равно она появляется в ветке -a

552

Допустим, coolbranchв моем хранилище была названа ветка .

Теперь я решил удалить его (как удаленно, так и локально) с помощью:

git push origin :coolbranch
git branch -D coolbranch

Большой! Теперь ветка действительно удалена.

Но когда я бегу

git branch -a

Я все еще получаю:

remotes/origin/coolbranch

Стоит заметить, что когда я клонирую новый репозиторий, все в порядке и git branch -aветка не отображается.

Я хочу знать - есть ли способ удалить ветку из branch -aсписка без клонирования нового экземпляра?

yonix
источник
58
Если вы git fetch -p(или git pull -p), то удаленные ветви будут сокращены.
йойо

Ответы:

689

git remote prune origin, как предлагается в другом ответе, удалит все такие устаревшие ветви. Это, вероятно, то, что вы хотели бы в большинстве случаев, но если вы хотите просто удалить эту конкретную ветку удаленного отслеживания, вы должны сделать:

git branch -d -r origin/coolbranch

(Это -rлегко забыть ...)

-rв этом случае «Перечислите или удалите (если используется с -d) ветви удаленного отслеживания». согласно документации Git, найденной здесь: https://git-scm.com/docs/git-branch

Марк Лонгэйр
источник
11
git remote prune originили любая форма git fetch --pruneпометки не работает для меня в моем случае. ... но git branch -d -r origin/feature/branch-nameсработало. Я не уверен, было ли это как-то связано с тем, что он находился в featureпространстве имен (git flow), но так оно и было, на случай, если кто-нибудь из Google обнаружит, что это происходит с ними.
Misterparker
8
Есть ли причина, по которой это необходимо? Кажется действительно плохим оставлять эти несуществующие имена ветвей в списке и не удалять их автоматически.
Акроним
296

Пытаться:

git remote prune origin

Из удаленной документации Git :

чернослив

Удаляет все устаревшие ветки удаленного отслеживания в <имя>. Эти устаревшие ветви уже были удалены из удаленного репозитория, на который ссылается <name>, но все еще доступны локально в «remotes / <name>».

С опцией --dry-run сообщать, какие ветви будут удалены, но на самом деле не сокращать их.

Брайан Филлипс
источник
1
Для полноты: оно должно быть похоже на git pull --pruneупомянутое на stackoverflow.com/a/17983126/94687 И:git remote update --prune
imz - Иван Захарящев
230

Не забудь офигенное

git fetch -p

который выбирает и чернослив все происхождение.

orip
источник
Для полноты: он должен быть таким же git remote prune originи аналогичным git pull --pruneупомянутым на stackoverflow.com/a/6127884/94687 и stackoverflow.com/a/17983126/94687 соответственно. И:git remote update --prune
imz - Иван Захарящев
2
Но ветви будут все еще видны , если и запуститьgit branch -a
Нихилу Sahu
1
@NikhilSahu: я больше не вижу удаленных веток, которые были удалены сgit branch -a
user276648
20

В нашем конкретном случае мы используем Stash в качестве удаленного Git-репозитория. Мы перепробовали все предыдущие ответы и ничего не получалось. Нам пришлось сделать следующее:

git branch –D branch-name (delete from local)
git push origin :branch-name (delete from remote)

Затем, когда пользователи пошли извлекать изменения, им нужно было сделать следующее:

git fetch -p
Shadowvail
источник
git branch -d branch-nameработал на меня. Обратите внимание -Dна -d. Фактически, когда я пытался использовать заглавные буквы D, -Dон создал новую ветку с именем -D
RP-
1
«-D» - это способ принудительного удаления независимо от его статуса отправки или объединения. Очевидно, используйте его осторожно, но во многих случаях это было необходимо.
Shadowvail
19

Использование:

git remote prune <remote>

Где <remote>имя удаленного источника, например, происхождение или восходящий .

Пример: git remote prune origin

likaiguo.happy
источник
3
для читателей будущего, вот разница между git remote prune, git prune,git fetch --prune .
Эмиль Бержерон,