Zdalna gałąź Git została usunięta, ale nadal pojawia się w gałęzi -a

552

Powiedzmy, że mam gałąź o nazwie coolbranchw moim repozytorium.

Teraz postanowiłem go usunąć (zarówno zdalnie, jak i lokalnie) za pomocą:

git push origin :coolbranch
git branch -D coolbranch

Świetny! Teraz gałąź jest naprawdę usunięta.

Ale kiedy biegnę

git branch -a

Nadal otrzymuję:

remotes/origin/coolbranch

Należy zauważyć, że kiedy klonuję nowe repozytorium, wszystko jest w porządku i git branch -anie pokazuje gałęzi.

Chcę wiedzieć - czy istnieje sposób na usunięcie gałęzi z branch -alisty bez klonowania nowej instancji?

yonix
źródło
58
Jeśli ty git fetch -p(lub git pull -p), odległe gałęzie zostaną przycięte.
yoyo

Odpowiedzi:

688

git remote prune origin, jak sugeruje druga odpowiedź, usunie wszystkie takie nieaktualne gałęzie. Prawdopodobnie tego chciałbyś w większości przypadków, ale jeśli chcesz po prostu usunąć tę konkretną gałąź zdalnego śledzenia, powinieneś:

git branch -d -r origin/coolbranch

( -rŁatwo zapomnieć ...)

-rw tym przypadku „Wymień lub usuń (jeśli używasz -d) gałęzie zdalnego śledzenia”. zgodnie z dokumentacją Git dostępną tutaj: https://git-scm.com/docs/git-branch

Mark Longair
źródło
11
git remote prune originlub jakakolwiek forma git fetch --pruneoznaczania nie działała dla mnie w moim przypadku. ... Ale git branch -d -r origin/feature/branch-namedziałało. Nie jestem pewien, czy miało to coś wspólnego z tym, że znajdował się pod featureprzestrzenią nazw (git flow), ale tak to poszło, na wypadek, gdyby któryś z pracowników Google go spotkał.
Misterparker,
8
Czy istnieje powód, dla którego jest to konieczne? Naprawdę źle jest pozostawić te nieistniejące nazwy gałęzi na liście i nie przycinać ich automatycznie.
akronimn
296

Próbować:

git remote prune origin

Ze zdalnej dokumentacji Git :

suszona śliwka

Usuwa wszystkie nieaktualne gałęzie zdalnego śledzenia w obszarze <nazwa>. Te nieaktualne gałęzie zostały już usunięte ze zdalnego repozytorium, do którego odwołuje się <nazwa>, ale nadal są lokalnie dostępne w „zdalnych / <nazwa>”.

W opcji --dry-run zgłoś, które gałęzie zostaną przycięte, ale nie przycinaj ich.

Brian Phillips
źródło
1
Dla kompletności: musi być podobny do git pull --prunewspomnianego na stackoverflow.com/a/17983126/94687 I:git remote update --prune
imz - Ivan Zakharyaschev
230

Nie zapomnij o niesamowitości

git fetch -p

który pobiera i przycina wszystkie źródła.

orip
źródło
Dla kompletności: musi być taki sam git remote prune origini podobny jak git pull --prunewspomniano odpowiednio na stackoverflow.com/a/6127884/94687 i stackoverflow.com/a/17983126/94687 . I:git remote update --prune
imz - Ivan Zachharyaschev
2
Ale gałęzie będą nadal widoczne, jeśli uruchomiszgit branch -a
Nikhil Sahu
1
@NikhilSahu: Nie widzę już zdalnych gałęzi, które zostały już usunięte za pomocągit branch -a
user276648,
20

W naszym szczególnym przypadku używamy Stash jako naszego zdalnego repozytorium Git. Próbowaliśmy wszystkich poprzednich odpowiedzi i nic nie działało. Skończyło się na tym, że musimy wykonać następujące czynności:

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

Następnie użytkownicy, którzy postanowili pobrać zmiany, musieli wykonać następujące czynności:

git fetch -p
Shadowvail
źródło
git branch -d branch-namepracował dla mnie. Uwaga -Ddla -d. W rzeczywistości, kiedy próbowałem z wielką literą D -D, utworzyłem nową gałąź o nazwie -D
RP-
1
„-D” jest sposobem na wymuszenie usunięcia bez względu na status wypychania lub scalania. Oczywiście używaj go ostrożnie, ale w wielu przypadkach było to konieczne.
Shadowvail
19

Posługiwać się:

git remote prune <remote>

Gdzie <remote>jest nazwa zdalnego źródła, np. Origin lub upstream .

Przykład: git remote prune origin

likaiguo.happy
źródło
3
dla przyszłych czytelników, tutaj jest różnica między git remote prune, git prune,git fetch --prune .
Emile Bergeron,