How to prune local tracking branches that do not exist on remote anymore?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
When working with Git, a version control system, developers often use branches to develop features, fix bugs, and safely experiment without affecting the main codebase. Over time, especially in a collaborative environment where branches are frequently created and deleted on remote repositories, your local repository can accumulate "orphaned" branches that no longer have a counterpart in the remote repository. Managing and pruning these extraneous local branches streamlines your development environment and keeps it synchronized with the remote repository. Here’s a detailed guide on how to prune local tracking branches that no longer exist on the remote.
Understanding Local and Remote Branches
Local branches are branches on your own machine. When you clone a repository, you typically have at least one local branch called master or main, which tracks the corresponding branch in the remote repository.
Remote branches are references to the state of branches on your remote repositories. They are pointers to the commits at the tip of those branches in the remote repositories and are prefixed in Git with remote/, such as origin/main.
Detecting Stale Local Branches
Before pruning, you need to update your local knowledge of the remote repository. To fetch the list of branches from the remote and see the differences, use:
git fetchupdates your remote references underrefs/remotes/<remote>/and the remote-tracking branches.- The
--pruneoption removes any remote-tracking references that no longer exist on the remote.
After fetching, you can list branches that no longer exist on the remote using:
Here, git branch -vv gives you a verbose list of all branches, including their upstream status. The grep ': gone]' filters branches marked as gone, which means their remote counterparts are deleted. awk '{print $1}' prints the first column, which is the branch name.
Pruning Local Branches
To delete these local branches, you can either delete them one by one manually or script the deletion process. Assuming you want to script it for efficiency, use the following command:
Here, xargs git branch -d passes the branch names output by the previous command to git branch -d, which safely deletes each branch. Note:
git branch -donly deletes the branch if it has been merged into its upstream or the current HEAD to prevent data loss.- If you're sure that these branches can be safely deleted without a merged-check, replace
-dwith-D.
Automation of Prune Operation
For regular maintenance, consider automating this operation with Git aliases or a script. You can add an alias to your .gitconfig like so:
This alias combines fetching and pruning into one command git prune-branches.
Table Summary: Commands and Descriptions
| Command | Description |
git fetch --prune | Fetch branch info from remote, pruning any references to remote branches that are deleted. |
git branch -vv | List all local branches with detailed tracking information. |
git branch -d <branch> | Delete a specific branch safely (checks if it is merged). |
git branch -D <branch> | Force delete a specific branch without merge safety checks. |
Additional Considerations
Safety Checks: Before deleting branches, especially en masse, ensure that no work will be lost. Review each branch, particularly if you do not perform regular code reviews or merging.
Use of GUI Tools: Various graphical user interfaces for Git, like GitKraken or Sourcetree, provide visual tools to manage and prune branches easily. They can be particularly useful if you are managing a large number of branches or prefer a visual method.
Regular Maintenance: Regular pruning helps keep your local and remote repositories clean and manageable. Schedule periodic checks and clean-up operations depending on the pace of your development operations.
Managing your Git repositories effectively is crucial for keeping your development process efficient and robust, and pruning old branches is an important part of that management. By regularly maintaining your branches, you can avoid clutter in your workspace and confusion over branch states, leading to more productive and error-free development.

