Comment puis-je supprimer toutes les branches Git qui ont été fusionnées?
J'ai beaucoup de branches Git. Comment puis-je supprimer les branches qui ont déjà été fusionnées? Est-il un moyen facile de supprimer tous au lieu de les supprimer un par un?
- git branch-D supprime les branches qui n'ont PAS été fusionnés! À utiliser avec précaution!
- Pour être un peu plus spécifique
git branch -D
supprime la branche qu'il a été fusionnées ou non. - Vous pouvez également le faire directement à partir de GitHub, si vous allez à 'les branches' de votre repo (par exemple, github.com/<nom d'utilisateur>/<repo_name>/branches). Il devrait y avoir une liste de toutes les branches, avec un rouge icône de corbeille sur le côté qui permet de supprimer la branche sélectionnée. Beaucoup plus rapide que de le faire dans le terminal! Permettra également de montrer comment, loin devant/derrière
master
chaque branche est. Cependant, votre client aura toujours la liste les vieilles branches si vous exécutezgit branch -a
; utilisationgit fetch --prune
les supprimer (comme par cette réponse ). - Script pour le faire localement ou à distance avec les contrôles de sécurité et pré-configuré sûr "succursales": github.com/fatso83/dotfiles/tree/master/utils/...
git delete-merged --doit origin
ougit delete-merged --doit --local
- Vous pouvez également utiliser cette application de suppression automatique fusionné les branches.
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR:
Vous pouvez ajouter d'autres branches d'exclure comme maître et dev si votre flux de travail a ceux comme un possible ancêtre. Habituellement, je branche en dehors d'un "sprint-start" et la balise de maître, de développement et d'assurance qualité ne sont pas les ancêtres.
D'abord, la liste de toutes les branches qui ont été fusionnées dans la distance.
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 maître ou à développer. La commande suivante permet de sauter la branche master et tout ce qui est dev en elle.
Si vous voulez sauter, vous pouvez l'ajouter à la commande egrep comme suit. La direction de la
skip_branch_name
ne seront pas supprimés.Pour supprimer toutes les branches locales qui sont déjà fusionné dans l'extrait de la direction de la
Vous pouvez voir que le maître et les dev sont exclus dans le cas où ils sont un ancêtre.
Vous pouvez supprimer une fusion de la branche locale avec:
Si ce n'est pas fusionné, utilisez:
Pour le supprimer de la distance dans les anciennes versions de Git utilisation:
Dans les versions plus récentes de Git utilisation:
Une fois que vous supprimez la branche à partir de la télécommande, vous pouvez le tailler pour se débarrasser de suivi à distance des branches avec:
ou d'élaguer individuelle de suivi à distance des branches, comme l'autre réponse suggère, avec:
Espère que cette aide.
git branch --merged | grep -v "\*" | xargs -n 1 git push --delete origin
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
git checkout master origin/master
à un moment plus tard.git branch --merged | grep -E -v "\*|master" | xargs -n 1 git branch -d
FTWmaster@{1}
oumaster@{yesterday noon}
--no-color
si vous utilisez la couleur par défaut. Exemple:git branch --merged develop --no-color | cat | grep -v "\* develop" | xargs -n 1 git branch -d
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
si vous n'avez pas de branches qui devrait être supprimé. Pour éviter que vous pouvez passer-r
àxargs
afin de ne pas courirgit branch -d
si le stdin est vide. (Cette GNU xargs extension, selon la page de man).git branch -r --merged | %{$_.trim()} | ?{$_ -match '/bug/' -or $_ -match '/feature/'} | %{$_ -replace 'origin/',''} | %{git push --delete origin $_}
alias
à mon~/.profile
! Très utile réponse!clean-branches = !git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
ne fonctionne pas pour moi (mauvaise config erreur de fichier)git branch --merged | egrep -v "(^\*|master|dev)" | xargs -I % echo 'git branch -d % ; git push --delete freephile % ;'
À l'aide de echo vous permet de regarder avant de sauter. % est la chaîne de caractères de remplacement dans xargs. Changement de l'écho " à "sh -c" pour l'exécuter. N'en local et à distance des pruneaux.git branch --merged
sans autres arguments montrera toutes les branches qui sont regroupées dans le courant de checkedout branche. Vous devriez toujours utiliser quelque chose commegit branch --merged origin/master
git push origin --delete $(git branch -r --merged origin/master | grep origin | egrep -v '>|master|develop' | cut -d/ -f2-)
ui = never
en vertu de la[color]
section dans .gitconfig--no-color
interrupteur avant de--merged
:git branch --no-color --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
git branch --merged | egrep -v "(^\*|master)$"
.egrep -v "^(\* .*| *master| *dev)$"
git log upstream...currentBranch --cherry-pick --right-only
ne retourne rienbash git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Mais j'en avais marre de l'exécuter à chaque fois que j'ai donc ajouté un alias dans mon .bash_profile. J'ai un article sur la façon de le faire icigit branch -r --merged | egrep -v "(^\*|master|dev)" | sed 's/origin\//:/' | xargs -n 1 git push origin
- avertissement: Mon bash compétences ne sont pas de grands, afin de vérifier que vous êtes heureux avec ce que cela fait, avant de l'exécuter. Cherché à travailler pour moi.Pour supprimer toutes les branches de la télécommande qui sont déjà fusionné:
Dans les versions plus récentes de Git
dev
j'ai donc dû changer| grep origin
aprèsgrep -v master
pour éviter de pousser les branches de autres télécommandes d'origine. Très recommander test de la sortie à l'avance, à l'aide degit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
de la branche de bien.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, je n'en ai pas vu mentionné nulle part ailleurs. Il est pris pour acquis que seuls les branches locales sont la peine de le faire certains de ménage sur. Mais les télécommandes sont pleines de déchets aussi.| grep origin
vous pouvez également ajouter--no-verify
à la fin de sauter git pré-placer le crochetmyFeatureBranch
elle va effacerorigin/myFeatureBranch
. Probablement, il est préférable degit checkout master
premier.grep -v '^ master$'
), mais qui comporte toujours le véritable maître de la branche quand je l'ai essayer.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
AVERTISSEMENT: Cette commande va supprimer et fermer ouvert pull requests.Juste s'étendant Adam répondre un peu:
Ajouter à votre configuration Git en cours d'exécution
git config -e --global
Et puis vous pouvez supprimer tous les locaux fusionné les branches faisant un simple
git cleanup
.git branch --merged master
puisque vous voulez regarder ce qui a été fusionnés en maître, pas sorti de la branche?develop
oudev
et dans ce cas, la commande échouera avecfatal: malformed object name
c'est mieux d'avoir un générique de commande et vous avez la responsabilité de l'exécutermaster
-r
àxargs
permettra d'éviter des erreurs inutiles (branch name required
) lors de l'exécution de cet alias plusieurs fois ou quand il n'y a pas de branche gauche d'être supprimé. Mon alias ressemble à ceci:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
nuke = "!sh -c \"git branch --merged master | grep -v -P '\\*|master' | xargs -n1 -r git branch -D\""
Pour les utilisateurs de windows, c'est ce qui fini par finalement de travail pour moi: Merci @spezifanta pour m'avoir fait presque tout le chemin là.Cela fonctionne aussi pour supprimer tous fusionné les branches à l'exception de master.
master
en elle. Essayezgrep -v ^master$
pour le milieu.| grep -v '^\*'
pour éviter deletting actuelles de la direction générale si vous êtes à la pas sur mastergrep -v '^ master$'
. Si vous entrez en vous-même et en manquez une, vous allez supprimermaster
si vous n'êtes pas sur elle.git branch
fera une liste de chaque nom de la branche sur une nouvelle ligne, avec deux espaces vers la gauche si elle n'est pas sorti de la branche. Vous avez essentiellement assuré que toute personne qui exécute cette commande va supprimer leur branche master, sauf si c'est l'extrait de la branche.Vous voulez exclure les
master
&develop
branches de ces commandes.Git Local clair:
Distant git clair:
De synchronisation de registre local des branches distantes:
git config --global --add fetch.prune true
de tailler automatiquement sur extraire ou de tirer.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 sur Windows et préfèrent des scripts PowerShell, en voici un qui supprime local fusionné branches:
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, remplacer double-backquotes avec un seul, je ne suis pas sûr de savoir comment formater un littéral qui contient des backquotes)J'ai utilisé Adam de réponse depuis plusieurs années maintenant. Cela dit, qu'il y a certains cas où il n'était pas de se comporter comme je m'y attendais:
1 & 2 ont été faciles à gérer, avec juste un changement de l'expression rationnelle.
3 dépend du contexte de ce que vous voulez (c'est à dire seulement supprimer les branches qui n'ont pas été fusionnés en master ou contre votre branche courante).
4 a le potentiel d'être catastrophique (même si recouvrable avec
git reflog
), si vous involontairement couru ce dans décollement de la TÊTE de l'état.Enfin, je voulais que ce à tous dans un one-liner qui n'a pas besoin d'un (Bash|Ruby|Python) script.
TL;DR
Créer un alias git "balayage" qui accepte une option
-f
drapeau:et à l'appeler avec:
ou:
La longue réponse détaillée
Il était plus facile pour moi de créer un exemple de repo git avec quelques branches et s'engage à tester le comportement correct:
Créer un nouveau repo git avec un seul commit
Créer de nouvelles branches
Comportement souhaité: sélectionnez tous fusionné les branches à l'exception de: maître, de développer ou d' actuel
L'original regex manque les branches "magistral" et "notmaster" :
Avec la mise à jour de regex (ce qui exclut désormais les "développer" plutôt que de "dev"):
Passer à la branche foo, faire un nouveau commit, puis commander une nouvelle branche, foobar, basé sur foo:
Ma branche courante est foobar, et si je ré-exécuter la commande ci-dessus pour la liste des branches, je veux supprimer, la branche "foo" est inclus, même s'il n'a pas été fusionnés en master:
Cependant, si je lance la même commande sur le master, la branche "toto" n'est pas inclus:
Et c'est tout simplement parce
git branch --merged
par défaut à la TÊTE de la branche courante, sauf indication contraire. Au moins pour moi, je ne veux pas supprimer les branches locales, sauf s'ils ont été fusionnés à maîtriser, donc je préfère la variante suivante:Détaché de la TÊTE de l'état
En s'appuyant sur le comportement par défaut de
git branch --merged
a même plus des conséquences importantes dans décollement de la TÊTE de l'état:Cela aurait supprimé la branche, j'étais juste sur, "foobar" avec "toto", qui est presque certainement pas le résultat souhaité.
Avec la version révisée de notre commande, cependant:
Une ligne, y compris la suppression réelle
Tout enveloppé dans un git alias "balayage":
L'alias accepte une option
-f
drapeau. Le comportement par défaut est de seulement supprimer les branches qui ont été fusionnées en maître, mais le-f
drapeau de supprimer les branches qui ont été fusionnées dans la branche courante.git config
atomique?!f(){ git branch ...
. C'est une déclaration de fonction, droite? Pourquoi ne pas commencer directement avecgit branch ...
?Git De Balayage fait un excellent travail de ce.
À l'aide de Git version 2.5.0:
master
branche btw!master
.git branch -d $(git branch --merged | grep -v master)
Vous pouvez ajouter la validation de l' --fusionné option.
De cette façon, vous pouvez assurez-vous seulement de supprimer les branches qui sont fusionnés en savoir l'origine et de la maîtrise
Commande suivante supprime fusionné les branches de votre origine.
Vous pouvez tester les branches qui seront retirés de remplacer le git push origin --delete avec echo
J'utilise la suite Ruby script pour supprimer mon déjà fusionné local et à distance des branches. Si je fais ça pour un espace de stockage avec plusieurs télécommandes et ne souhaitez supprimer à partir de l'un, je viens d'ajouter une instruction select pour les télécommandes de la liste pour obtenir uniquement les télécommandes que je veux.
\/
au début de la rejeter un énoncé pour leremote_branches
ligne. C'est qu'une faute de frappe ou a-t-elle un but?b.split(/\//)
ligne maintenantComment supprimer fusionné les branches dans la console PowerShell
Si vous souhaitez exclure maître ou de toute autre branche de noms, vous pouvez pipe avec PowerShell Select-String comme ça, et de transmettre le résultat à
git branch -d
:* master
🙂kuboon la réponse de manquer de supprimer les branches qui ont le mot de maître dans le nom de la branche.
La suite s'améliore sur sa réponse:
Bien sûr, il ne supprime pas le "maître" de la branche elle-même 🙂
Il n'y a pas de commande Git qui le fera pour vous automatiquement. 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 façons selon ce ramification modèle que vous utilisez.
Si vous avez besoin de savoir si une branche a été fusionnés en maître la commande suivante donnera pas de sortie si myTopicBranch a été fusionné (c'est à dire que vous pouvez le supprimer)
Vous pouvez utiliser la commande Git branch et d'analyser toutes les branches de Bash et de faire un
for
en boucle sur toutes les branches. Dans cette boucle, vous vérifiez avec la commande ci-dessus, si vous pouvez supprimer la branche ou pas.git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
va supprimer toutes les branches, sauf le courant extrait de la branche et/oumaster
.Voici un article utile pour ceux qui cherchent à comprendre ces commandes: Git Clean: Supprime Déjà Fusionné les Branches, par Steven Harman.
Vous pouvez utiliser
git-del-br
outil.Vous pouvez l'installer via
pip
à l'aide deP. S: je suis l'auteur de l'outil. Toutes les suggestions/commentaires sont les bienvenus.
Alias version de Adam de la mise à jour de réponse:
Aussi, voir cette réponse pour des conseils pratiques sur la fuite des complexes alias.
Si vous souhaitez supprimer toutes les branches locales qui sont déjà regroupées dans la branche que vous êtes actuellement sur, alors je suis venu avec une commande sûre de le faire, basé sur les réponses précédentes:
Cette commande ne sera pas affecter votre direction ou votre branche master. Il vous dira aussi ce qu'il fait avant elle le fait, à l'aide de l'option-t de xargs.
Essayez la commande suivante:
En utilisant
git rev-parse
obtiendrez l'actuel nom de la branche afin de les exclure. Si vous avez l'erreur, cela signifie qu'il y a pas de branches à supprimer.À faire de même avec les branches distantes (changement
origin
avec votre nom à distance), essayez:Dans le cas ou vous avez plusieurs télécommandes, ajouter
grep origin |
avantcut
pour filtrer uniquement lesorigin
.Si la commande échoue, essayez de supprimer la fusion de distance de suivi des rameaux d'abord:
Puis
git fetch
de la télécommande et utilisez les précédentesgit push -vd
commande de nouveau.Si vous l'utilisez souvent, envisager l'ajout d'un alias dans votre
~/.gitconfig
fichier.Dans le cas où vous avez supprimé certaines branches par erreur, utilisez
git reflog
à trouver le lost s'engage.Basée sur certaines de ces réponses j'ai fait mon propre script Bash pour le faire aussi!
Il utilise
git branch --merged
etgit branch -d
à supprimer les branches qui ont été fusionnées et vous invite, pour chacune des branches avant de les supprimer.- Je utiliser un git-flow esque schéma d'affectation de noms, de sorte que cela fonctionne très sûre pour moi:
Il semble fondamentalement de fusion s'engage à ce que commencent avec une chaîne de
fix/
oufeature/
.Ci-dessous requête fonctionne pour moi
et cela permettra de filtrer une branche donnée dans le grep pipe.
Fonctionne bien sur http clone, mais pas pour la connexion ssh.
Écrire un script dans lequel Git vérifie toutes les branches qui ont été fusionnées à maîtriser.
Puis faire
git checkout master
.Enfin, supprimer la fusion de branches.
De 2018.07
Ajouter à
[alias]
section de votre~/.gitconfig
:Maintenant, vous pouvez simplement appeler
git sweep
à effectuer que de besoin de nettoyage.Sur Windows avec git bash installé egrep -v ne fonctionnera pas
où
grep -E -v
est l'équivalent deegrep -v
Utilisation
-d
pour supprimer déjà fusionné branches ou-D
pour supprimer dissociées branchesLa solution retenue est assez bon, mais il a un problème qu'elle supprime également les sections locales qui n'ont pas encore fusionné en une télécommande.
Si vous chercher à la sortie de l', vous verrez quelque chose comme
Branches
bla
etissue_248
sont des branches locales qui seraient supprimés silencieusement.Mais vous pouvez également voir le mot
[gone]
, qui indiquent les branches qui avait été poussé à distance (qui est aujourd'hui disparu) et donc de désigner les branches peuvent être supprimés.L'original de la réponse peut donc être modifié pour (divisé en plusieurs lignes pour shorter la longueur de la ligne)
pour protéger la pas encore fusionné les branches.
Aussi la grepping de maître pour le protéger, n'est pas nécessaire, que cela a une distance à l'origine et à ne pas apparaître comme disparu.
Pour éviter accidentellement l'exécution de la commande à partir de n'importe quelle autre branche de master que j'ai utiliser le script bash suivant. Sinon, l'exécution de
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
à partir d'une branche qui a été fusionnée de master pourrait supprimer la branche master.(Divisée en plusieurs lignes pour des raisons de lisibilité)
Appelant "git de nettoyage" va supprimer les branches locales qui ont déjà été fusionnées dans origin/master. Il saute maître, la mise en scène, et dev parce que nous ne voulons pas de supprimer ceux qui dans des circonstances normales.
Faire, c'est ce qu'il fait:
git config --global alias.cleanup
!
au début de la commande est de dire que nous allons être en utilisant des commandes git dans le cadre de cet alias, donc nous avons besoin pour exécuter des commandes bash icigit branch --merged origin/master
origin/master
egrep -v "(^\*|master|staging|dev)"
xargs git branch -d
git branch -d xxxxx
de commande pour chacun des désinstallé branches. Cela supprime les branches locales, un par un.Pour Windows, vous pouvez installer Cygwin et supprimer toutes les branches distantes à l'aide de la commande suivante:
À supprimer les branches locales qui ont été fusionnées à la branche master, je suis à l'aide de l'alias (
git config -e --global
):Je suis en utilisant
git branch -D
pour évitererror: The branch 'some-branch' is not fully merged.
messages alors que ma caisse est différente de la branche master.Windoze-friendly script Python (parce que
git-sweep
étouffé sur Wesnoth référentiel):https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc
Si vous utilisez les branches comme HubFlow ou GitFlow vous pouvez utiliser cette commande pour supprimer la fusion de branches:
git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d
Si vous souhaitez supprimer des branches locales qui ont été fusionnées ainsi que de supprimer leurs télécommandes voici le one-liner que je préfère:
Disons que j'ai une télécommande nommé en amont et une origine (GitHub style, ma fourche d'origine, en amont est en amont).
Je ne veux pas supprimer TOUTES les maîtres, de la TÊTE, ou quoi que ce soit à partir de l'amont. Aussi, je ne veux pas supprimer la développer de la branche qui est notre branche nous créer PRs de.
La liste de toutes les branches distantes, filtrée par ceux qui ont été fusionnées:
Supprimer des lignes de la liste qui contiennent des mots que je connais sont dans les noms de branche je ne veux pas supprimer:
Supprimer le nom distant à partir du nom de la référence (origine/somebranch devient somebranch):
Utilisation xargs pour appeler un one-liner:
Tube tous ensemble, vous obtenez:
Cela va me laisser avec seulement quelques branches que j'ai travaillé, mais n'ont pas fusionné. Vous pouvez ensuite les supprimer un par un, comme il ne devrait pas être trop nombreux.
Trouver des branches que vous ne voulez plus:
Disons que vous avez trouvé branch1, (sesc) 2, et branch3 que vous souhaitez supprimer:
Mon script Bash contribution est basé lâchement sur mmrobin réponse.
Il prend quelques paramètres utiles spécification inclut et exclut, ou de les consulter/supprimer seulement local ou distant branches au lieu de deux.
J'ai été en utilisant la méthode suivante pour supprimer fusionné local ET à distance branches dans un cmd.
J'ai la suite dans ma
bashrc
fichier:original source
Ce n'est pas de supprimer la branche master, mais supprime fusionné local ET à distance branches. Une fois que vous avez ce dans vous fichier rc, il suffit d'exécuter
rmb
, vous êtes montré une perte de fusion des branches qui doit être nettoyé et a demandé pour la confirmation de l'action. Vous pouvez modifier le code pour ne pas demander de confirmation, mais c'est probablement une bonne chose pour le garder dans le.Si vous êtes sur Windows, vous pouvez utiliser Windows Powershell avec Hors-GridView (malheureusement, il est parti en Powershell de Base pour l'instant) d'avoir une belle liste de branches et sélectionnez avec la souris la partie que vous voulez supprimer:
après avoir cliqué sur OK Powershell va passer cet branches noms de
git branch -d
de commande et supprimergit-delete-merged-branches
degit-extras
repo.https://github.com/tj/git-extras/blob/master/Commands.md#git-delete-merged-branches