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


552

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

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

git push origin :coolbranch
git branch -D coolbranch

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

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

git branch -a

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

remotes/origin/coolbranch

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

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



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

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


Для полноты: он должен быть таким же 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

git branch -d branch-nameработал на меня. Обратите внимание -Dна -d. Фактически, когда я пытался использовать заглавные буквы D, -Dон создал новую ветку с именем -D
RP-

1
«-D» - это способ принудительного удаления независимо от его статуса отправки или объединения. Очевидно, используйте его осторожно, но во многих случаях это было необходимо.
Shadowvail

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.