ローカルGitブランチをリモートリポジトリで削除した後で削除する


162

ブランチに関して、ローカルとリモートのリポジトリを常に同期させたい。

GitHubでプルリクエストを確認した後、ブランチをマージして削除します(リモート)。この情報をローカルリポジトリで取得し、Gitでブランチのローカルバージョンも削除するにはどうすればよいですか?


リモートトラッキングブランチ、ローカルブランチ、またはその両方を削除しますか?削除されたすべてのリモートブランチを取得するエイリアス(bashまたはgit)を実際に作成し、削除するローカルコピーもすべて1つのコマンドで見つけることができます。

たぶん何かを思い付くするには、次のコマンドを使用してみてください、git ls-remotegit show-ref

また、チェックアウトすることgit symbolic-refもできgit update-refます。

あなたの助けをありがとう、私はどこかで答えを見つけることになりました。私の返事を見てください。
sf89 2013

回答:


180

簡単な方法

git branch --merged | grep -v "\*" | xargs -n 1 git branch -d

注:をオンmasterにしていない場合、ブランチが削除される可能性があります。「より良い方法」のために読み続けてください。

私たちはマスターを保つことを確認してください

あなたはそれを保証することができmaster、またはそのことについては、他のブランチは、によって除去されないgrep多くのためINGの。その場合、あなたは行くでしょう:

git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d

だから我々は維持したい場合masterdevelopおよびstaging例えば、我々は行くだろう。

git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d

これをエイリアスにします

少し長いので、.zshrcorにエイリアスを追加したいかもしれません.bashrc。鉱山が呼び出されますgbpurge(の場合git branches purge):

alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'

次に.bashrcまたはをリロードします.zshrc

. ~/.bashrc

または

. ~/.zshrc

コマンドをエイリアスに入れて、単一のコマンドにすることができます。ただし、branch磁器であり、配管コマンドはないため、Gitの将来のバージョンでUIが変更され、壊れる可能性があることに注意してください。

1
パーフェクト!Githubワークフローに従うと、ローカルブランチmasterが削除されることに注意してください。
Rubens Mariuzzo 2014

いいえ、それがそこに残っていることはかなり確かです(私は毎日それを使用しており、それを行っているようには見えません)。
sf89 2014年

4
FYIあなたが複数のブランチを維持したい場合は、単一のgrepを使用することができ、とても好き: grep -Ev '(\*|master|important-branch)'
アンドリュー・バーンズ

4
~/.gitconfig代わりにこれを使用する場合は、[alias]セクションに次を追加gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"します(grep式で()を使用する必要はありません)。
dskrvk 2016年

82

私はGitHubで同じフローを使用しましたgit branch --mergedが、マージされたブランチがリストされているので、以前の回答が満足のいくものではなかったのですが、私の場合、すべてがリモートで削除されたわけではありません。だから、これは私のために働きました:

git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d

どこ:

  • git fetch --all -p:ローカルブランチのステータスを更新する
  • git branch -vv:ローカルブランチのステータスを一覧表示する
  • grep ": gone]":削除されたフィルター
  • awk '{ print $1 }':名前を抽出する
  • xargs -n 1 git branch -d:名前を削除コマンドに渡します

注:必要に応じて、削除を強制する-dの代わりに-Dを使用できます。

例えば:

someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).

someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services

参照:

http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches


3
私は常にマスターに対してそれを行うことを確実にするために自由を取りました、それゆえ: git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d 素晴らしいスクリプトと説明、それをありがとう:)
Miguelgraz '26 / 02/15

branch -vvは、ブランチからの最後のコミットメッセージを示していることに注意してください。あなたがたまたまそのメッセージに「行ってしまった」としgrep goneたら、そのブランチにもヒットするでしょう。したがって、grep ": gone]"おそらく少し安全に使用できます。
chawkinsuf 2015

1
これが質問に対する実際の答えです。ありがとうございました。
Andrei Gladkyi

1
さらに良い:awk '$3 $4 ~ /:gone]$/ { print $1 }'
Jakub Bochenski

3
これの-D代わりに必要とすることは別-dとして、完璧な答えです!
Cas

72

試してください:

git pull-プルーン

対応するリモートブランチが削除された場合、ローカルブランチを削除します。

更新しました:

上記の説明は正しくありません。

実際、実行git pull --pruneすると、次のようなリモート追跡ブランチのみが削除されます

remotes / origin / fff
remotes / origin / dev
リモート/オリジン/マスター

次に、実行git branch -rして、マシンに残っているリモート追跡ブランチをチェックできます。左のブランチが次のとおりだとします。

origin / dev
起源/マスター

つまり、ブランチorigin/fffが削除されます。

したがって、を実行した後git pull --prune、次を実行してください:

git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)

あなたはすべてのローカルブランチを見つけることができます:

  1. 対応するリモートブランチはもうありません。
  2. 安全に取り外すことができます。

その後、<the command above> | xargs git branch -dそれらのすべてを削除できます。


42
この答えは正確ではありません。この--pruneフラグは、ローカルブランチではなく、リモート追跡ブランチのみを削除します。

