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


J'ai beaucoup de branches Git. Comment supprimer des branches qui ont déjà été fusionnées? Y at-il un moyen facile de les supprimer tous au lieu de les supprimer un par un?


1312
2018-05-25 15:54


origine


Réponses:


METTRE À JOUR:

Vous pouvez ajouter d'autres branches à exclure comme maître et dev si votre flux de travail les a comme ancêtre possible. Habituellement, je bifurque d'une balise "sprint-start" et master, dev et qa ne sont pas des ancêtres.

Pour supprimer toutes les branches locales déjà fusionnées dans la branche actuellement retirée:

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

Vous pouvez voir que master et dev sont exclus dans le cas où ils sont un ancêtre.


Vous pouvez supprimer une branche locale fusionnée avec:

git branch -d branchname

Si ce n'est pas fusionné, utilisez:

git branch -D branchname

Pour le supprimer de la télécommande dans les anciennes versions de Git, utilisez:

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 de la télécommande, éliminez les branches de suivi à distance avec:

git remote prune origin

ou élaguer des branches individuelles de suivi à distance, comme l'indique l'autre réponse, avec:

git branch -dr branchname

J'espère que cela t'aides.


2226
2018-05-25 16:40



Pour supprimer toutes les branches distantes déjà fusionnées:

git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin

Dans les versions plus récentes de Git

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

316
2017-08-09 08:45



Simplement étendre la réponse d'Adam un peu:

Ajoutez ceci à votre configuration de Git en courant git config -e --global

[alias]
    cleanup = "!git branch --merged | grep  -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"

Et puis vous pouvez supprimer toutes les branches fusionnées locales en faisant un simple git cleanup.


135
2018-02-18 15:08



Cela fonctionne également pour supprimer toutes les branches fusionnées sauf master.

git branch --merged | grep -v '^* master$' | grep -v '^  master$' | xargs git branch -d

72
2018-02-07 01:06



Vous voulez exclure le master & develop branches de ces commandes.

Git clair:

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

Git clair à distance:

git branch -r --merged | grep -v '\*\|master\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin

Synchroniser le registre local des branches distantes:

git fetch -p

57
2017-07-03 16:18



Pour ceux d'entre vous qui utilisent Windows et préfèrent les scripts PowerShell, voici un exemple qui supprime les branches fusionnées locales:

function Remove-MergedBranches
{
  git branch --merged |
    ForEach-Object { $_.Trim() } |
    Where-Object {$_ -NotMatch "^\*"} |
    Where-Object {-not ( $_ -Like "*master" )} |
    ForEach-Object { git branch -d $_ }
}

32
2018-06-10 14:00



Git Sweep fait un excellent travail de ceci.


19
2018-02-04 13:53



Vous pouvez ajouter la validation à l'option --merged. De cette façon, vous pouvez vous assurer seulement de supprimer les branches qui sont fusionnées en l'origine / maître

La commande suivante supprimera les branches fusionnées de votre origine.

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

Vous pouvez tester quelles branches seront supprimées en remplaçant l'origine git push - supprimer avec écho

git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo

13
2017-07-08 06:28



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 télécommandes et que je veux seulement en supprimer un, j'ajoute simplement une instruction select à la liste des télécommandes pour n'obtenir que les télécommandes 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

11
2017-09-27 23:41



En utilisant Git version 2.5.0:

git branch -d `git branch --merged`

11
2017-09-14 16:20