これgit remote prune origin
で、リモートにないローカル ブランチを削除できます。
しかし、それらのリモート ブランチから作成されたローカル ブランチも削除したいと考えています (それらがマージされていないかどうかを確認するとよいでしょう)。
これどうやってするの?
これgit remote prune origin
で、リモートにないローカル ブランチを削除できます。
しかし、それらのリモート ブランチから作成されたローカル ブランチも削除したいと考えています (それらがマージされていないかどうかを確認するとよいでしょう)。
これどうやってするの?
すでに master にマージされているすべてのローカル ブランチを削除する場合は、次のコマンドを使用できます。
git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
main
マスター ブランチとして使用している場合は、それに応じてコマンドを変更する必要があります。
git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -d
詳細情報.
これにより、リモート追跡ブランチが削除されたローカル ブランチが削除されます。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.
フェッチ時に、削除されたリモート ブランチへの参照を自動的に削除するように Git を構成できます。
git config --global fetch.prune true
呼び出し時git fetch
またはgit pull
その後、削除されたリモート ブランチへの参照は自動的に削除されます。
リモートトラッキングブランチがリモートから削除されたローカルブランチを一覧表示します
$ git remote prune origin --dry-run
追跡されていないローカルからこれらのローカル ブランチを逆参照する場合
$ git remote prune origin
さらに短くて安全なワンライナー:
git branch -d $(git branch --merged | cut -c 3- | grep -v master)
実行する前に、まだマージされていないブランチにチェックアウトしてください。現在チェックインしているブランチは削除できないためです。
一度にすべてを行う方法はわかりませんが、gitgit branch -d <branchname>
は完全にマージされた場合にのみローカル ブランチを削除します。小文字の d に注意してください。
git branch -D <branchname>
(大文字の D に注意してください) は、マージされた状態に関係なく、ローカル ブランチを削除します。
@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
これにより、マージ後に不要になったローカル ブランチとリモート ブランチの両方を簡単にクリーンアップできます。
以下は、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」を指定します。
これを git bash で試して、削除されたブランチへの参照を取得してプルーニングし、削除されたブランチを追跡していたローカル ブランチをプルーニングします。
git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`
削除されないブランチを最初にチェックアウトすることを忘れないでください。これにより、ブランチの削除が妨げられません。
受け入れられた回答を堅牢なスクリプトに変えました。私の 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>
「上流のブランチがなくなったローカルでチェックアウトされたブランチを削除するにはどうすればよいですか」の答えを求めてこのページにたどり着きました
また、ローカル ブランチがまだマージされているかどうかも気にしませんでした。これは、マージされていない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