Git remote branch supprimé, mais il apparaît toujours dans 'branch -a'

552

Disons que j'avais une branche nommée coolbranchdans mon référentiel.

Maintenant, j'ai décidé de le supprimer (à distance et localement) avec:

git push origin :coolbranch
git branch -D coolbranch

Génial! Maintenant, la branche est vraiment supprimée.

Mais quand je cours

git branch -a

Je reçois toujours:

remotes/origin/coolbranch

Quelque chose à noter, c'est que lorsque je clone un nouveau référentiel, tout va bien et git branch -an'affiche pas la branche.

Je veux savoir - existe-t-il un moyen de supprimer la branche de la branch -aliste sans cloner une nouvelle instance?

yonix
la source
58
Si vous git fetch -p(ou git pull -p) les branches distantes seront élaguées.
yoyo

Réponses:

689

git remote prune origin, comme suggéré dans l'autre réponse, supprimera toutes ces branches périmées. C'est probablement ce que vous voudriez dans la plupart des cas, mais si vous souhaitez simplement supprimer cette branche de suivi à distance particulière, vous devez faire:

git branch -d -r origin/coolbranch

(Il -rest facile d'oublier ...)

-rdans ce cas, "Liste ou supprime (si utilisé avec -d) les branches de suivi à distance". selon la documentation Git trouvée ici: https://git-scm.com/docs/git-branch

Mark Longair
la source
11
git remote prune originou toute forme de git fetch --prunesignalement n'a pas fonctionné pour moi dans mon cas. ... Mais git branch -d -r origin/feature/branch-nameça a marché. Je ne sais pas si cela avait quelque chose à voir avec le fait qu'il soit sous l' featureespace de noms (git flow) mais c'est comme ça que ça s'est passé, au cas où des googleurs trouveraient que cela leur arrive.
Misterparker
8
Y a-t-il une raison pour laquelle cela est nécessaire? Semble vraiment mauvais de laisser ces noms de branche inexistants dans la liste et de ne pas les élaguer automatiquement.
akronymn
296

Essayer:

git remote prune origin

Dans la documentation distante de Git :

prune

Supprime toutes les branches de suivi à distance périmées sous <nom>. Ces branches périmées ont déjà été supprimées du référentiel distant référencé par <nom>, mais sont toujours disponibles localement dans "télécommandes / <nom>".

Avec l'option --dry-run, indiquez quelles branches seront élaguées, mais ne les élaguez pas réellement.

Brian Phillips
la source
1
Pour être complet: il doit être similaire à celui git pull --prunementionné sur stackoverflow.com/a/17983126/94687 Et:git remote update --prune
imz - Ivan Zakharyaschev
230

N'oubliez pas le génial

git fetch -p

qui va chercher et tailler toutes les origines.

orip
la source
Pour être complet: il doit être identique git remote prune originet similaire à celui git pull --prunementionné sur stackoverflow.com/a/6127884/94687 et stackoverflow.com/a/17983126/94687 respectivement. Et:git remote update --prune
imz - Ivan Zakharyaschev
2
Mais les branches seront toujours visibles si vous courezgit branch -a
Nikhil Sahu
1
@NikhilSahu: Je ne vois plus les branches distantes qui ont été supprimées avecgit branch -a
user276648
20

Dans notre cas particulier, nous utilisons Stash comme référentiel Git distant. Nous avons essayé toutes les réponses précédentes et rien ne fonctionnait. Nous avons fini par devoir faire ce qui suit:

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

Ensuite, lorsque les utilisateurs sont allés retirer des modifications, ils devaient effectuer les opérations suivantes:

git fetch -p
Shadowvail
la source
git branch -d branch-nametravaillé pour moi. Avis -Dà -d. En fait, lorsque j'ai essayé avec les majuscules D, -Dil a créé une nouvelle branche avec le nom -D
RP-
1
le "-D" est un moyen de forcer la suppression quel que soit son état push ou merge. Évidemment, soyez prudent en l'utilisant, mais dans de nombreux cas, cela a été nécessaire.
Shadowvail
19

Utilisation:

git remote prune <remote>

Où se <remote>trouve un nom de source distante comme origine ou en amont .

Exemple: git remote prune origin

likaiguo.happy
la source
3
pour les futurs lecteurs, voici la différence entre git remote prune, git prune,git fetch --prune .
Emile Bergeron