マージされたすべてのGitブランチを削除するにはどうすればよいですか?


1935

私は多くのGitブランチを持っています。すでにマージされているブランチを削除するにはどうすればよいですか?1つずつ削除するのではなく、すべてを削除する簡単な方法はありますか?


46
少し具体的にgit branch -Dすると、マージされているかどうかに関係なく、ブランチが削除されます。
PhilT 2017

12
リポジトリの「ブランチ」セクションに移動すると、GitHubから直接これを行うこともできます(例:github.com/<username>/<repo_name>/branches)。すべてのブランチのリストがあり、選択したブランチを削除する側に赤いゴミ箱アイコンがあります。端末で行うよりもはるかに高速です!また、master各ブランチの前後の距離も表示されます。ただし、を実行すると、ローカルクライアントには古いブランチがリストされますgit branch -agit fetch --pruneそれらを削除するために使用します(この回答に従って)。
user5359531 2017

3
これをローカルまたはリモートで行うためのスクリプト-安全チェックと事前構成された「安全なブランチ」:github.com/fatso83/dotfiles/tree/master/utils/… git delete-merged --doit originまたはgit delete-merged --doit --local
オリゴフレン

このアプリを使用してマージされたブランチを自動削除することもできます。
Sebass van Boxel、2018

rm -fr work && git clone http://example.com/work.git長年にわたり、gitを使用してピクルスから抜け出す最も簡単な方法になりました。
Reactgular

回答:


3115

更新:

ワークフローに祖先の可能性があるものがある場合は、他のブランチを追加して、masterやdevなどを除外できます。通常、私は「sprint-start」タグから分岐し、master、dev、qaは祖先ではありません。

まず、リモートでマージされたすべてのブランチをリストします。

git branch --merged

削除したくないブランチがいくつか表示される場合があります。マスターや開発のように削除したくない重要なブランチをスキップするために、いくつかの引数を追加できます。次のコマンドは、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 push --delete origin branchname

git push origin :branchname    # for really old git

リモートからブランチを削除したら、次のコマンドを使用してリモートトラッキングブランチを取り除くことができます。

git remote prune origin

または、他の回答が示唆するように、個別のリモート追跡ブランチをプルーニングします。

git branch -dr branchname

お役に立てれば。


46
警告:ブランチを作成したばかりの場合は、そのブランチも削除されます。一番上のコマンドを実行する前に、リストに新しく作成されたブランチがないことを確認してください。
ゲイリーハラン

154
警告の反対:reflogはベーコンを保存します。心配しないでください。
Adam Dymitruk 2014

33
最初のコマンドはローカルブランチのみを削除するので、一部の人が指摘しているほど「危険」ではないことに注意してください。
ifightcrime

79
私はここで私は答えをググ次回それを見つけることができるとPowerShellの変種、:git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
vorou

23
fatal: branch name required削除する必要のあるブランチがない場合は、エラーが発生します。あなたが渡すことができることを避けるために-rxargsそれが実行されませんので、git branch -d標準入力が空の場合。(manページによると、これはGNU xargs拡張機能です)。
Marius Gedminas

457

既にマージされているリモートのすべてのブランチを削除するには:

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

より最近のバージョンのGit

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

