たくさんのGitブランチがあります。すでにマージされたブランチを削除するにはどうしたらいいですか?ひとつひとつ削除するのではなく、すべてを簡単に削除する方法はありませんか?
UPDATEです。
あなたのワークフローでmasterやdevが先祖になる可能性がある場合、他のブランチを追加して除外することができます。通常、私は「sprint-start」タグからブランチを作成し、master、dev、qaは祖先ではありません。
まず、リモートでマージされたすべてのブランチをリストアップします。
git branch --merged
削除したくないブランチがいくつかあるかもしれません。いくつかの引数を追加することで、masterやdevelopのような削除したくない重要なブランチをスキップすることができます。以下のコマンドは、masterブランチやdevが含まれているブランチをスキップします。
git branch --merged| egrep -v "(^\*|master|dev)"
スキップしたい場合は、以下のようにegrepコマンドに追加します。ブランチ skip_branch_name
は削除されません。
git branch --merged| egrep -v "(^\*|master|dev|skip_branch_name)"
現在チェックアウトしているブランチにすでにマージされているすべてのローカルブランチを削除するには、次のようにします。
git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d
masterとdevが先祖である場合に除外されていることがわかります。
マージされたローカルブランチを削除するには、次のようにします。
git branch -d branchname
マージされていない場合は、次のように使います。
git branch -D branchname
古いバージョンの Git でリモートから削除するには次のようにします。
git push origin :branchname
最近のバージョンのGitでは
git push --delete origin branchname
リモートからブランチを削除したら、次は prune でリモートのトラッキングブランチを削除します。
git remote prune origin
または、他の回答にあるように、個々のリモートトラッキングブランチを剪定するには、次のようにします。
git branch -dr branchname
お役に立てれば幸いです。
私は以下のRubyスクリプトを使って、すでにマージされたローカルブランチとリモートブランチを削除しています。複数のリモートがあるリポジトリで、1つのリモートだけを削除したい場合は、remoteリストにselect文を追加して、必要なリモートだけを取得するようにしています。
#!/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
これを自動的にやってくれるコマンドはGitにはありません。しかし、Git のコマンドを使って必要なものを得るためのスクリプトを書くことはできます。これは、どのような分岐モデルを使っているかによって様々な方法があります。
あるブランチが master にマージされたかどうかを知りたい場合は、次のコマンドを実行すると myTopicBranch がマージされていても何も出力されません (つまり、削除することができます)。
$ git rev-list master | grep $(git rev-parse myTopicBranch)
Git の branch コマンドを使ってすべてのブランチを Bash で解析し、すべてのブランチに対して for
ループを実行することもできます。このループの中で、上のコマンドでブランチを削除できるかどうかをチェックします。