This tool vs. the GitHub Branches page
Two different questions. GitHub's Branches page tells you how old a branch is and how far it has diverged from the default branch. This page tells you whether deleting it would destroy the only copy of something — which is the question you actually need answered before a cleanup.
What each tool is for
The GitHub Branches page is built into every repository on GitHub and included at no extra cost. It lists every branch with its last update and author, shows how many commits each branch is ahead of and behind the default branch, surfaces the pull request attached to a branch where one exists, and separates branches it considers active from ones it considers stale. It is also where branches are deleted, and where a branch deleted from that page can be restored. For seeing and managing what exists, it is the right tool and nothing here replaces it.
This scanner does none of that. It does not list your remote branches, show
authorship, open a pull request, or delete anything — it has no token,
no account, and no API access to your repository at all. It takes commit
ancestry from a checkout (or from a snapshot exported from one) plus optional
pull-request metadata you export yourself, and classifies each branch by
whether its commits still exist somewhere else: merged,
protected, active, shared,
moved-tip, or uncertain. What comes out is a human
review queue, a recovery manifest, and a CSV — never a delete command.
It runs free in any browser or from a local checkout, keeps no account, and
uploads nothing you paste.
The gap this exists to cover
A branch list sorts by age and by divergence, and neither is the same as “this work exists elsewhere”. Two cases in particular look entirely ordinary in any branch list:
A merged pull request whose branch tip moved afterwards.
Merging tells you some commits landed on the base branch. It does not tell
you the branch still points at them. One more commit, an amend, or a rebase
after the merge leaves the tip outside the base history, and those newer
commits may exist nowhere else — while the branch still reads as
merged. This tool classifies that case moved-tip and keeps it
out of the delete pile.
A squash or rebase merge. Both rewrite the branch's commits into new ones, so the originals are not ancestors of the default branch even though the work is fully landed. The ahead/behind count then reads as “ahead” on a branch that is genuinely finished. Classifying from ancestry plus recorded pull-request state, rather than from an ahead count alone, is what separates those from branches that really are the only copy.
And a branch that is old is not thereby abandoned, while a branch touched yesterday can be a duplicate of work that landed last month. Age is a useful filter and a poor verdict.
| Question | Where to answer it |
|---|---|
| What branches exist, who last pushed to each, and which have open pull requests? | The GitHub Branches page — built in, live, and authoritative about your remote. |
| I want to delete a branch, or restore one I just deleted. | The GitHub Branches page. This tool cannot delete anything and never will. |
| Would deleting this branch destroy the only copy of some commits? | This scanner — free, private, no account, classified from commit ancestry. |
| Its pull request merged, but has the tip moved since? | This scanner's moved-tip classification, the case a branch list cannot show. |
| I have several hundred stale refs and need a reviewable queue, not a list. | This scanner's report, recovery manifest, and approval-queue CSV. |
| I need the same review on GitLab, Bitbucket, or a self-hosted remote. | This scanner — it reads a Git checkout, so the host does not matter. |
| I need this to run offline, or without granting any tool access to the repository. | This scanner — it makes no network call and holds no credential. |
| What does “safe to delete” even mean for a Git branch? | This tool's own worked explainer. |
| Do I need an account or a sign-in to use the tool? | This scanner: no. The Branches page needs a GitHub account with access to the repository. |
Most teams get different value from each: the Branches page for seeing and managing what exists and for actually performing a deletion, and a private read-only scanner like this one for deciding which of those deletions is safe to make. This page's own classifications are a review queue, not permission to delete a ref, and not a backup.
This tool needs no account and no sign-in: it is a static page, the classification runs in your browser, and once it has loaded it keeps working with the connection off.
Common questions
Should I use this scanner or the GitHub Branches page?
They answer different questions, and most teams cleaning up a branch list will use both. GitHub's Branches page is built into every repository and is the fastest way to see what refs exist, who last pushed to each one, how many commits each is ahead of and behind the default branch, whether a pull request is attached, and which branches GitHub considers stale — and it is where the delete button lives, along with the restore option that undoes a deletion made from that page. This scanner does one narrower thing: it reads commit ancestry from a checkout, or from a snapshot exported from one, and sorts every branch by whether its commits still exist somewhere else. A branch whose pull request merged but whose tip moved afterwards, and a branch whose work landed under a different filename, look ordinary in any branch list; they are the two cases this tool exists to separate out. It runs free, keeps no account, uploads nothing, and never deletes or writes anything. A team that wants to see and manage branches is in the right place on GitHub; a team about to delete a few hundred of them and wanting to know which ones hold the only copy of something is in the right place here.
Does GitHub not already tell me a branch is merged?
It tells you a pull request merged, which is not the same claim. A merged pull request means some commits landed on the base branch; it does not mean the branch still points at those commits. If the tip moved after the merge — one more commit, an amend, a rebase — those newer commits are outside the base history and may exist nowhere else, while the branch still reads as merged. The same gap appears in the other direction: after a squash merge or a rebase merge the branch's original commits are not ancestors of the default branch at all, so an ahead/behind count can show a branch as ahead when its work is fully landed. This scanner classifies from commit ancestry rather than from merge state alone, and reports the moved-tip case separately instead of folding it into merged.
Does this tool delete branches or need access to my repository?
No to both. It only reads refs, commit ancestry, and JSON files you pass it — it never fetches, pushes, or deletes, and it has no token, no account, and no API access of its own. Its output is a review queue and a recovery manifest that marks itself read-only and approval-required. This comparison page cannot reach your repository at all, and the browser version classifies a snapshot you paste entirely on your own device.
Is this page affiliated with GitHub?
No. This site is not affiliated with, endorsed by, or sponsored by GitHub, Inc. or Microsoft. GitHub is a trademark of its owner, named here only to describe what this tool is and is not.
Open the branch hygiene scanner to sort your own branch list.