3
ここで@Cupcakeに同意します、これは私がここで探しているものを達成しません。
sf89 2013

6
賛成投票するつもりはありませんが、これはローカルブランチを削除してからGitHubから削除した後に必要なものですが、git remote -vコマンドでリモートブランチとしてまだ存在しています。
Spechal

8
あなたも行うことができますgit fetch --prune。それが私の選択です
e_m0ney

1
スタックオーバーフローで見つかったアドバイスからのさらに別のGitエラー... git pull --prune「リモート '--prune'からプルするように要求しましたが、ブランチを指定しませんでした。これは現在のブランチにデフォルトで設定されているリモートではないため、コマンドラインでブランチを指定する必要があります。」
jww 2016年

23

これは、承認されたソリューションでマスターブランチと開発ブランチを削除しないようにするために機能します。

git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d

16

powershellを使用している人にとって、これは上記の答えと同等です

git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
  1. 削除済みとマークされいるすべてのブランチをフィルタリングします
  2. git branch -D見つかった各ブランチを呼び出す

6

これのどれも私のために働いていませんでした。私の他の答えはここにあります:https : //stackoverflow.com/a/34969726/550454

しかし、本質的に、私は今これを私の中に持っています~/.gitconfig

[alias]
  prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d

5

非常にシンプルなソリューション:ローカルリポジトリを削除し、リモートリポジトリを新たに複製します。とてもエレガントに見えないかもしれませんが、それは単純であり、manページを読まなくても、あなたが何をしているかを正確に理解できます:-)。


1
なぜそれほど多くの反対票が投じられたのですか?私は明らかに、特に大きなリポジトリでは効率的ではないことを意味しますが、OPが要求したことを実行します。これを行わない理由は他にありますか?
2016年

6
ローカルのブランチ、隠し場所、プッシュされていないコミットがすべて失われるからです...ダイナマイトで釣りをしているようなものです。
sevenseacat 2017

1
同じことが、作業中のラップトップが何らかの理由で破損、紛失、または盗難に遭った場合にも発生します。そのため、ローカルで重要なことは何もしません。小さな機能の場合でも、ブランチを作成してそれをプッシュし、それが役に立たなくなったら削除する方が私には良いようです。

1

対応するリモートブランチがないすべてのローカルブランチを一覧表示するために、この1行を作成しました。

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -

この後、これらのローカルブランチを削除するのは簡単xargsです:

diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d

これも私のリストですmasterが、期待どおりに動作しません。注意してください
エンリコ

1

私はマージされたローカルブランチを削除するためにそれをします:

git branch -d $(git branch --merged)

存在しないトラッキングも削除したい場合:

git pull --prune

1

ブランチをマスターにプッシュしてマージした場合は、git bashで次のようにします。

git branch -d branch_name_to_delete

現在そのブランチにいる場合は、マスターに戻ります。この時点で、

git pull

-2

投票した回答には、マスターを削除する可能性があります。以下の実際的な例を検討してください。

私は2つの機能ブランチhemen_READMEとhemen_BASEBOXを持っていましたが、それらは開発に統合され、開発はマスターに統合されました。機能ブランチhemen_READMEおよびhemen_BASEBOXはリモートで削除されましたが、ローカルに表示されていました。また、私はローカルでマスターではなく、開発しています。

その場合

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                      671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX                a535c0f added global exec paths to puppet manifest
        hemen_README                 ba87489 Updated Readme with considerable details
        master                       8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop       671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
        remotes/origin/hemen_README  ba87489 Updated Readme with considerable details
        remotes/origin/master        2f093ce Merged in develop (pull request #3)

したがって、上記の部分コマンドを実行すると

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
        hemen_BASEBOX
        hemen_README
        master

マスターも表示されていることに注意してください。マスターは最終的に削除されます。

いずれにせよそれはできた。どのようにしてそれを達成したかについて、セッションログをあなたと共有します。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [would prune] origin/hemen_BASEBOX
     * [would prune] origin/hemen_README
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin 
    Pruning origin
    URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
     * [pruned] origin/hemen_BASEBOX
     * [pruned] origin/hemen_README

私は、何が剪定されるかを確認し、それから剪定しました。以下のブランチコマンドを見て、リモートを処理しました

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        hemen_BASEBOX          a535c0f added global exec paths to puppet manifest
        hemen_README           ba87489 Updated Readme with considerable details
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

次に、ローカルブランチを削除してください

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX 
    Deleted branch hemen_BASEBOX (was a535c0f).
    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
    Deleted branch hemen_README (was ba87489).

これで、ブランチは希望どおりになりました。

    hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
    * develop                671ad6c Merged in hemen_README (pull request #1)
        master                 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
        remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
        remotes/origin/master  2f093ce Merged in develop (pull request #3)

もちろん、マスターを削除する可能性があります。質問をよくお読みください。そこで言ったように、私は地元の人々をきれいにする方法が必要でした。つまり、リモートに存在しないすべてのブランチを削除します。masterが存在しなくなった場合は、ローカルマシンにも表示されなくなります。
sf89 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.