更新(@oliverによる;コメントに収まらないため、すでに十分な回答です:ブランチABCにいる場合、ABCはの結果に表示されますgit branch -r --merged、ブランチが指定されていないため、、ブランチはデフォルトで現在のブランチとブランチになります常にそれ自体にマージされたと見なされます(ブランチとそれ自体の間に違いがないためです)。

したがって、ブランチを指定します。

git branch -r --merged master | grep -v master ...

または最初のチェックアウトマスター:

git checkout master | git branch -r --merged | grep -v ...

18
最善の答えです。ただのメモですが、私のmasterブランチは名前が付けられているdevので、変更する必要がありました
Dorian

41
他のリモートのブランチがオリジンにプッシュされるのを防ぐために、| grep origin後で追加する必要がありましたgrep -v mastergit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
L0LN1NJ4

9
developブランチも除外するように少し変更しました。git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin。これが私のエイリアスであることがわかりました。
サラト

8
これを私が読んだ最良の答えにしたのは、-r他のどこにも言及されていない議論です。地元の支店だけが家事をする価値があると当然のことと考えられています。しかし、リモコンもゴミでいっぱいです。
アスビョルンUlsberg

19
注意-ただ実現:これは明らかにマスターではなく現在のブランチにマージされたブランチを見つけるので、あなたがmyFeatureBranchそれにいる場合はワイプしorigin/myFeatureBranchます。たぶんgit checkout master最初にするのが最善です。
jakub.g 2016

190

アダムの答えを少し拡張するだけです:

実行して、これをGit構成に追加します。 git config -e --global

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

そして、単純なを行うことで、マージされたローカルブランチをすべて削除できますgit cleanup


11
最初のコマンドはいけません:git branch --merged master現在チェックアウトされているブランチではなく、マスターにマージされたものを確認したいので?
ジョーフィリップス

@JoePhilllipsメインブランチがマスターではなく一部の人々に代わりに、developまたはdevその場合、コマンドは失敗します。この場合、fatal: malformed object name汎用コマンドを使用する方が適切であり、実行する責任があります
16

1
@JoePhilllipsこの回答のポイントは、Adamの回答(この質問のトップ回答)を役立つgitエイリアスにまとめることです。Adamの答えにはあなたが提案しているものが含まれておらず、非常に多くの人々がそれを役にたつと思っているので、私は私のものを変えないようにしています。私はあなたがそれについて強く感じる場合は、アダムの答えに議論を開く推薦
real_ate

13
-rto xargsを追加すると、branch name requiredこのエイリアスを複数回実行する場合、または削除するブランチが残っていない場合に、不要なエラー()が発生しなくなります。:このような私のエイリアスルックスcleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
spezifanta

1
現在のコマンドは、マスターを除外してブランチを開発しません
Andriy F.

83

これは、マスター以外のすべてのマージされたブランチを削除するためにも機能します。

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

3
これで、それが含まmasterれているブランチは削除されません。grep -v ^master$真ん中を試してください。
wchargin 2013年

また、マスターでない| grep -v '^\*'場合は、現在のブランチを削除しない
svassr

5
ありがとうございます。これを使用する場合の注意点:には2つのスペースがあることに注意してくださいgrep -v '^ master$'。自分で入力して入力し忘れた場合、入力していなければ削除さmasterれます。
スタイガー2014年

3
@ Mr.Polywhirlあなたの編集はコマンドを壊し、あなたはそれを元に戻す必要があります。git branch現在チェックアウトされているブランチでない場合、2つのスペースが必要です。これは、各ブランチ名を新しい行に左に2つのスペースを付けてリストするためです。このコマンドを実行する誰もが、現在チェックアウトされているブランチでない限り、マスターブランチを削除することが基本的に保証されています。
スタイガー2015

79

これらのコマンドからmasterdevelopブランチを除外する必要があります。

ローカルgit clear:

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

リモートgit clear:

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

リモートブランチのローカルレジストリを同期します。

git fetch -p

3
リモートバージョンの場合も+1(ただし、リモート--pruneを使用しているため、必要性は低くなります)。古いgitバージョンでは動作しないことにも注意してください
malko

4
git config --global --add fetch.prune trueフェッチまたはプル時に自動的にプルーニングします。
T3rm1

1
覚えておいてください、プルーンはリモートクリアと同じではありません。リモートクリアは、現在のブランチと完全にマージされているリモートブランチを実際に削除します。Pruneは、すでに削除されているリモートブランチのローカルレジストリのみをクリーンアップします。
グイドブーマン2017年

以前にマージされたブランチはマージされたと見なされますが、マージ後にマージされなかった新しいコミットがあるため、単語は完全に少し誤解を招きます。
2017

1回の呼び出しですべての元のgit branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
リモート

48

Windowsを使用していて、PowerShellスクリプトを好む方のために、ローカルにマージされたブランチを削除するスクリプトを次に示します。

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

13
好奇心のために、これは次のように短縮できます git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
Iain Ballard

5
@IainBallardもちろん、エイリアスを使用することもできました。読みやすさを最大限にしたい場合はお勧めしません。github.com/darkoperator/PSStyleGuide/blob/master/English.md
Klas Mellbourn 2014年

1
承知しました。私はあなたの答えが非常に役に立ったと感じました:-)しかし、長い形式のPowerShell構文がブロックで何が行われているのかを邪魔することがあります。しかし、主に、私はあなたが一度だけコピー/ペーストしたりタイプしたりすることを提案していました。再度、感謝します。
Iain Ballard

