1065

これgit remote prune originで、リモートにないローカル ブランチを削除できます。

しかし、それらのリモート ブランチから作成されたローカル ブランチも削除したいと考えています (それらがマージされていないかどうかを確認するとよいでしょう)。

これどうやってするの?

4

33 に答える 33

572

すでに master にマージされているすべてのローカル ブランチを削除する場合は、次のコマンドを使用できます。

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

mainマスター ブランチとして使用している場合は、それに応じてコマンドを変更する必要があります。

git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -d

詳細情報.

于 2013-06-03T22:17:56.437 に答える
152

これにより、リモート追跡ブランチが削除されたローカル ブランチが削除されます。master(ブランチにいることを確認してください!)

git checkout master
git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -d

詳細:

  • git branch -vvリモートが枝刈りされたローカル ブランチについては「gone」と表示されます。

    mybranch abc1234 [origin/mybranch: gone] commit comments
    
  • -dマージされているかどうかを確認します(-D関係なく削除します)

    error: The branch 'mybranch' is not fully merged.
    
于 2015-05-27T22:35:26.343 に答える
67

フェッチ時に、削除されたリモート ブランチへの参照を自動的に削除するように Git を構成できます。

git config --global fetch.prune true

呼び出し時git fetchまたはgit pullその後、削除されたリモート ブランチへの参照は自動的に削除されます。

于 2017-01-12T11:09:16.447 に答える
42

リモートトラッキングブランチがリモートから削除されたローカルブランチを一覧表示します

$ git remote prune origin --dry-run

追跡されていないローカルからこれらのローカル ブランチを逆参照する場合

$ git remote prune origin
于 2015-12-09T05:28:15.910 に答える
19

さらに短くて安全なワンライナー:

git branch -d $(git branch --merged | cut -c 3- | grep -v master)

実行する前に、まだマージされていないブランチにチェックアウトしてください。現在チェックインしているブランチは削除できないためです。

于 2015-07-30T09:31:13.123 に答える
3

一度にすべてを行う方法はわかりませんが、gitgit branch -d <branchname>は完全にマージされた場合にのみローカル ブランチを削除します。小文字の d に注意してください。

git branch -D <branchname>(大文字の D に注意してください) は、マージされた状態に関係なく、ローカル ブランチを削除します。

于 2012-10-25T08:35:25.827 に答える
2

@wisbuckyの回答のバリアントを使用して、次をエイリアスとして~/.gitconfigファイルに追加しました。

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

git pruneitgoodこれにより、マージ後に不要になったローカル ブランチとリモート ブランチの両方を簡単にクリーンアップできます。

于 2016-11-11T18:56:23.857 に答える
2

以下は、Windowsユーザー向けの@wisbuckyの回答の適応です。

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

私は posh-git を使用していますが、残念ながら PS は Naked を好まないforため、PruneOrphanBranches.cmd という名前の単純なコマンド スクリプトを作成しました。

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

パラメータなしで呼び出してリストを表示し、「-d」を指定して呼び出して実際の削除を実行するか、完全にはマージされていないが削除したいブランチに対して「-D」を指定します。

于 2016-11-16T20:16:14.987 に答える
1

これを git bash で試して、削除されたブランチへの参照を取得してプルーニングし、削除されたブランチを追跡していたローカル ブランチをプルーニングします。

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

削除されないブランチを最初にチェックアウトすることを忘れないでください。これにより、ブランチの削除が妨げられません。

于 2016-11-24T14:57:27.877 に答える
0

受け入れられた回答を堅牢なスクリプトに変えました。私の git-extensions repository にあります。

$ git-prune --help
Remove old local branches that do not exist in <remote> any more.
With --test, only print which local branches would be deleted.
Usage: git-prune [-t|--test|-f|--force] <remote>
于 2016-09-22T12:19:38.527 に答える
0

「上流のブランチがなくなったローカルでチェックアウトされたブランチを削除するにはどうすればよいですか」の答えを求めてこのページにたどり着きました

また、ローカル ブランチがまだマージされているかどうかも気にしませんでした。これは、マージされていないgit branch -dローカル ブランチを削除するのではなく、へのパイプで警告するだけだからです。

git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3 | egrep -v -f /dev/fd/0 <(git branch -a | grep -v origin) | grep branch_prefix_that_I_care_about | xargs git branch -d

# translation
# git branch -a | grep origin | tr -s ' ' | cut -d '/' -f3
## this finds all remote branch names minus the "remote/origin/" part
#
# <(git branch -a | grep -v origin)
## this finds all local branch names and redirects it into the previous command
#
# egrep -v -f /dev/fd/0 STUFF
## this is doing some weird magic that I'm grokking as "take the set difference from whatever was piped in"
#
#
# overall translation: (STUFF TO CONSIDER) | egrep magic <(STUFF TO REMOVE FROM CONSIDERATION) | do cool things with resulting stuff
于 2019-02-12T00:32:23.213 に答える