Question Supprimer les branches locales non plus sur la télécommande


Existe-t-il un moyen simple de supprimer toutes les branches locales qui n'ont pas d'équivalent distant?

Exemple:

Branches (locales et éloignées)

  • maîtriser
  • origine / maître
  • origine / bug-fix-a
  • origine / bug-fix-b
  • origine / bug-fix-c

Localement, j'ai seulement une branche maîtresse. Maintenant je dois travailler sur bug-fix-a, donc je vérifie, travaille dessus, et pousse les changements à la télécommande. Ensuite, je fais la même chose avec bug-fix-b.

Branches (locales et éloignées)

  • maîtriser
  • bug-fix-a
  • bug-fix-b
  • origine / maître
  • origine / bug-fix-a
  • origine / bug-fix-b
  • origine / bug-fix-c

Maintenant j'ai des branches locales maîtriser, bug-fix-a, bug-fix-b. Le responsable de la branche Master fusionnera mes modifications maîtriser et supprime toutes les branches qu'il a déjà fusionnées.

Donc, l'état actuel est maintenant:

Branches (locales et éloignées)

  • maîtriser
  • bug-fix-a
  • bug-fix-b
  • origine / maître
  • origine / bug-fix-c

Maintenant, je voudrais appeler une commande pour supprimer des branches (dans ce cas bug-fix-a, bug-fix-b), qui ne sont plus représentés dans le référentiel distant.

Ce serait quelque chose comme la commande existante git remote prune origin, mais plus comme git local prune origin.


564
2017-10-11 13:37


origine


Réponses:


git remote prune origin pruneaux de suivi des branches pas sur la télécommande.

git branch --merged répertorie les branches qui ont été fusionnées dans la branche en cours.

xargs git branch -d supprime les branches listées sur l'entrée standard.

Soyez prudent en supprimant les branches listées par git branch --merged. La liste pourrait inclure master ou d'autres branches que vous préférez ne pas supprimer.

Pour vous donner l'opportunité d'éditer la liste avant de supprimer des branches, vous pouvez faire ce qui suit en une ligne:

git branch --merged >/tmp/merged-branches && vi /tmp/merged-branches && xargs git branch -d </tmp/merged-branches


623
2018-02-11 20:56



Après la commande

git fetch -p

supprime les références distantes, lorsque vous exécutez

git branch -vv

il va montrer «disparu» comme le statut à distance. Par exemple,

$ git branch -vv
  master                 b900de9 [origin/master: behind 4] Fixed bug
  release/v3.8           fdd2f4e [origin/release/v3.8: behind 2] Fixed bug
  release/v3.9           0d680d0 [origin/release/v3.9: behind 2] Updated comments
  bug/1234               57379e4 [origin/bug/1234: gone] Fixed bug

Vous pouvez donc écrire un script simple pour supprimer les branches locales qui sont passées en télécommandes:

git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done

280
2017-11-05 15:06



La plupart de ces réponses ne répondent pas à la question initiale. J'ai fait un tas de creuser et ce était la solution la plus propre que j'ai trouvée. Voici une version légèrement plus complète de cette réponse:

  1. Découvrez votre branche par défaut. habituellement git checkout master
  2. Courir git fetch -p && git branch -vv | awk '/: gone]/{print $1}' | xargs git branch -d

Explication:

Fonctionne en élaguant vos branches de suivi puis en supprimant celles locales qui montrent qu'elles sont "parties" dans git branch -vv.

Remarques:

Si votre langue est définie sur autre chose que l'anglais, vous devrez changer gone au mot approprié. Les branches locales ne seront pas touchées. Les branches qui ont été supprimées sur la télécommande mais qui n'ont pas été fusionnées afficheront une notification mais ne seront pas supprimées en local. Si vous voulez supprimer ces changements -d à -D.


180
2017-07-15 19:58



Il semble que la solution soit ici - https://stackoverflow.com/a/1072178/133986

En bref, git remote prune fait la magie


54
2018-01-07 13:10



J'ai trouvé la réponse ici: Comment puis-je supprimer toutes les branches git qui ont été fusionnées?

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

Assurez-vous de garder le maître

Vous pouvez vous assurer que master, ou toute autre branche d'ailleurs, ne sera pas supprimé en ajoutant un autre grep après le premier. Dans ce cas, vous iriez:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

Donc, si nous voulions garder master, develop et staging par exemple, nous irions:

git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d

Faites-en un alias

Comme c'est un peu long, vous pouvez ajouter un alias à votre .zshrcou .bashrc. Le mien est appelé gbpurge (pour git branches purge):

alias gbpurge='git branch --merged | grep -v "\*" | grep -v "master" | grep -v "develop" | grep -v "staging" | xargs -n 1 git branch -d'

Puis rechargez votre .bashrcou .zshrc:

. ~/.bashrc

ou

. ~/.zshrc

42
2017-08-23 12:06



Supprimez toutes les branches qui ont été fusionnées dans le maître, mais n'essayez pas de supprimer le maître lui-même:

git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)

ou ajoutez un alias:

alias gitcleanlocal="git checkout master && git pull origin master && git fetch -p && git branch -d $(git branch --merged | grep master -v)"

Explication:

git checkout master  branche maîtresse de caisse

git pull origin master  Assurez-vous que la branche locale a toutes les modifications à distance fusionnées

git fetch -p supprimer les références aux branches distantes qui ont été supprimées

git branch -d $(git branch master --merged | grep master -v)  supprimer toutes les branches qui ont été fusionnées dans le maître, mais n'essayez pas de supprimer le maître lui-même


25
2017-12-10 23:14



Je ne répondrais pas normalement à une question qui a déjà 16 réponses, mais toutes les autres réponses sont fausses, et la bonne réponse est si simple. La question dit, "Y at-il un moyen simple de supprimer toutes les succursales locales qui n'ont pas d'équivalent à distance?" - mais l'intention réelle est clairement "... supprimer tout suivi branches dont l'équivalent à distance n'existe plus. "

La bonne réponse est à cette question est: Non.

(Je prends «simple» pour signifier «pas fragile, pas dangereux, et ne pas compter sur des outils que tous les lecteurs n'auront pas».)

Si vous doutez de moi, lisez attentivement les autres réponses. Il y en a qui sont simples, mais ils ne font pas ce qu'on leur demande. Et ils sont nombreux à faire ce qui est demandé, mais ils ne sont pas simples: tous utilisent la sortie Git (et la sortie de porcelaine dans la plupart des cas) par des commandes de manipulation de texte ou des langages de script, qui peuvent ne pas être présents sur tous les systèmes .

En lire plus: https://stackoverflow.com/a/20107184/587365 et https://stackoverflow.com/a/26152574/587365

Si vous voulez le faire en toute sécurité, pour le cas d'utilisation de la question (garbage-collect des branches de suivi qui ont été supprimées sur le serveur mais existent toujours en tant que branches locales) et avec des commandes Git de haut niveau uniquement, vous devez

  • git fetch --prune (ou git fetch -p, qui est un alias, ou git prune remote origin qui fait la même chose sans aller chercher, et n'est probablement pas ce que vous voulez la plupart du temps).
  • Notez toutes les branches distantes signalées comme supprimées. Ou, pour les retrouver plus tard, git branch -v (Toute branche de suivi orpheline sera marquée "[gone]").
  • git branch -d [branch_name] sur chaque branche de suivi orphelins

19
2017-12-22 09:54