Comment puis-je supprimer toutes les branches Git qui ont été fusionnées ?

J'ai de nombreuses branches Git. Comment puis-je supprimer les branches qui ont déjà été fusionnées ? Existe-t-il un moyen simple de les supprimer toutes au lieu de les supprimer une par une ?

Solution

UPDATE :

Vous pouvez ajouter d'autres branches à exclure comme master et dev si votre flux de travail les a comme ancêtre possible. En général, je me branche à partir d'une balise "sprint-start" et master, dev et qa ne sont pas des ancêtres.

D'abord, listez toutes les branches qui ont été fusionnées à distance.

git branch --merged

Vous pouvez voir quelques branches que vous ne voulez pas supprimer. Nous pouvons ajouter quelques arguments pour sauter des branches importantes que nous ne voulons pas supprimer comme master ou dev. La commande suivante va sauter la branche master et tout ce qui contient dev.

git branch --merged| egrep -v "(^\*|master|dev)"

Si vous voulez sauter, vous pouvez l'ajouter à la commande egrep comme suit. La branche skip_branch_name ne sera pas supprimée.

git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"

Pour supprimer toutes les branches locales qui sont déjà fusionnées dans la branche actuellement extraite :

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

Vous pouvez voir que master et dev sont exclues au cas où elles seraient un ancêtre.


Vous pouvez supprimer une branche locale fusionnée avec :

git branch -d branchname

Si elle n'est pas fusionnée, utilisez :

git branch -D branchname

Pour l'effacer de la télécommande dans les anciennes versions de Git, utilisez : {{92457}} :

git push origin :branchname

Dans les versions plus récentes de Git, utilisez :

git push --delete origin branchname

Une fois que vous avez supprimé la branche du distant, vous pouvez élaguer pour vous débarrasser des branches de suivi du distant avec :

git remote prune origin

ou élaguer des branches de suivi à distance individuelles, comme le suggère l'autre réponse, avec :

git branch -dr branchname

J'espère que cela vous aidera.

Commentaires (32)

J'utilise le script Ruby suivant pour supprimer mes branches locales et distantes déjà fusionnées. Si je le fais pour un dépôt avec plusieurs branches distantes et que je ne veux supprimer qu'une seule d'entre elles, j'ajoute simplement une instruction de sélection à la liste des branches distantes pour n'obtenir que celles que je veux.

#!/usr/bin/env ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
  if $?.exitstatus == 0
    puts "WARNING: You are on branch #{current_branch}, NOT master."
  else
    puts "WARNING: You are not on a branch"
  end
  puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
  split("\n").
  map(&:strip).
  reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
  gsub(/^\* /, '').
  split("\n").
  map(&:strip).
  reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
  puts "No existing branches have been merged into #{current_branch}."
else
  puts "This will remove the following branches:"
  puts remote_branches.join("\n")
  puts local_branches.join("\n")
  puts "Proceed?"
  if gets =~ /^y/i
    remote_branches.each do |b|
      remote, branch = b.split(/\//)
      `git push #{remote} :#{branch}`
    end

    # Remove local branches
    `git branch -d #{local_branches.join(' ')}`
  else
    puts "No branches removed."
  end
end
Commentaires (5)

Il n'y a pas de commande dans Git qui fasse cela pour vous automatiquement. Mais vous pouvez écrire un script qui utilise les commandes de Git pour vous donner ce dont vous avez besoin. Cela peut être fait de plusieurs façons, en fonction du 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 aucun résultat si myTopicBranch a été fusionnée (c'est-à-dire que vous pouvez la supprimer)

$ git rev-list master | grep $(git rev-parse myTopicBranch)

Vous pouvez utiliser la commande Git branch et analyser toutes les branches en Bash et faire une boucle for sur toutes les branches. Dans cette boucle, vous vérifiez avec la commande ci-dessus si vous pouvez supprimer la branche ou non.

Commentaires (0)