4
:ここでは、Windows用のワンライナーはジャムマスターし、あなたの現在のブランチという殻をcmdをですfor /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B(ため息、シングルとダブルバッククォートを置き換えるには、私はバッククォートが含まれているリテラルをフォーマットするかどうかはわかりません)
ヨーヨー

42

私は何年もの間、アダムの答えを使いました。とは言っても、期待どおりに動作しない場合がいくつかあります。

  1. マスターブランチだけではなく、「マスター」という単語を含むブランチ(たとえば、「notmaster」や「masterful」)は無視されました。
  2. 「dev」という単語を含むブランチ、たとえば「dev-test」は、devブランチだけではなく無視されました
  3. 現在のブランチ(つまり、必ずしもマスターではない)のHEADから到達可能なブランチを削除する
  4. デタッチされたHEAD状態では、現在のコミットから到達可能なすべてのブランチを削除します

1と2は、正規表現を変更しただけで、簡単に対処できました。3は、必要なコンテキストに応じて異なります(つまり、マスターにマージされていない、または現在のブランチに対してマージされていないブランチのみを削除します)。4は、git reflogデタッチされたHEAD状態で意図せずにこれを実行した場合、(で回復可能ですが)悲惨な可能性があります。

最後に、これをすべて個別の(Bash | Ruby | Python)スクリプトを必要としないワンライナーにしたかったのです。

TL; DR

オプションの-fフラグを受け入れるgitエイリアス「sweep」を作成します。

git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'

そしてそれを呼び出す:

git sweep

または:

git sweep -f

長く詳細な答え

いくつかのブランチとコミットを使用して正しい動作をテストするサンプルgitリポジトリを作成するのが最も簡単でした。

単一のコミットで新しいgitリポジトリを作成する

mkdir sweep-test && cd sweep-test && git init
echo "hello" > hello
git add . && git commit -am "initial commit"

新しいブランチをいくつか作成します

git branch foo && git branch bar && git branch develop && git branch notmaster && git branch masterful
git branch --list
  bar
  develop
  foo
* master
  masterful
  notmaster

望ましい動作:マスター、開発、または現在を除くすべてのマージされたブランチを選択します

元の正規表現では、「マスターフル」と「ノットマスター」のブランチがありません。

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

更新された正規表現を使用すると(「dev」ではなく「develop」が除外されます):

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
bar
masterful
notmaster

ブランチfooに切り替え、新しいコミットを作成してから、fooに基づいて新しいブランチfoobarをチェックアウトします。

echo "foo" > foo
git add . && git commit -am "foo"
git checkout -b foobar
echo "foobar" > foobar
git add . && git commit -am "foobar"

私の現在のブランチはfoobarです。削除するブランチを一覧表示するために上記のコマンドを再実行すると、マスターにマージされていなくてもブランチ「foo」が含まれています。

git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  masterful
  notmaster

ただし、同じコマンドをマスターで実行すると、ブランチ「foo」が含まれません。

git checkout master && git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

