Gitの1つのコマンドで複数のブランチを削除できますか?


355

例えば:私は古い枝のトンを持っている私のローカルリポジトリ、クリーンアップしたいのですが3.23.2.13.2.2、など

私は一度にたくさんのそれらを取り除く卑劣な方法を望んでいました。彼らは主にドットリリースの慣例に従っているので、私は多分言うべき近道があると思いました:

git branch -D 3.2.*

すべての3.2.xブランチを終了します。

私はそのコマンドを試しましたが、もちろん機能しませんでした。


11
git branch -D $(git branch | grep 3.2*)-これでうまくいきました。名前が「3.2」で始まるブランチを削除します。grep-(git branchこの場合は)出力のパターンマッチング。$()-結果を実行して配置することを意味します。|-連鎖。
Eduard

4
わからない、つまり強制削除であることに注意する価値があるの-Dは、ほとんどの場合、最初に安全であるためです。-d
redfox05

回答:


363

その構文ではありません。しかし、あなたはこのようにそれを行うことができます:

git branch -D 3.2 3.2.1 3.2.2

基本的に、gitブランチは1回の呼び出しで複数のブランチを削除します。残念ながら、ブランチ名の補完は行いません。ただし、bashでは次のことができます。

git branch -D `git branch | grep -E '^3\.2\..*'`

2
の完了git branch -D/-dは私にとってはうまくいきます。(おそらく最新のgit.git contribディレクトリから)あなたのものを更新したいかもしれません。
Cascabel

19
代わりにgit branch | ...を使用できます$(git for-each-ref --format='%(refname:short)' refs/heads/3.*)。それは長いですが、私は知っているが、一方で適した出力であることが保証されますgit branchのようなもので、かなりの出力を持っている*し、->(symrefs用)ができるスクリプト/ワンライナーで混乱あなたを。
Cascabel

3
たぶん私がこの問題を持つ唯一の人ですが、grep常にフラグを含めるようにエイリアスを設定しました--color=always- 色フラグなしで実行するまでgit branch -Dスローしていましたerror: branch 'my_branch' not found.
eebbesen

@eebbesenグローバルに無効にしましたか?実行中に同じ問題が発生しますgit branch --merged ${1-$(current_branch)} | grep -v ${1-$(current_branch)} | xargs git branch -d
qmmr

2
ブレース展開git branch -D 3.2{,.1,.2}を使用すると、3つのブランチすべてを削除するように書き込むことができますgnu.org/software/bash/manual/html_node/Brace-Expansion.html
robstarbuck

147

まあ、最悪の場合、次のように使用できます。

git branch | grep '3\.2' | xargs git branch -d

22
これは、ブランチ名に標準化されたプレフィックス表記を使用するすべての人にとって非常に完璧な方法です(たとえば、「fix / ...」または「feature / ...」)。
2015

4
シンプルで効率的!最初に| xargs git branch -d一部なしで実行して、実際に何が削除されるかを確認することをお勧めします。
マティエロ2018

解析ではなく読み取りを目的としているため、grepの出力には使用しないことをお勧めしgit branchます。いつでも変更できます。他の回答で提案されているようにfor-each-ref、を--formatparamsと一緒に使用し、次にこの回答の提案と組み合わせます。
redfox05

138
git branch  | cut -c3- | egrep "^3.2" | xargs git branch -D
  ^                ^                ^         ^ 
  |                |                |         |--- create arguments
  |                |                |              from standard input
  |                |                |
  |                |                |---your regexp 
  |                |
  |                |--- skip asterisk 
  |--- list all 
       local
       branches

編集:

gitブランチの出力はスクリプトでの使用を意図していないため、より安全なバージョン(JakubNarębskiとJefromiが推奨)。

git for-each-ref --format="%(refname:short)" refs/heads/3.2\* | xargs git branch -D

...またはxargs-free:

git branch -D `git for-each-ref --format="%(refname:short)" refs/heads/3.2\*`

14
git branchスクリプトの出力を使用しないでください。を使用しgit for-each-refます。
JakubNarębski10年

1
@記号の付いたタグを削除するには:git for-each-ref --format="%(refname:short)" refs/tags/\*@\* | xargs git tag -d
thaddeusmt

