ブランチに関して、ローカルとリモートのリポジトリを常に同期させたい。
GitHubでプルリクエストのレビューを行った後、ブランチをマージして削除します(リモート)。ローカルリポジトリでこの情報を取得し、Gitにブランチのローカルバージョンも削除させるにはどうすればよいですか?
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
したがって、たとえばmaster
、develop
、およびstaging
を保持したい場合は、次のようにします。
git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d
少し長いので、.zshrc
または.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
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
参照:
試してください:
git pull-プルーン
対応するリモートブランチが削除されると、ローカルブランチが削除されます。
上記の記述はそれほど正確ではありません。
実際、git pull --Prune
を実行するとリモートトラッキングブランチのみ削除など
remotes/Origin/fff remotes/Origin/dev remotes/Origin/master
その後、git branch -r
を実行して、マシンに残っているリモート追跡ブランチを確認できます。左のブランチが次のようになっていると仮定します
Origin/dev Origin/master
これは、ブランチOrigin/fff
が削除されることを意味します。
したがって、git pull --Prune
を実行した後、次を実行します。
git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
次のローカルブランチをすべて見つけることができます。
その後、<the command above> | xargs git branch -d
はそれらすべてを削除できます。
これは、受け入れられたソリューションでmasterおよびdevelopmentブランチの削除を回避するために動作するはずです:
git branch --merged | egrep -v "^\*|master|development" | xargs -n 1 git branch -d
Powershellを使用している場合、これは答え 上記 と同等です。
git branch -vv | Select-String -Pattern ': gone]' | ForEach-Object{($_ -split "\s+")[1]} | %{ git branch -D $_ }
git branch -D
を呼び出しますこれは私には役に立たなかった。私の他の答えはここにあります: 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
非常に簡単なソリューション:ローカルリポジトリを削除し、リモートリポジトリを新たに複製します。とてもエレガントに見えないかもしれませんが、それは単純で、manページを読まずにあなたが何をしているのか正確に理解できます:-)。
マージされたローカルブランチを削除するには、次のようにします。
git branch -d $(git branch --merged)
存在しない追跡も削除したい場合:
git pull --Prune
対応するリモートブランチを持たないすべてのローカルブランチをリストするために、このワンライナーを作成しました。
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
ブランチをマスターにプッシュしてマージしたばかりの場合は、git bashで次の操作を実行します。
git branch -d branch_name_to_delete
現在そのブランチにいる場合は、マスターにプッシュバックされます。この時点で、プルを行います
git pull