Ik heb veel Git branches. Hoe verwijder ik branches die al gemerged zijn? Is er een makkelijke manier om ze allemaal te verwijderen in plaats van ze één voor één te verwijderen?
UPDATE:
Je kunt andere branches uitsluiten zoals master en dev als je workflow die als mogelijke voorouder heeft. Meestal branch ik van een "sprint-start" tag en master, dev en qa zijn geen voorouders.
Maak eerst een lijst van alle branches die op afstand zijn samengevoegd.
git branch --merged
Je ziet misschien een paar branches die je niet wilt verwijderen. We kunnen een paar argumenten toevoegen om belangrijke branches over te slaan die we niet willen verwijderen, zoals master of een develop. Het volgende commando zal de master branch overslaan en alles waar dev in zit.
git branch --merged| egrep -v "(^\*|master|dev)"
Als je wilt overslaan, kun je het toevoegen aan het egrep commando zoals het volgende. De branch skip_branch_name
zal niet verwijderd worden.
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
Om alle lokale branches te verwijderen die al samengevoegd zijn in de huidige uitgecheckte branch:
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
Je kunt zien dat master en dev zijn uitgesloten in het geval dat ze een voorouder zijn.
Je kunt een samengevoegde lokale branch verwijderen met:
git branch -d branchname
Als het niet samengevoegd is, gebruik dan:
git branch -D branchname
Om het van de remote te verwijderen in oude versies van Git gebruik je:
git push origin :branchname
In meer recente versies van Git gebruik je:
git push --delete origin branchname
Als je eenmaal de branch van de remote hebt verwijderd, kun je snoeien om van remote tracking branches af te komen met:
git remote prune origin
of individuele remote tracking takken snoeien, zoals het andere antwoord suggereert, met:
git branch -dr branchname
Hoop dat dit helpt.
Ik gebruik het volgende Ruby script om mijn reeds samengevoegde lokale en remote branches te verwijderen. Als ik het doe voor een repository met meerdere remotes en slechts van één wil verwijderen, voeg ik gewoon een select statement toe aan de remotes lijst om alleen de remotes te krijgen die ik wil.
#!/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
Er is geen commando in Git dat dit automatisch voor je zal doen. Maar je kunt een script schrijven dat Git commando's gebruikt om je te geven wat je nodig hebt. Dit kan op vele manieren gedaan worden, afhankelijk van welk branching model je gebruikt.
Als je wilt weten of een branch in master is samengevoegd, dan zal het volgende commando geen output geven als mijnTopicBranch is samengevoegd (i.e. je kunt het verwijderen)
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Je zou het Git branch commando kunnen gebruiken en alle branches in Bash uitpluizen en een for
lus over alle branches doen. In deze lus controleer je met bovenstaand commando of je de branch kunt verwijderen of niet.