これはgit branch --merged、特に指定されていない場合、デフォルトで現在のブランチのHEADに設定されているためです。少なくとも私のワークフローでは、マスターにマージされていない限り、ローカルブランチを削除したくないので、次のバリアントを使用します。

git checkout foobar
git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

切り離されたHEAD状態

のデフォルトの動作に依存すると、git branch --mergedデタッチされたHEAD状態にさらに重大な影響があります。

git checkout foobar
git checkout HEAD~0
git branch --merged | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  foo
  foobar
  masterful
  notmaster

これは、私がちょうどいたブランチである "foobar"と "foo"を削除していたでしょう。ただし、改訂されたコマンドでは、次のようになります。

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)"
  bar
  masterful
  notmaster

実際の削除を含む1行

git branch --merged $(git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d

すべてがgitエイリアス「sweep」にまとめられています。

git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] \
&& git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" \
| xargs git branch -d'

エイリアスはオプションの-fフラグを受け入れます。デフォルトの動作では、マスターにマージされたブランチのみが削除されますが、-fフラグは現在のブランチにマージされたブランチを削除します。

git sweep
Deleted branch bar (was 9a56952).
Deleted branch masterful (was 9a56952).
Deleted branch notmaster (was 9a56952).
git sweep -f
Deleted branch foo (was 2cea1ab).

関数を作成する必要があるのはなぜですか?git configアトミックではないですか?
VasiliNovikov

オプションの「-f」引数を処理するには(質問を正しく理解している場合)
eddies

