503

私は開発プロセスに従い、新しい機能やストーリーカードごとに新しいローカルブランチを作成します。終了したら、ブランチをマスターにマージしてからプッシュします。

怠惰や忘却の組み合わせが原因で時間の経過とともに発生する傾向があるのは、ローカルブランチのリストが大量になり、その一部(スパイクなど)がマージされていない可能性があることです。

すべてのローカルブランチを一覧表示する方法と、1つのブランチを削除する方法を知っていますが、すべてのローカルブランチを削除できるgitコマンドがあるかどうか疑問に思っていました。

以下はgit branch --mergedコマンドの出力です。

user@machine:~/projects/application[master]$ git branch --merged
  STORY-123-Short-Description
  STORY-456-Another-Description
  STORY-789-Blah-Blah
* master

grep -v \*(以下の回答に従って)でリストされているブランチを削除しようとすると、エラーが発生します。

error: branch 'STORY-123-Short-Description' not found.
error: branch 'STORY-456-Another-Description' not found.
error: branch 'STORY-789-Blah-Blah' not found.

私が使用しているもの:
git 1.7.4.1
ubuntu 10.04
GNU bash、バージョン4.1.5(1)
-GNUgrep2.5.4 をリリース

4

30 に答える 30

605

'git branch -d'サブコマンドは、複数のブランチを削除できます。したがって、@ sblomの答えを単純化しますが、重要なxargsを追加します。

git branch -D `git branch --merged | grep -v \* | xargs`

または、さらに簡略化して:

git branch --merged | grep -v \* | xargs git branch -D 

重要なことに、@ AndrewCが指摘しているように、git branchスクリプトに使用することはお勧めしません。これを回避するには、次のようなものを使用します。

git for-each-ref --format '%(refname:short)' refs/heads | grep -v "master\|main" | xargs git branch -D

削除には注意が必要です。

$ mkdir br
$ cd br; git init
Initialized empty Git repository in /Users/ebg/test/br/.git/
$ touch README; git add README; git commit -m 'First commit'
[master (root-commit) 1d738b5] First commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git branch Story-123-a
$ git branch Story-123-b
$ git branch Story-123-c
$ git branch --merged
  Story-123-a
  Story-123-b
  Story-123-c
* master
$ git branch --merged | grep -v \* | xargs
Story-123-a Story-123-b Story-123-c
$ git branch --merged | grep -v \* | xargs git branch -D
Deleted branch Story-123-a (was 1d738b5).
Deleted branch Story-123-b (was 1d738b5).
Deleted branch Story-123-c (was 1d738b5).
于 2012-05-16T00:43:24.020 に答える
184

私はgithubのこの問題に関するコメントでより良い方法を見つけました:

git branch --merged master --no-color | grep -v "master\|stable\|main" | xargs git branch -d

編集:色なしオプションを追加し、安定したブランチを除外します(必要に応じて他のブランチを追加します)

于 2013-09-02T10:55:13.687 に答える
179

すべてのブランチを削除するが、「開発」や「マスター」などの他のブランチを保持する簡単な方法は次のとおりです。

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

非常に便利 !

于 2014-10-01T23:20:19.773 に答える
155

の出力を解析することgit branchはお勧めできません。また、StackOverflowの将来の読者にとっては良い答えではありません。

  1. git branch磁器コマンドとして知られているものです。磁器のコマンドはマシンで解析されるようには設計されておらず、Gitのバージョンが異なると出力が変わる可能性があります。
  2. git branch解析を困難にする方法(たとえば、色付け)での出力を変更するユーザー構成オプションがあります。ユーザーが設定した場合color.branch、出力に制御コードが表示されerror: branch 'foo' not found.ます。これにより、別のコマンドにパイプしようとした場合に発生します。--no-colorフラグを使用してこれをバイパスできますがgit branch、他のどのユーザー構成が問題を引き起こす可能性があるかは誰にもわかりません。
  3. git branch現在チェックアウトされているブランチの横にアスタリスクを付けるなど、解析するのが面倒な他のことを行う場合があります

gitのメンテナは、git branch出力に関するスクリプトについて次のように述べています。

現在のブランチが何であるかを知るために、カジュアル/不注意なユーザーがgitブランチの周りにスクリプトを書いている可能性がありますが、これは間違っています。コマンドからの出力は人間の消費のユースケースを支援するために変更される可能性があるため、スクリプトでgitブランチを含むPorcelainコマンドを使用することは積極的にお勧めしません。

