tl;dr;
You can remove all non-existent remote branch references in your local repository with
git remote prune origin
When I merge a pull request back into main
, I delete the branch on the server
But that doesn't delete it locally.
I end up with a bunch of local branches that need cleaning.
If I switch to such branches I see a message that "the upstream is gone."
> git checkout feature/1234-weaponise-space
Switched to branch 'feature/1234-weaponise-space'
Your branch is based on 'origin/feature/1234-weaponise-space', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
Yes. The upstream is gone. Because when the pull request was completed we chose to delete the branch on the server.
Now it's time to delete the local branch.
To delete a local branch.
-
Make sure you want it gone.
-
Delete it...
To delete the local branch use one of the following:
git branch -d branch_name # delete only if fully merged upstream git branch -D branch_name # force delete even if not merged to its upstream
git branch -vv
Lists all branches and has : gone]
if their remote component has been removed. e.g.
> git branch -vv
FrogTracking 2583eea0 [origin/FrogTracking: behind 49] monkey-magnet fixed attributes on user columns
Gespacio e05bafd8 [origin/Gespacio: gone] Added .gitignore file to exclude .hg folder
bug/5928-cat-chaser-ignores-2-user-columns 2583eea0 [origin/bug/5928-cat-chaser-ignores-2-user-columns: gone] monkey-magnet fixed attributes on user columns
env-test 73e5707d [origin/env-test] remove merge markers
feature/5784-moon-tooth b1ec5764 [origin/feature/5784-moon-tooth: gone] 5784: moon-truth is more testable
feature/5784-sheep-dip-re-encoder 2b60c485 [origin/feature/5784-sheep-dip-re-encoder: gone] remove commented out code
feature/5792-cloud-taser-convert 88019a36 [origin/feature/5792-cloud-taser-convert: gone] Merge branch 'FrogTracking' into feature/5792-cloud-taser-convert
feature/5829-convert-hops-in-shops 3816b859 [origin/feature/5829-convert-hops-in-shops: gone] hops-ify Sync moon-boot-fighter.
feature/5884-funtegra-import-yard d55774bc [origin/feature/5884-funtegra-import-yard: gone] funtegra: import users from yard
feature/5959-oops-counter-Color a111c73b [origin/feature/5959-oops-counter-Color: gone] Build pipelines: removed file moon-web-build.yml
feature/5992-monkey-magnet-current-archive d2f88379 [origin/feature/5992-monkey-magnet-current-archive] Sync monkey-magnet default table renamed
* master d16af51f [origin/master] Merge master into this branch
refactor/cloud-taser-utc-datetime-handling 5da44411 [origin/refactor/cloud-taser-utc-datetime-handling: gone] moon: 5888 cloud-taser Online.
So the real point here is : gone]
substring referring to the missing origin.
(for example, if you forgot to delete it when merging your pull request)
Delete it on the origin....
git push --delete origin feature/5992-monkey-magnet-current-archive
Then delete it locally (may need to switch out of it first with git co master
, for example)
git branch -d feature/5992-monkey-magnet-current-archive
May need to use -D
to force the delete if there's some discard-worthy change in there.
function Prune-Branches($force = $false) {
Write-Host "run `git remote prune origin` first to unlink to missing remotes" -f yellow
git branch -vv |
Select-String ": gone]" |
% {
$branchName = (($_.ToString().Trim()) -split "\s")[0];
if ($force) {
if ("release", "main", "master", "dev" -notcontains $branchName) {
Write-Host "# Removing: $branchName " -f red;
Write-Host "> git branch -D $branchName " -f gray;
git branch -D $branchName
}
else {
Write-Host "**** Protection against deleting $branchName " -f yellow;
}
}
else {
Write-Host $branchName -f darkcyan -n;
Write-Host " - not removed";
}
}
if (!$force) {
Write-Host "Use '" -f cyan -n
Write-Host "Prune-Branches `$true" -f white -n;
Write-Host "' to force local deletion of remote-pruned branches" -f cyan;
}
}