J'ai de nombreuses succursales Git. Comment supprimer des branches qui ont déjà été fusionnées? Existe-t-il un moyen simple de les supprimer tous au lieu de les supprimer un par un?
1936
J'ai de nombreuses succursales Git. Comment supprimer des branches qui ont déjà été fusionnées? Existe-t-il un moyen simple de les supprimer tous au lieu de les supprimer un par un?
git branch -D
supprimez toute branche, qu'elle ait été fusionnée ou non.master
chaque branche est en avance / en retard . Cependant, votre client local répertoriera toujours les anciennes branches si vous exécutezgit branch -a
; utilisergit fetch --prune
pour les supprimer (selon cette réponse ).git delete-merged --doit origin
ougit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
au fil des ans est devenu le moyen le plus simple de sortir d'un cornichon avec git.Réponses:
MISE À JOUR:
Vous pouvez ajouter d'autres branches à exclure comme master et dev si votre flux de travail en a comme ancêtre possible. Habituellement, je dérive d'une balise "sprint-start" et master, dev et qa ne sont pas des ancêtres.
D'abord, répertoriez toutes les branches qui ont été fusionnées dans la télécommande.
Vous pouvez voir quelques branches que vous ne souhaitez pas supprimer. nous pouvons ajouter quelques arguments pour ignorer les branches importantes que nous ne voulons pas supprimer comme master ou develop. La commande suivante sautera la branche principale et tout ce qui contient du dev.
Si vous souhaitez ignorer, vous pouvez l'ajouter à la commande egrep comme suit. La branche
skip_branch_name
ne sera pas supprimée.Pour supprimer toutes les branches locales déjà fusionnées dans la branche actuellement extraite:
Vous pouvez voir que master et dev sont exclus au cas où ils seraient un ancêtre.
Vous pouvez supprimer une branche locale fusionnée avec:
S'il n'est pas fusionné, utilisez:
Pour le supprimer de l'utilisation à distance:
Une fois que vous avez supprimé la branche de la télécommande, vous pouvez tailler pour vous débarrasser des branches de suivi à distance avec:
ou tailler les branches de suivi à distance individuelles, comme le suggère l'autre réponse, avec:
J'espère que cela t'aides.
la source
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
si vous n'avez aucune branche à supprimer. Pour éviter cela, vous pouvez passer-r
àxargs
afin qu'il ne s'exécute pasgit branch -d
si le stdin est vide. (Il s'agit d'une extension GNU xargs, selon la page de manuel).Pour supprimer toutes les branches distantes déjà fusionnées:
Dans les versions plus récentes de Git
MISE À JOUR (par @oliver; car ne tient pas dans le commentaire, mais suffisamment de réponses déjà) : si vous êtes sur la branche ABC, alors ABC apparaîtra dans les résultats
git branch -r --merged
parce que la branche n'est pas spécifiée, donc la branche par défaut est la branche actuelle et une branche est toujours considéré comme fusionné avec lui-même (car il n'y a pas de différence entre une branche et elle-même!).Donc, spécifiez la branche:
OU premier maître de caisse:
la source
dev
donc j'ai dû changer cela| grep origin
aprèsgrep -v master
pour éviter de pousser des branches d'autres télécommandes à l'origine. Je recommande fortement de tester la sortie au préalable, en utilisantgit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
branche.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Maintenant, cela s'est avéré être mon alias.-r
argument, que je n'ai vu nulle part ailleurs. Il est tenu pour acquis que seules les succursales locales valent la peine de faire le ménage. Mais les télécommandes sont également pleines d'ordures.myFeatureBranch
elle s'effaceraorigin/myFeatureBranch
. Il vaut probablement mieuxgit checkout master
commencer.Juste étendre un peu la réponse d'Adam:
Ajoutez ceci à votre configuration Git en exécutant
git config -e --global
Et puis vous pouvez supprimer toutes les branches locales fusionnées en faisant un simple
git cleanup
.la source
git branch --merged master
puisque vous voulez regarder ce qui a été fusionné dans la branche principale, pas actuellement extraite?develop
oudev
et dans ce cas la commande échouera avecfatal: malformed object name
il vaut mieux avoir une commande générique et vous avez la responsabilité de l'exécuter-r
àxargs
évitera les erreurs inutiles (branch name required
) lors de l'exécution de cet alias plusieurs fois ou lorsqu'il ne reste aucune branche à supprimer. Mon alias ressemble à ceci:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Cela fonctionne également pour supprimer toutes les branches fusionnées à l'exception de master.
la source
master
. Essayezgrep -v ^master$
pour le milieu.| grep -v '^\*'
éviter de supprimer la branche actuelle si vous n'êtes pas sur mastergrep -v '^ master$'
. Si vous le saisissez vous-même et en manquez un, vous le supprimerezmaster
si vous n'y êtes pas.git branch
listera chaque nom de branche sur une nouvelle ligne avec deux espaces à gauche s'il ne s'agit pas de la branche actuellement extraite. Vous avez essentiellement garanti que toute personne qui exécute cette commande supprimera sa branche principale, sauf s'il s'agit de la branche actuellement extraite.Vous voudrez exclure les branches
master
&develop
de ces commandes.Git local clair:
Git distant clair:
Synchroniser le registre local des succursales distantes:
la source
git config --global --add fetch.prune true
pour tailler automatiquement lors de l'extraction ou de la traction.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Pour ceux d'entre vous qui sont sous Windows et préfèrent les scripts PowerShell, voici celui qui supprime les branches fusionnées locales:
la source
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(soupir, remplacez les doubles-citations par des simples, je ne sais pas comment formater un littéral qui contient des backquotes)J'utilise la réponse d'Adam depuis des années maintenant. Cela dit, il y a des cas où il ne s'est pas comporté comme je m'y attendais:
1 et 2 étaient simples à aborder, avec juste un changement de l'expression rationnelle. 3 dépend du contexte de ce que vous voulez (c.-à-d. Supprimer uniquement les branches qui n'ont pas été fusionnées en maître ou contre votre branche actuelle). 4 a le potentiel d'être désastreux (bien que récupérable avec
git reflog
), si vous l'avez involontairement exécuté en état HEAD détaché.Enfin, je voulais que tout cela soit dans une seule ligne qui ne nécessite pas de script séparé (Bash | Ruby | Python).
TL; DR
Créez un "balayage" d'alias git qui accepte un
-f
indicateur optionnel :et l'invoquer avec:
ou:
La réponse longue et détaillée
Il m'a été plus facile de créer un exemple de dépôt git avec quelques branches et de valider le bon comportement:
Créer un nouveau dépôt git avec un seul commit
Créez de nouvelles succursales
Comportement souhaité: sélectionnez toutes les branches fusionnées sauf: master, develop ou current
Le regex original manque les branches "masterful" et "notmaster":
Avec la regex mise à jour (qui exclut désormais "développer" plutôt que "dev"):
Basculez vers la branche foo, faites un nouveau commit, puis extrayez une nouvelle branche, foobar, basée sur foo:
Ma branche actuelle est foobar, et si je réexécute la commande ci-dessus pour répertorier les branches que je veux supprimer, la branche "foo" est incluse même si elle n'a pas été fusionnée dans master:
Cependant, si j'exécute la même commande sur master, la branche "foo" n'est pas incluse:
Et c'est tout simplement parce que la valeur par
git branch --merged
défaut est HEAD de la branche actuelle, sauf indication contraire. Au moins pour mon flux de travail, je ne veux pas supprimer les branches locales sauf si elles ont été fusionnées pour devenir master, donc je préfère la variante suivante:État HEAD détaché
S'appuyer sur le comportement par défaut de
git branch --merged
a des conséquences encore plus importantes dans l'état HEAD détaché:Cela aurait supprimé la branche sur laquelle j'étais, "foobar" avec "foo", ce qui n'est certainement pas le résultat souhaité. Avec notre commande révisée, cependant:
Une ligne, y compris la suppression réelle
Le tout enveloppé dans un alias git "sweep":
L'alias accepte un
-f
indicateur facultatif . Le comportement par défaut consiste à supprimer uniquement les branches qui ont été fusionnées dans le maître, mais l'-f
indicateur supprimera les branches qui ont été fusionnées dans la branche actuelle.la source
git config
atomique?!f(){ git branch ...
. C'est une déclaration de fonction, non? Pourquoi ne pas commencer directement avecgit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Sauf que cela supprimeraitdevelop
, mais pourrait être une approche plus simple.Git Sweep fait un excellent travail.
la source
En utilisant Git version 2.5.0:
la source
master
branche btw!master
.git branch -d $(git branch --merged | grep -v master)
Vous pouvez ajouter le commit à l'option --merged. De cette façon, vous pouvez vous assurer de ne supprimer que les branches qui sont fusionnées, c'est-à-dire l'origine / master
La commande suivante supprimera les branches fusionnées de votre origine.
Vous pouvez tester les branches qui seront supprimées en remplaçant l'origine de git push - supprimer avec echo
la source
J'utilise le script Ruby suivant pour supprimer mes branches locales et distantes déjà fusionnées. Si je le fais pour un référentiel avec plusieurs télécommandes et que je souhaite seulement en supprimer une, j'ajoute simplement une instruction select à la liste des télécommandes pour n'obtenir que les télécommandes que je veux.
la source
\/
au début de l'instruction de rejet pour laremote_branches
ligne. Est-ce une faute de frappe ou sert-elle un but?b.split(/\//)
ligne maintenantComment supprimer des branches fusionnées dans la console PowerShell
Si vous souhaitez exclure le maître ou tout autre nom de branche, vous pouvez diriger avec PowerShell Select-String comme ceci et transmettre le résultat à
git branch -d
:la source
* master
:)la réponse de kuboon a manqué la suppression des branches qui ont le mot maître dans le nom de la branche. Ce qui suit améliore sa réponse:
Bien sûr, cela ne supprime pas la branche "master" elle-même :)
la source
Il n'y a aucune commande dans Git qui le fera automatiquement pour vous. Mais vous pouvez écrire un script qui utilise les commandes Git pour vous donner ce dont vous avez besoin. Cela peut être fait de plusieurs manières selon le modèle de branchement que vous utilisez.
Si vous avez besoin de savoir si une branche a été fusionnée dans master, la commande suivante ne donnera aucune sortie si myTopicBranch a été fusionné (c'est-à-dire que vous pouvez la supprimer)
Vous pouvez utiliser la commande Git branch et analyser toutes les branches dans Bash et faire une
for
boucle sur toutes les branches. Dans cette boucle, vous vérifiez avec la commande ci-dessus si vous pouvez supprimer la branche ou non.la source
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
supprimera toutes les succursales locales à l'exception de la succursale en cours d'extraction et / oumaster
.Voici un article utile pour ceux qui cherchent à comprendre ces commandes: Git Clean: Supprimer les branches déjà fusionnées, par Steven Harman .
la source
Remarque : je ne suis pas satisfait des réponses précédentes (ne fonctionne pas sur tous les systèmes, ne fonctionne pas sur la télécommande, ne spécifie pas la branche --merged, ne filtre pas exactement). J'ajoute donc ma propre réponse.
Il existe deux cas principaux:
Local
Vous voulez supprimer des branches locales qui sont déjà fusionnées à une autre branche locale . Lors de la suppression, vous souhaitez conserver certaines branches importantes, comme master, develop, etc.
Remarques :
git branch output --format
".." consiste à supprimer les espaces blancs et à permettre une correspondance exacte avec grepgrep -E
est utilisé à la place deegrep
, donc il fonctionne également dans les systèmes sans egrep (ie: git pour windows).grep -E -v '^master$|^feature/develop$'
est de spécifier les branches locales que je ne veux pas supprimerxargs -n 1 git branch -d
: effectuer la suppression des branches locales (cela ne fonctionnera pas pour les branches distantes)Éloigné
Vous voulez supprimer des branches isolées qui sont déjà fusionnées à une autre branche à distance . Pendant la suppression, vous souhaitez conserver certaines branches importantes, comme HEAD, master, releases, etc.
Remarques :
-r
option et fournissons le nom complet de la branche :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
est de faire correspondre les branches distantes que nous ne voulons pas supprimer.cut -d/ -f2-
: supprime le préfixe «origine /» inutile qui autrement est imprimé par lagit branch
commande.xargs -n 1 git push --delete origin
: effectuer la suppression de branches distantes.la source
Si vous êtes sous Windows, vous pouvez utiliser Windows Powershell ou Powershell 7 avec Out-GridView pour avoir une belle liste de branches et sélectionner avec la souris celle que vous souhaitez supprimer:
après avoir cliqué sur OK, Powershell transmettra les noms de ces branches à la
git branch -d
commande et les supprimerala source
Vous pouvez utiliser l'
git-del-br
outil .Vous pouvez l' installer via l'
pip
aidePS: je suis l'auteur de l'outil. Toutes suggestions / commentaires sont les bienvenus.
la source
Si vous souhaitez supprimer toutes les branches locales qui sont déjà fusionnées dans la branche sur laquelle vous êtes actuellement, alors j'ai trouvé une commande sûre pour le faire, basée sur des réponses antérieures:
Cette commande n'affectera pas votre branche actuelle ou votre branche principale. Il vous indiquera également ce qu'il fait avant de le faire, en utilisant le drapeau -t de xargs.
la source
Version alias de la réponse mise à jour d' Adam :
Consultez également cette réponse pour obtenir des conseils pratiques sur l'échappement d'alias complexes.
la source
J'utilise un schéma de dénomination git-flow esque, donc cela fonctionne en toute sécurité pour moi:
Il recherche essentiellement les validations fusionnées qui commencent par une chaîne
fix/
oufeature/
.la source
Essayez la commande suivante:
En utilisant
git rev-parse
, vous obtiendrez le nom de la branche actuelle afin de l'exclure. Si vous obtenez l'erreur, cela signifie qu'il n'y a aucune branche locale à supprimer.Pour faire de même avec les branches distantes (changez
origin
avec votre nom de télécommande), essayez:Si vous avez plusieurs télécommandes, ajoutez-les
grep origin |
avantcut
pour filtrer uniquement lesorigin
.Si la commande ci-dessus échoue, essayez de supprimer d'abord les branches de suivi à distance fusionnées:
Puis
git fetch
à nouveau la télécommande et utilisez àgit push -vd
nouveau la commande précédente .Si vous l'utilisez souvent, envisagez d'ajouter des alias dans votre
~/.gitconfig
fichier.Si vous avez supprimé certaines branches par erreur, utilisez
git reflog
pour rechercher les commits perdus.la source
Sur la base de certaines de ces réponses, j'ai fait mon propre script Bash pour le faire aussi !
Il utilise
git branch --merged
etgit branch -d
pour supprimer les branches qui ont été fusionnées et vous invite à saisir chacune des branches avant de les supprimer.la source
La requête ci-dessous fonctionne pour moi
et cela filtrera n'importe quelle branche donnée dans le tube grep.
Fonctionne bien sur le clone http, mais pas si bien pour la connexion ssh.
la source
En date du 2018.07
Ajoutez ceci à la
[alias]
section de votre~/.gitconfig
:Maintenant, vous pouvez simplement appeler
git sweep
pour effectuer le nettoyage nécessaire.la source
Sous Windows avec git bash installé egrep -v ne fonctionnera pas
où
grep -E -v
est équivalent deegrep -v
Utilisez
-d
pour supprimer les branches déjà fusionnées ou-D
pour supprimer les branches non fusionnéesla source
J'ai utilisé la méthode suivante pour supprimer les branches locales ET distantes fusionnées dans un cmd.
J'ai les éléments suivants dans mon
bashrc
dossier:source d' origine
Cela ne supprime pas la branche principale, mais supprime les branches locales ET distantes fusionnées . Une fois que vous avez cela dans votre fichier rc, lancez simplement
rmb
, une liste des branches fusionnées qui seront nettoyées et une confirmation de l'action s'affiche. Vous pouvez modifier le code pour ne pas demander de confirmation également, mais il est probablement bon de le conserver.la source
Écrivez un script dans lequel Git vérifie toutes les branches qui ont été fusionnées en master.
Alors fais
git checkout master
.Enfin, supprimez les branches fusionnées.
la source
La solution acceptée est assez bonne, mais a le seul problème qu'elle supprime également les branches locales qui n'ont pas encore été fusionnées dans une télécommande.
Si vous regardez la sortie de vous verrez quelque chose comme
Les branches
bla
etissue_248
sont des branches locales qui seraient supprimées en silence.Mais vous pouvez également voir le mot
[gone]
, qui indique que les branches qui avaient été poussées vers une télécommande (qui a maintenant disparu) et indiquent ainsi que les branches peuvent être supprimées.La réponse originale peut ainsi être changée en (divisée en multiligne pour une longueur de ligne plus courte)
pour protéger les branches non encore fusionnées. De plus, il n'est pas nécessaire de demander au maître de le protéger, car il a une télécommande à l'origine et ne s'affiche pas comme disparu.
la source
Pour moi,
git branch --merged
ne montre pas les branches qui ont été fusionnées via GitHub PR. Je ne suis pas sûr des raisons, mais j'utilise la ligne suivante pour supprimer toutes les branches locales qui n'ont pas de branche de suivi à distance :Explication:
git branch --format "%(refname:short)"
donne une liste des succursales localesgit branch -r | grep -v HEAD | cut -d/ -f2-
donne une liste des branches distantes, filtrantHEAD
diff <(...) <(...)
donne un diff de sortie de deux commandes entre parenthèsesgrep '<'
filtre les branches qui existent dans la première liste, mais pas dans la secondecut -c 3-
donne une ligne à partir du 3ème caractère, supprimant ainsi le préfixe<
xargs git branch -D
s'exécutegit branch -D
contre chaque nom de brancheAlternativement, vous pouvez éviter
grep -v '<'
comme ceci:la source