1
しかし、それはどのように役立ちますか?表現の始まりを意味し!f(){ git branch ...ます。関数宣言ですよね?で直接始めませんgit branch ...か?
VasiliNovikov

1
あなたは絶対的に正しいです。それに応じて私の答えを編集しました。ポインタをありがとう!

以下はnon-force-modeと同じことをしませんか? git checkout master && git branch -d `git branch --merged` && git checkout - 削除することを除いてdevelop、より簡単な方法かもしれません。
グイドBouman


18

Gitバージョン2.5.0の使用:

git branch -d `git branch --merged`

16
これはmasterブランチを削除できます!
Wazery、2015年

4
本当です。オンになっていると確信している場合にのみ使用しmasterます。
drautb 2015年

11
git branch -d $(git branch --merged | grep -v master)
alexg 2018年

1
フローがある場合、これは危険です。マスター<-ステージ<-devがあると想像してください。まだ最も簡単なソリューションimo
Joseph Briggs

14

--mergedオプションにコミットを追加できます。このようにして、マージされるブランチのみを確実に削除できます。

次のコマンドは、マージされたブランチをオリジンから削除します。

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

git push origin --deleteをechoに置き換えて、どのブランチが削除されるかをテストできます

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

2
テストオプションが好き
iwein

12

次のRubyスクリプトを使用して、マージ済みのローカルブランチとリモートブランチを削除します。複数のリモートを持つリポジトリに対してそれを実行していて、1つだけから削除したい場合は、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ヘルパーライブラリのためにこの一口を盗んでもいいですか?github.com/yupiq/git-branch-util
ローガン

1
私はいくつかの方法でコードを再利用する人々気にならば、私はここでそれを入れているではないでしょう、それのために行く
mmrobins

@mmrobins 行の\/拒否ステートメントの先頭に追加がありremote_branchesます。それはタイプミスですか、それとも目的を果たしますか?
Jawwad 2016年

@mmrobins、ああ、私b.split(/\//)が今ラインを見るのを気にしない
Jawwad

基本的にこれを行いたいが、ルビではなくバニラバッシュを使用する場合:stackoverflow.com/a/37999948/430128
Raman

11

PowerShellコンソールでマージされたブランチを削除する方法

git branch --merged | %{git branch -d $_.Trim()}

マスターまたはその他のブランチ名を除外する場合は、次のようにPowerShell Select-Stringを使用してパイプし、結果をに渡すことができますgit branch -d

git branch -d $(git branch --merged | Select-String -NotMatch "master" | %{$_.ToString().Trim()})

1
より高い回答は、マスターまたは他のブランチをフィルタリングすることを提案しています。powershellでそれを行うことを探している人のために:git branch --merged | findstr / v "マスター" | %{gitブランチ-d $
_。trim

@tredzko良い点。FTRより高い答えは、stackoverflow.com /
questions / 6127328 /…

また、削除を試みます* master:)
iesen

9

kuboonの回答では、ブランチ名にmasterという単語が含まれるブランチを削除していません。以下は彼の答えを改善します:

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

もちろん、「マスター」ブランチ自体は削除しません:)


8

これを自動的に実行するコマンドはGitにはありません。ただし、Gitコマンドを使用して必要なものを提供するスクリプトを作成できます。これは、使用している分岐モデルに応じて、さまざまな方法で実行できます。

ブランチがマスターにマージされているかどうかを知る必要がある場合、myTopicBranchがマージされていると、次のコマンドでは何も出力されません(つまり、削除できます)。

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

Gitブランチコマンドを使用して、Bashのすべてのブランチを解析し、すべてのブランチでforループを実行できます。このループでは、ブランチを削除できるかどうかを上記のコマンドで確認します。



7

注意:私は以前の答えに満足していません(すべてのシステムで動作していない、リモートで動作していない、-mergedブランチを指定していない、正確にフィルタリングしていない)。だから、私は自分の答えを追加します。

主なケースは2つあります。

地元

すでに別のローカルブランチにマージされているローカルブランチ削除したい。削除中は、マスター、開発などの重要なブランチを保持したい場合があります。

git branch --format "%(refname:short)" --merged master | grep -E -v '^master$|^feature/develop$' | xargs -n 1 git branch -d

  • git branch output --format ".."は空白を取り除き、grepの完全一致を可能にする
  • grep -E代わりに が使用されるegrepため、egrepのないシステムでも機能します(つまり、Windowsのgit)。
  • grep -E -v '^master$|^feature/develop$' 削除したくないローカルブランチを指定することです
  • xargs -n 1 git branch -d:ローカルブランチの削除を実行します(リモートブランチでは機能しません)
  • もちろん、現在チェックアウトされているブランチを削除しようとすると、エラーが発生します。ですから、事前にマスターに切り替えることをお勧めします。

リモート

すでに別のリモートブランチにマージされているリモートブランチ削除したい。削除中は、HEAD、マスター、リリースなどのいくつかの重要なブランチを保持する必要があります。

git branch -r --format "%(refname:short)" --merged origin/master | grep -E -v '^*HEAD$|^*/master$|^*release' | cut -d/ -f2- | xargs -n 1 git push --delete origin

  • リモートの場合は、-rオプションを使用して完全なブランチ名を指定します。origin/master
  • grep -E -v '^*HEAD$|^*/master$|^*release' 削除したくないリモートブランチと一致させることです。
  • cut -d/ -f2-:不要な 'origin /'接頭辞を削除しgit branchます。そうしないと、コマンドによって出力されます。
  • xargs -n 1 git push --delete origin :リモートブランチの削除を実行します。

7

Windowsを使用している場合、Windows PowershellまたはPowershell 7とOut-GridViewを使用して、ブランチの一覧を作成し、削除するブランチをマウスで選択できます。

git branch --format "%(refname:short)" --merged  | Out-GridView -PassThru | % { git branch -d $_ }

ここに画像の説明を入力してください [OK]をクリックすると、Powershellはこのブランチ名をgit branch -dコマンドに渡し、それらを削除します ここに画像の説明を入力してください


6

git-del-br ツールを使用できます

git-del-br -a

pip使用してインストールできます

pip install git-del-br

PS:私はツールの作成者です。任意の提案/フィードバックは大歓迎です。


1
@ stackoverflow.com/users/100297/martijn-pieters:なぜこの回答が削除され、反対票が投じられたのですか?
tusharmakkar08

1
あなたの答えとツールは機能しません。私はそれに数時間を費やします。何もない。
SpoiledTechie.com 2017年

@ SpoiledTechie.com:どのような問題に正確に直面しているか教えていただけますか?定期的に使用しています。
tusharmakkar08

これをオフラインにしたい場合は、スクリーンショットを共有できますか?そのグーグルのメール事で甘やかされて育った技術。:)
SpoiledTechie.com 2017年