ディレクトリ内のファイル(.git / refs / headsなど)を手動で編集することを提案する回答.gitも同様に問題があります(refsは代わりに.git / packed-refsにあるか、Gitが将来内部レイアウトを変更する可能性があります)。

Gitは、for-each-refブランチのリストを取得するコマンドを提供します。

Git 2.7.Xでは、にマージされた--mergedすべてのブランチを検索して削除するために、以下のような操作を実行できるようにするためのオプションが導入されますHEAD

for mergedBranch in $(git for-each-ref --format '%(refname:short)' --merged HEAD refs/heads/)
do
    git branch -d ${mergedBranch}
done

Git 2.6.X以前では、すべてのローカルブランチを一覧表示してから、それらを個別にテストして、マージされているかどうかを確認する必要があります(これは大幅に遅くなり、少し複雑になります)。

for branch in $(git for-each-ref --format '%(refname:short)' refs/heads/)
do
    git merge-base --is-ancestor ${branch} HEAD && git branch -d ${branch}
done
于 2014-10-02T00:01:31.843 に答える
90

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

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

説明:

  • git branch | grep -v "master"コマンドを使用してすべてのブランチ(マスターを除く)を取得する
  • xargsコマンドですべてのブランチを選択
  • でブランチを削除しますxargs git branch -D
于 2019-09-27T17:52:34.363 に答える
67

現在チェックアウトしているブランチを除くすべてのブランチを削除するには:

for b in `git branch --merged | grep -v \*`; do git branch -D $b; done

最初の数回に変更git branch -D $bして、意図したブランチが削除されることを確認することをお勧めします。echo $b

于 2012-05-15T23:50:03.457 に答える
66

以下のコマンドは、マスターブランチを除くすべてのローカルブランチを削除します。

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

上記のコマンド

  1. すべてのブランチを一覧表示します
  2. リストからマスターブランチを無視し、残りのブランチを取得します
  3. ブランチを削除します
于 2018-08-24T14:08:20.540 に答える
42

注意点として、私はgit1.7.10にアップグレードします。ここで、ご使用のバージョンでは機能しない回答が得られる場合があります。私の推測では、ブランチ名の前に。を付ける必要がありますrefs/heads/

注意、作業フォルダと.gitディレクトリのコピーを作成した場合にのみ、以下に進んでください。

私は時々、先に進んで、直接したくないブランチを削除し.git/refs/headsます。これらのブランチはすべて、ポイントするコミットの40文字のsha-1を含むテキストファイルです。.git/configそれらのいずれかに特定の追跡を設定している場合は、無関係な情報が含まれます。これらのエントリは手動で削除することもできます。

于 2012-05-16T02:04:55.130 に答える
40

現在使用しているものを除くLinuxのすべてのローカルブランチを削除するには

// hard delete

git branch -D $(git branch)
于 2019-04-05T07:54:30.540 に答える
27

テキストエディタとシェルを使用する方が簡単だと思いました。

  1. git checkout <TAB>シェルに入力します。すべてのローカルブランチが表示されます。
  2. それらをテキストエディタにコピーし、保持する必要があるものを削除します。
  3. 改行をスペースに置き換えます。(SublimeTextでは非常に簡単です。)
  4. シェルを開き、と入力しgit branch -D <PASTE THE BRANCHES NAMES HERE>ます。

それでおしまい。

于 2013-08-01T22:09:39.117 に答える
18

すべてのローカルブランチを削除する場合は、次の簡単なコマンドを使用します。

git branch -D `git branch`

注:これにより、現在チェックアウトされているブランチを除くすべてのブランチが削除されます

于 2020-12-16T16:19:27.967 に答える
16

Windowsコマンドラインから、以下を使用して、現在チェックアウトされているブランチを除くすべてを削除します。

for /f "tokens=*" %f in ('git branch ^| find /v "*"') do git branch -D %f
于 2019-02-08T01:06:52.037 に答える
13

私も同じような状況でしたが、最近、次のコマンドが便利であることがわかりました。

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep>/) printf "%s", $0 }'`

複数のブランチを保持したい場合は、

git branch -D `git branch | awk '{ if ($0 !~ /<Branch_You_Want_to_Keep1>|<Branch_You_Want_to_Keep2>/) printf "%s", $0 }'`

これが誰かに役立つことを願っています。

于 2013-07-12T07:23:03.187 に答える
11

これが、Windowsマシンで実行しているすべての人のためのPowershellソリューションです。