タイプミスがあります。「/3.2*」ではなく「/3.2/*」である必要があります。また、貼り付けた他の回答を自分の回答にコピーしたようです。
Max MacLeod 2014

ここにタイプミスはありません。manページから:If one or more patterns are given, only refs are shown that match against at least one pattern, either using fnmatch(3) or literally, in the latter case matching completely or from the beginning up to a slash
gawi

1
わからない、つまり強制削除であることに注意する価値があるの-Dは、ほとんどの場合、最初に安全であるためです。-d
redfox05

115

git branch --listを使用して適格なブランチを一覧表示し、git branch -D / -dを使用して適格なブランチを削除できます。

ライナーの例:

git branch -d `git branch --list '3.2.*'`

これを試すと、のようなエラーメッセージがたくさん表示されますerror: branch 'package.json' not found.。*の展開が早すぎるようで、すべてのファイルとディレクトリの名前に対応するブランチを削除しようとします。
アンチモン2018年

これはうまくいきます!gitconfigしかし、これをエイリアスとして使用すると問題が発生します...
whomaniac

6
この回答は、リストの上位にある必要があります。非常にクリーンで、機能し、grepはありません
jemiloii

1
ニースは、この1だけ発行して最初のテストに容易であることgit branch --list '3.2.*'
ウィル

3
Windowsの場合git branch -d (git branch --list '3.2.*').trim()
Mattias Josefsson、

38

最近、私は同じ問題の解決策を探していましたが、最終的に私は1つの答えを見つけ、それは非常にうまく機能しています:

  1. 端末または同等のものを開きます。
  2. gitブランチに入力| 削除されるブランチのプレビュー用のgrep "パターン"。
  3. gitブランチに入力| grep "パターン" | xargs gitブランチ-D

このソリューションは素晴らしいものであり、各コマンドの完全な説明とその機能が必要な場合は、ここで説明します


28

使用する

git for-each-ref --format='%(refname:short)' 'refs/heads/3.2.*' |
   xargs git branch -D

7
小さなヒントは、コマンド "| xargs git branch -D"の後半部分を削除すると、一致するブランチのみが出力されるということです。したがって、削除されるブランチをプレビューできます
Max MacLeod

1
また、これを簡略化するためにエイリアスを追加しました。alias grefs='git for-each-ref --format="%(refname:short)"'これを行うことができますgrefs | grep 'regexpattern' | xargs git branch -D
angularsen '27 / 09/27

楽しかった。素敵でシンプル!
Bhargav Ponnapalli 2017年

15

多分あなたはこれが役に立つでしょう:

たとえば 'master'、 'foo'、 'bar'以外のすべてのブランチを削除する場合

git branch -D `git branch | grep -vE 'master|foo|bar'`

grep -v 'something'は、反転機能を備えたマッチャーです。


私は個人的に-Dオプションが他の答えと比較して好きです。ここ@Adiの答えをありがとう。ソリューションは私のために働きます。
AMIC MING

9

この正確な理由により、ブランチ名の最初の3文字としてイニシャルとダッシュ(at-)を入れました。

git branch -D `git branch --list 'at-*'`

すべての答えは基本的にこれを言います、これはたまたま最も単純です。
tfantina

7

gitコマンドプロンプトの使用に限定されていない場合は、いつでも実行git guiして、[ブランチ]-> [削除]メニュー項目を使用できます。削除するすべてのブランチを選択して、それをリッピングさせます。


ただし、これはローカルブランチのみを削除できます
Stealth Rabbi

7

Powershellソリューション:

Windowsを実行している場合は、PowerShellを使用して複数のブランチを一度に削除できます...

git branch -D ((git branch | Select-String -Pattern '^\s*3\.2\..*') | foreach{$_.ToString().Trim()})
//this will remove all branches starting with 3.2.

git branch -D ((git branch | Select-String -Pattern 'feature-*') | foreach{$_.ToString().Trim()})
// this will delete all branches that contains the word "feature-" as a substring.

また、PowershellのSelect-Stringコマンドを使用して、パターンマッチングの動作を微調整することもできます。powershell docsご覧ください。


6

「開発」を維持し、ローカルの他のすべてを削除します

    git branch | grep -v "develop" | xargs git branch -D 

5

@gawi(上記)の回答に基づいて、便利な小さな関数を作成しました。

removeBranchesWithPrefix() {
  git for-each-ref --format="%(refname:short)" refs/heads/$1\* | xargs git branch -d
}

これをに追加して、.bash_profileターミナルを再起動します。その後、次のようにコマンドラインから呼び出すことができます:

removeBranchesWithPrefix somePrefix

注意

私は現在、ソフト削除の設定をしています。つまり、すでにマージされていない限り、ブランチは削除されません。エッジに住みたい場合は、に変更-dする-Dと、プレフィックスに関係なくすべてが削除されます!


5

本当にすべてのブランチをクリーンにする必要がある場合は、

git branch -d $(git branch)

現在チェックインしているブランチを除いて、ローカルにマージされたすべてのブランチが削除されます。

それはあなたの地元をきれいにする良い方法です


これは私には十分うまくいきました。それは2つのブランチを残しましたが、私は1つでしたが、同じコマンドを使用して「-d」の代わりに大文字の「-D」を使用して削除しました。gitがファイルを見つけられないというエラーがいくつか出ましたが、ブランチは削除されました。
Lurifaxel

3

あなたはこの小さなアイテムが好きかもしれません...それはリストを引き出し、最終的にすべての選択を削除する前に各アイテムの確認を求めます...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "remove branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done`

(通常のように)-Dを使用して強制的に削除します。

読みやすくするために、ここでは行ごとに分割しています...

git branch -d `git for-each-ref --format="%(refname:short)" refs/heads/\* |
    while read -r line; do 
        read -p "remove branch: $line (y/N)?" answer </dev/tty;
        case "$answer" in y|Y) echo "$line";; 
        esac; 
    done`

ここにxargsアプローチがあります...

git for-each-ref --format="%(refname:short)" refs/heads/\* |
while read -r line; do 
    read -p "remove branch: $line (y/N)?" answer </dev/tty;
    case "$answer" in 
        y|Y) echo "$line";; 
    esac; 
done | xargs git branch -D

最後に、これを.bashrcに入れたい

alias gitselect='git for-each-ref --format="%(refname:short)" refs/heads/\* | while read -r line; do read -p "select branch: $line (y/N)?" answer </dev/tty; case "$answer" in y|Y) echo "$line";; esac; done'

そのように私はただ言うことができます

gitSelect | xargs git branch -D.

3

ここでPowerShellを使用する純粋な魂のために、小さなスクリプト git branch -d $(git branch --list '3.2.*' | %{$_.Trim() })


2

私にとっては正しく動作します:

git branch | xargs git branch -d

git branch | xargs git branch -D

ローカルブランチをすべて削除します


2

次のコマンドを使用して、すべてのブランチを削除します(チェックアウトしたブランチは削除されません)。

git branch | cut -d '*' -f 1 | tr -d " \t\r" | xargs git branch -d

編集:私はMac OSを使用しています


0

私はあなたがwindowsを使っています、これを行うためにpowershellを使うことができます:

 git branch | grep 'feature/*' |% { git branch -D $_.trim() }

feature/*好きなパターンに置き換えてください。


6
grepは私にとって認識されていないコマンドレットです...このgitブランチ用に変更しました| where {$ _。Trim()。StartsWith( "bug")} | %{git branch -D $ _。Trim()}と動作しました!
Alex


0

を使用git guiして、複数のブランチを一度に削除できます。コマンドプロンプト/ Bashから-> git gui->リモート->ブランチを削除...->削除するリモートブランチを選択->削除。


0

今日、廃止されたローカル/リモートブランチの大規模なセットをクリーンアップしました。

以下は私がそれをした方法です:

1.すべてのブランチ名をテキストファイルにリストします。

gitブランチ-a >> BranchNames.txt

2.削除するブランチをコマンド「git branch -D -r」に追加します。

git branch -D -r origin / dirA / branch01 origin / dirB / branch02 origin / dirC / branch03(...ブランチ名を追加)

3. cmdを実行します

そして、これは「git push origin --delete」よりもはるかに高速で信頼性が高く機能します。

これは他の回答に記載されている最もスマートな方法ではないかもしれませんが、これは非常に簡単で使いやすい方法です。


0

WindowsのデフォルトのアドオンであるGit GUIをインストールしている場合は、これが最も簡単です。Ctrlキーを使用して複数のブランチを選択し、ワンクリックでそれらを削除できます。


0

Fishシェルを使用している場合は、次のstring関数を利用できます

git branch -d (git branch -l "<your pattern>" | string trim)

これは、他のいくつかの回答のPowershellオプションと大差ありません。


0

テキストファイル(branches-to-del.txt)に削除するすべてのブランチがある場合(行ごとに1つのブランチ)、これを実行して、リモート(起点)からそのようなブランチをすべて削除できます。 xargs -a branches-to-del.txt git push --delete origin


0

指定されたパターンに基づいて複数のブランチを削除するには、次のようにします。

ターミナルまたは同等のものを開き、次のコマンドを入力します。

git branch | grep "<pattern>" (preview of the branches based on pattern)

git branch | grep "<pattern>" | xargs git branch -D (replace the <pattern> with a regular expression to match your branch names)

すべての3.2.xブランチを削除します。入力する必要があります

git branch | grep "3.2" | xargs git branch -D

それで全部です!

準備できた!


-1

Gitの場合、すべてのブランチはgitリポジトリへの参照によって何もないので、移動するブランチを削除.git/refして、リポジトリで不要なものが削除されると、ガベージコレクションが自動的に行われるので、しないでください。気にする必要があります。



-4

すべての不要な参照を削除して、すべてのブランチを削除できます。

rm .git/refs/heads/3.2.*


2
2つの理由で反対投票:1.実装の詳細を使用します(Gitの現在のバージョンはブランチを特定のディレクトリにファイルとして保存するという事実)。これは将来のバージョンで変更され、回答が無効になる可能性があります。2.リポジトリが別のディレクトリにある場合は機能しません。
axiac 2017年

また、これをパックされたリポジトリで実行すると、非常に予期しない結果が生じます(git gc)。それをしないでください。
Matthieu Moy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.