現在のものを除くすべてのローカルブランチを削除できますか?


95

の出力にリストされているすべてのブランチを削除したい...

$ git branch

...しかし、現在のブランチを1つのステップで維持します。それは可能ですか?もしそうなら、どうですか?




回答:


66

@pankijsの回答に基づいて、2つのgitエイリアスを作成しました。

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

追加される ~/.gitconfig


そして、@ torekが指摘したように:

小文字-dは「完全にマージされていない」ブランチを削除しないことに注意してください(ドキュメントを参照)。を使用-D すると、このようなブランチが削除されます。これにより、コミットが「失われる」場合があります。これはブランチのreflogsも削除するため、注意して使用してください。これにより、通常の「偶発的な削除からの回復」機能も機能しなくなります。

基本的に、-force重要なものを失うことがないと300%確信できない場合は、このバージョンを使用しないでください。永遠に失われているからです


2
削除されたブランチへのコミットは、しばらくの間reflogに残っているはずです。
CaptRespect 2017年

実際、コミットはreflogに残ります。しかし、ブランチ自体ではありません。私はそれを試しませんが、あなたはあなたのコミットを見つけるかもしれませんが、ブランチ状態に戻りますか?そう思う。Cherry-pickは、削除されたブランチのコミットを取得するために使用できますが、ブランチ自体を復元することはできません。
Vadorequest

1
@Vadorequest実行すると、特定のコミットを指すブランチを再作成できますgit branch branchname commitid
pqnet

@pqnetそのブランチのすべての履歴が再作成されるとは知りませんでした。ありがとうございます。
Vadorequest 2018年

1
@Vadorequestコミットオブジェクトは不変(およびハッシュとしてインデックス化)であるため、編集ごとに(異なるハッシュを使用して)新しいオブジェクトを作成する必要があります
pqnet

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

マスター以外のすべてのブランチを削除します(マスターを保持したいブランチに置き換えますが、マスターを削除します)


29
現在のブランチを保持したい場合は、を使用してくださいgrep -v ^*
Schwern、2015

2
多くのソースからこのスクリプトが表示されますが、実行すると常にブランチが見つからないことを通知します:(
tucq88

1
これは正確ではありません。master-copyたとえば、というブランチは削除されません
mvallebr

2
例えば、その後、必要に応じて正規表現を微調整grep -v "^ *master$"
ブラッド・コッホ

7
2つのブランチを保持する場合は、を使用しますgrep -v "master\|my-other-branch"
デレク・ソイケ

16

最初に(保持したいブランチに切り替え> exmaster):

git checkout master

2番目(マスターであること確認してください)

git branch -D $(git branch)

3
とても簡単です。なぜこれは賛成されないのですか?
princebillyGK

1
それは私にとって最もシンプルで最良の答えです。
Saleh Enam Shohag

1
PowerShellを使用している場合は、を使用しますgit branch -D $(git branch).Trim()
NatoBoram

13

git branch -d(または-D)は複数のブランチ名を許可しますが、少なくとも少しのコードを記述せずに「現在のブランチを除くすべてのローカルブランチ」を自動的に提供するのは少しトリッキーです。

「最良の」(正式に正しい)メソッドはgit for-each-ref、ブランチ名を取得するために使用することです。

git for-each-ref --format '%(refname:short)' refs/heads

しかし、どのブランチにいるのかを理解するのはさらに困難です(git symbolic-ref HEAD派手なスクリプトを作成する場合は、これに対する "正式に正しい"メソッドです)。

より便利なのは、を使用してgit branch、2つのスペースまたは(現在のブランチの場合は)アスタリスクを前に付けたローカルブランチ名を出力すること*です。したがって、*バージョンを削除するためにこれを実行すると、スペースで区切られたブランチ名が残り、それを次に渡すことができますgit branch -d

git branch -d $(git branch | grep -v '^*')

または:

git branch | grep -v '^*' | xargs git branch -d

小文字-dは「完全にマージされていない」ブランチを削除しないことに注意してください(ドキュメントを参照)。を使用-Dすると、コミットが「失われる」原因になっても、そのようなブランチが削除されます。これはブランチのreflogも削除するため、注意して使用してください。これにより、通常の「偶発的な削除からの回復」機能も機能しなくなります。


git branch -D $(git branch | grep -v '^*')マージしたブランチを削除したい場合は、にする必要があります。
Pratik Singhal

@PratikSinghal:Gitが「マージ済み」と見なすブランチだけでなく、他のすべてのブランチを削除しますこれはめったに良い考えではありません。私は私の回答でこれらの両方の項目をすでに指摘しました。
torek 2018

12

マージされたすべてのブランチを削除するには(currentを除く-v ‘*’):

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

また、私はリポジトリの完全なクリーンアップのためにそのようなコマンドを作りました:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

ここから取られます


1
これにより、マージされたブランチのみが削除されます。
Pratik Singhal

10

特定のブランチを除くすべてのブランチを削除します。

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

開発マスターを除くすべてのローカルブランチを削除します

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


4

マージされたすべてのブランチをローカルで削除します。

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

特定のブランチを除くすべてのブランチを削除します。

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

開発マスターを除くすべてのローカルブランチを削除します

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

3

この環境をWindows環境用に作成したことがあります。多分それは誰かを助けるでしょう。実行中、マスターブランチと現在のブランチは削除されません。他のすべてのマージされたブランチは関係なく削除されます。

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit

3

現在のブランチを除くすべてのブランチを一度に削除するには:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D


2

と仮定するとgit branch、現在のブランチの先頭に*; Powershellを使用すると、次の1つのライナーで、で始まらないすべてのブランチが削除され*ます。

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Where-Object

% = Foreachオブジェクト


1

だから、ここにハードコーディングされたブランチ名がたくさんあります...そして、私の答えは、質問の「現在のブランチ」の部分に対してより正確である一方、私のような初心者を一行で読みやすくするために読みやすくしています。正当な理由で信用を置くために、答えは明らかに@pankijsの答えにも基づいています。

git branch | grep -v $(git branch --show-current) | xargs git branch -d

また、debianの.bash_aliasesの1行にエイリアスを設定しています。

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(サブコマンドをいくつかのコマンドラインで実行するには、いくつかのbash機能を有効にする必要があると思いますが)


1

削除したくないものをより選択できるようになるので、これを使用します。以下のコマンドは、master、develop、および現在のブランチを除くすべてのブランチを削除します。

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

だから私はこれを私の中に入れました ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches

0

私見、ローカルブランチを削除する最も安全な方法は:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

また、このトピックに関連する詳細情報を見つけることができますすべてのローカルgitブランチを削除します


gone使用する必要があるマーカーを印刷するには-vv(詳細2回)、-a助けにはなりません(リモートブランチも一覧表示されます)
pqnet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.