git checkout master # by being on the master branch, you won't be able to delete it
foreach($branch in (git branch))
{
    git branch -D $branch.Trim()
}
于 2021-02-25T22:24:34.347 に答える
9

NodeJSを使用している場合は、次のコマンドを作成しました。

npx git-clear-branch

このコマンドは、マスターブランチと現在のブランチを除くすべてのローカルブランチをクリアします。

于 2021-02-10T06:36:04.080 に答える
7

Git自体を実行する必要がない場合は、.git / refs/headsの下のヘッドを手動またはプログラムで削除することもできます。以下は、Bashで最小限の調整で機能するはずです。

shopt -s extglob
rm -rf .git/refs/heads/!(master)

これにより、マスターブランチを除くすべてのローカルブランチが削除されます。アップストリームブランチは.git/refs / remotesの下に保存されるため、変更されません。

Bashを使用していない場合、または一度に多数のGitリポジトリーを再帰したい場合は、GNUfindで同様のことを行うことができます。

find . \
    -path remotes -path logs -prune -o \
    -wholename \*.git/refs/heads/\* \! -name master -print0 |
xargs -0 rm -rf

検索ソリューションはおそらくより移植性がありますが、パスとファイル名の整理は注意が必要であり、エラーが発生しやすい可能性があります。

于 2012-05-16T02:34:55.997 に答える
7

答えのどれも私のニーズを完全に満たしていないので、ここに行きます:

git branch --merged | grep -E "(feature|bugfix|hotfix)/" | xargs git branch -D && git remote prune origin

feature/これにより、マージされて、、bugfix/またはで始まるすべてのローカルブランチが削除されますhotfix/。その後、アップストリームリモートoriginがプルーニングされます(パスワードの入力が必要になる場合があります)。

Git1.9.5で動作します。

于 2014-12-29T10:23:27.623 に答える
7

これはコマンドラインソリューションではありませんが、GitGUIがまだ提案されていないことに驚いています。

私は99%の時間コマンドラインを使用していますが、この場合はかなり遅くなるか(したがって、元の質問)、長いが巧妙なシェル操作に頼るときに何を削除しようとしているのかわかりません。

UIはこの問題を解決します。これは、削除するブランチをすばやくチェックして、ブランチごとにコマンドを入力しなくても、保持したいブランチを思い出させることができるためです。

UIから[ブランチ]->[削除]に移動し、 Ctrlキーを押しながら削除するブランチをクリックして、強調表示します。それらがブランチ(などdev)にマージされていることを確認したい場合は、 [マージされた場合にのみ削除]で[ローカルブランチ]をに設定しdevます。それ以外の場合は、 [常に]に設定して、このチェックを無視します。

GitUI:ローカルブランチを削除します

于 2018-08-08T19:41:45.140 に答える
6

ここでのいくつかの回答の組み合わせに基づいて-リモートに存在するすべてのブランチを保持し、残りを削除したい場合は、次のワンライナーがトリックを実行します:

git for-each-ref --format '%(refname:short)' refs/heads | grep -Ev `git ls-remote --quiet --heads origin | awk '{print substr($2, 12)}'| paste -sd "|" -` | xargs git branch -D
于 2019-03-27T06:34:35.777 に答える
5

マスター、開発、およびすべてのリモートブランチを維持したい場合。Githubに存在しなくなったすべてのローカルブランチを削除します。

$ git fetch --prune

$ git branch | grep -v "origin" | grep -v "develop" | grep -v "master" | xargs git branch -D

1]リモートリポジトリで使用されなくなったリモート参照を削除します。

2]これにより、すべてのブランチのリストが取得されます。マスター、開発、またはオリジン(リモートブランチ)を含むブランチをリストから削除します。リスト内のすべてのブランチを削除します。

警告-これにより、自分のローカルブランチも削除されます。したがって、ブランチをマージし、マージ後にクリーンアップを実行するときにこれを実行し、削除します。

于 2020-12-09T06:13:06.173 に答える
3

git branch -d [branch name]ローカル削除の場合

git branch -D [branch name]ローカル削除にも使用されますが、強制的に削除されます

于 2020-09-05T14:41:59.077 に答える
3
git branch -l |grep -v master | xargs git branch -D

しかし、ブランチを削除するのはどうでしょうか。ワークスペースを削除して、小さなリポジトリの場合は再度クローンを作成してください。

于 2021-09-08T05:18:25.520 に答える
2

PowerShellの場合、これは機能します。

git branch --format '%(refname:lstrip=2)' --merged `
    | Where-Object { $_ -ne 'master' } `
    | ForEach-Object { git branch -d $_ }