5

現在使用しているブランチにすでにマージされているすべてのローカルブランチを削除する場合は、以前の回答に基づいて、安全なコマンドを使用してこれを行います。

git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d

このコマンドは、現在のブランチまたはマスターブランチには影響しません。また、xargsの-tフラグを使用して、実行前に何を実行しているかを通知します。


5

Adamの更新された回答のエイリアスバージョン:

[alias]
    branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #"

また、複雑なエイリアスをエスケープするための便利なヒントについては、この回答を参照してください。


5

私はgit-flow esque命名スキームを使用しているため、これは非常に安全に機能します。

git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d

基本的に、string fix/またはで始まるマージされたコミットを探しますfeature/


4

次のコマンドを試してください。

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

を使用git rev-parseすると、現在のブランチ名を取得て除外できます。エラーが発生した場合、削除するローカルブランチがないことを意味します。

リモートブランチで同じことを行うには(originリモート名で変更)、次を試してください:

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

複数のリモコンがある場合は、grep origin |cutに追加してのみをフィルタリングしoriginます。

上記のコマンドが失敗した場合は、まずマージされたリモート追跡ブランチを削除してみてください。

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

次にgit fetch、もう一度リモートで、前のgit push -vdコマンドをもう一度使用します。

頻繁に使用する場合は、~/.gitconfigファイルにエイリアスとして追加することを検討してください。

誤って一部のブランチを削除した場合は、を使用git reflogして、失われたコミットを見つけます。


4

これらの回答のいくつかに基づいて、私も独自のBashスクリプトを作成しました

マージされたブランチを使用git branch --mergedgit branch -dて削除し、削除する前にブランチごとにプロンプ​​トを表示します。

merged_branches(){
  local current_branch=$(git rev-parse --abbrev-ref HEAD)
  for branch in $(git branch --merged | cut -c3-)
    do
      echo "Branch $branch is already merged into $current_branch."
      echo "Would you like to delete it? [Y]es/[N]o "
      read REPLY
      if [[ $REPLY =~ ^[Yy] ]]; then
        git branch -d $branch
      fi
  done
}

4

以下のクエリは私にとってはうまくいきます

for branch in  `git branch -r --merged | grep -v '\*\|master\|develop'|awk 'NR > 0 {print$1}'|awk '{gsub(/origin\//, "")}1'`;do git push origin --delete $branch; done

これにより、grepパイプの特定のブランチがフィルタリングされます。

httpクローンではうまく機能しますが、ssh接続ではそれほどうまくいきません。


4

2018.07現在

これを[alias]あなたのセクションに追加してください~/.gitconfig

sweep = !"f() { git branch --merged | egrep -v \"(^\\*|master|dev)\" || true | xargs git branch -d; }; f"

これで、呼び出しgit sweepて、必要なクリーンアップを実行できます。


私の場合、Git Sweepを呼び出すと、クリーンアップする必要があるブランチのみが一覧表示されますが、削除されません
Victor Moraes

4

git bashがインストールされているWindowsではegrep -vは機能しません

git branch --merged | grep -E -v "(master|test|dev)" | xargs git branch -d

どこgrep -E -vに相当しますegrep -v

使用-dすでに削除するマージされた枝をまたは -D削除するためにマージされていない枝を


egrep -vは私のために働きます。私はgitextensionsインストーラーからgitbashを使用しています
Joe Phillips

4

次の方法を使用して、マージされたローカルブランチとリモートブランチを1つのコマンドで削除しました

私のbashrcファイルには次のものが含まれています。

function rmb {
  current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
  if [ "$current_branch" != "master" ]; then
    echo "WARNING: You are on branch $current_branch, NOT master."
  fi
  echo "Fetching merged branches..."
  git remote prune origin
  remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
  local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
  if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
    echo "No existing branches have been merged into $current_branch."
  else
    echo "This will remove the following branches:"
    if [ -n "$remote_branches" ]; then
      echo "$remote_branches"
    fi
    if [ -n "$local_branches" ]; then
      echo "$local_branches"
    fi
    read -p "Continue? (y/n): " -n 1 choice
    echo
    if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
      # Remove remote branches
      git push origin `git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$" | sed 's/origin\//:/g' | tr -d '\n'`
      # Remove local branches
      git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'`
    else
      echo "No branches removed."
    fi
  fi
}

元のソース

これにより、マスターブランチは削除されませんが、マージされたローカルブランチとリモートブランチは削除されます。これをrcファイルに入れたら、実行するだけでrmb、クリーンアップされてアクションの確認を求められるマージされたブランチのリストが表示されます。確認を求めないようにコードを変更することもできますが、そのままにしておくことをお勧めします。


3

マスターにマージされたすべてのブランチをGitがチェックアウトするスクリプトを記述します。

その後、行いますgit checkout master

最後に、マージされたブランチを削除します。

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git checkout $branchnew
done

git checkout master

for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do
  branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///")
  echo branch-name: $branchnew
  git push origin --delete $branchnew
done

3

受け入れられたソリューションはかなり良いですが、まだリモートにマージされていないローカルブランチも削除するという問題があります。

あなたがあなたの出力を見ると次のようなものが表示されます

$ git branch --merged master -v
  api_doc                  3a05427 [gone] Start of describing the Java API
  bla                      52e080a Update wording.
  branch-1.0               32f1a72 [maven-release-plugin] prepare release 1.0.1
  initial_proposal         6e59fb0 [gone] Original proposal, converted to AsciiDoc.
  issue_248                be2ba3c Skip unit-for-type checking. This needs more work. (#254)
  master                   be2ba3c Skip unit-for-type checking. This needs more work. (#254)

ブランチblaissue_248は、サイレントに削除されるローカルブランチです。

しかし、あなたはまた、単語を見ることができます [gone]、リモートにプッシュされたブランチ(現在は存在しない)を示し、ブランチを削除できることを示すも表示されます。

したがって、元の答えは(行の長さを短くするために複数行に分割)に変更できます。

git branch --merged master -v | \
     grep  "\\[gone\\]" | \
     sed -e 's/^..//' -e 's/\S* .*//' | \
      xargs git branch -d

まだマージされていないブランチを保護するため。また、マスターにそれを保護するためのgreppingは必要ありません。これは、原点にリモートがあり、なくなったように表示されないためです。


3

私にgit branch --mergedは、GitHub PRを介してマージされたブランチは表示されません。理由はわかりませんが、次の行を使用して、リモートトラッキングブランチがないローカルブランチをすべて削除します

diff <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | grep '<' | cut -c 3- | xargs git branch -D

説明:

  • git branch --format "%(refname:short)" ローカルブランチのリストを与える
  • git branch -r | grep -v HEAD | cut -d/ -f2- リモートブランチのリストを与え、フィルターで除外します HEAD
  • diff <(...) <(...) 括弧内の2つのコマンドの出力の差分を与える
  • grep '<' 最初のリストには存在するが2番目のリストには存在しないブランチをフィルタリングします
  • cut -c 3- 3番目の文字から始まる行を与えるため、接頭辞を削除します <
  • xargs git branch -Dgit branch -D各ブランチ名に対して実行します

または、次のgrep -v '<'ように回避することもできます。

diff --old-line-format="%L" --new-line-format="" --unchanged-line-format="" <(git branch --format "%(refname:short)") <(git branch -r | grep -v HEAD | cut -d/ -f2-) | xargs git branch -D
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.