于 2019-08-01T17:29:21.010 に答える
2

もっと適度な答えをお勧めします。ここでの回答の多くは、-D変更がマージされているかどうかに関係なく、強制的に削除されるものを使用しています。これは、変更がマージされていないブランチをそのままにしておく1つのライナーです。

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

または、リストされている他の例を試すこともできますが、をに変更するだけ-Dです-d。OPが削除方法を尋ねたことは知っていますが、ほとんどのユースケースでは、より安全に使用できます-d

于 2021-02-23T02:47:57.823 に答える
1

ボックスにgrepやその他のUNIXがありませんが、これはVSCodeのターミナルから機能しました。

git branch -d $(git branch).trim()

マージされていないブランチが削除されないように、小文字のdを使用します。

私もマスターをしていたので、* master存在しないのでマスターを削除しようとしませんでした。

于 2020-04-08T19:05:18.350 に答える
1

一度に多くのローカルブランチを削除する

# delete all local unmerged branches
git branch --no-merged | egrep -v "(^\*|master|dev)" | xargs git branch -D
# delete all local branches (merged and unmerged).
git branch | egrep -v "(^\*|master|dev)" | xargs git branch -D  

リモートブランチの削除

# Deleting non-existent tracking branches
git remote prune <remote> --dry-run
# Deleting a single remote branch
git push <remote> --delete <branch>
# Deleting many remote branches at once
git branch -r --merged | egrep -v "(^\*|master|dev)" | sed 's/origin\///' | xargs -n 1 git push origin --delete

ソース

于 2021-05-12T00:51:45.600 に答える
0

次のスクリプトはブランチを削除します。ご自身の責任で使用・変更してください。

この質問の他の回答に基づいて、私は自分のために簡単なbashスクリプトを書くことになりました。私はそれを「gitbd」(git branch -D)と呼びましたが、これを使用する場合は、好きな名前に変更できます。

gitbd() {
if [ $# -le 1 ]
  then
    local branches_to_delete=`git for-each-ref --format '%(refname:short)' refs/heads/ | grep "$1"`
    printf "Matching branches:\n\n$branches_to_delete\n\nDelete? [Y/n] "
    read -n 1 -r # Immediately continue after getting 1 keypress
    echo # Move to a new line
    if [[ ! $REPLY == 'N' && ! $REPLY == 'n' ]]
      then
        echo $branches_to_delete | xargs git branch -D
    fi
else
  echo "This command takes one arg (match pattern) or no args (match all)"
fi
}

渡された場合はパターン引数に一致するブランチを削除するか、引数なしで呼び出された場合はすべてのローカルブランチを削除することを提案します。また、確認手順も表示されます。これは、削除するためです。これはすばらしいことです。

それは一種の馬鹿げています-パターンに一致するブランチがない場合、それはそれを認識しません。

出力実行の例:

$ gitbd test
Matching branches:

dummy+test1
dummy+test2
dummy+test3

Delete? [Y/n] 
于 2014-11-07T01:02:38.610 に答える
0

を除くすべてのローカルブランチを削除するためにシェルスクリプトを作成しましたdevelop

branches=$(git branch | tr -d " *")
output=""
for branch in $branches 
do
  if [[ $branch != "develop" ]]; then
    output="$output $branch"
  fi
done
git branch -d $output
于 2018-07-12T04:04:44.793 に答える
0

上記の回答は問題なく機能します。ローカルリポジトリに多数のブランチがあり、ローカルマシンにあるいくつかのブランチを除いて、多くのブランチを削除する必要がある場合の別のアプローチを次に示します。

まずgit branch、すべてのローカルブランチを一覧表示します。

unixコマンドを実行してブランチ名の列をファイル内の単一の行に転置するには これにより、サンプル.txt
git branch > sample.txt
ファイル に保存されます。そして 、シェルでコマンドを実行します。これにより、列が行に変換され、ブランチ名のリストが1行にコピーされます。
awk 'BEGIN { ORS = " " } { print }' sample.txt

そして、を実行し
git branch -D branch_name(s)ます。
これにより、ローカルに存在するリストされたすべてのブランチが削除されます

于 2018-09-28T06:57:33.820 に答える
0

この目的のために、git-extrasを使用できます

$ git delete-merged-branches
Deleted feature/themes (was c029ab3).
Deleted feature/live_preview (was a81b002).
Deleted feature/dashboard (was 923befa).
于 2019-09-12T17:03:46.913 に答える