GitHawkA git graph for VS Code that is just a git graph. No AI, no telemetry, no account, no cloud. MIT licensed.
InstallSearch GitHawk in the Extensions view, or:
Then press Nothing to configure to get started. Why another oneGit Graph is what most people used,
and it has been abandoned
(#913,
#838) with millions of
installs still depending on it. Its licence looks like MIT but removes the right to
GitHawk is a clean-room replacement under a real MIT licence. Meanwhile the maintained alternatives keep adding AI to a tool whose entire job is drawing lines between commits. What it doesLook like the rest of your editorEvery colour comes from VS Code's own theme tokens, so the panel is light on a light theme and high-contrast on a high-contrast one. Only the lane colours are fixed: a lane has to keep its colour as your eye follows it down the graph, and stay distinct from the seven beside it, so they are eight hues chosen to hold their contrast against white and near-black alike. Read the graphCommits in correct topological order — a parent is never drawn above its child, even after a rebase or a cherry-pick. Lanes are reused as soon as a branch ends, so the gutter stays narrow on repositories with dozens of branches. Branches, remote branches, tags, and a detached HEAD are each labelled distinctly. See what a commit changed
Click a commit: its full message, author, date, and hash appear on the right, and its files fill the Changes tree in the sidebar. Click a file to open it in VS Code's own diff editor. The sidebar is surfaced the first time and then left alone — pulling focus on every click would make the graph unbrowsable. To ask for it deliberately, once it has been closed or covered, right-click a commit and choose "Show changes in the sidebar". See what you have not committed
A row above the newest commit, whenever there is anything uncommitted, saying
what kind — Unlike a commit, clicking this row surfaces the sidebar every time. Browsing the graph is many clicks across many commits and the sidebar should not chase each one; there is only ever one of these rows, so clicking it is only ever a request to see the files. Its marker is hollow and dashed rather than a commit dot, because it is not a
commit: nothing points at it, it has no hash, and it looks different the moment
you save a file. Nothing draws a line from it to One honest gap: untracked files are counted in the row but are not in the
changeset. Give the graph the roomThe panel is short and splits its width three ways. Either side pane folds away with the thin handle beside it — the handle stays where it is when the pane is gone, so the way back is where the way out was — and the graph takes the space. GitHawk remembers which panes you had. Review a whole branch, or any set of commits
The tree always states how the comparison was made, because a merge-base diff, a direct diff, and a reconstruction answer different questions. Act on branches and commits
Click a branch, or right-click a commit, and you get a native VS Code menu — grouped by topic, with your keyboard shortcuts and theme, not a menu drawn inside a webview. The branch labels drawn on the graph are the same click target as the branch list, so a branch is actionable wherever you happen to be looking at it. Both offer "Copy branch name" — a webview cannot be text-selected, and a branch name is what gets retyped into a checkout, a PR description, or a CI filter. On a commit: create a branch or tag here, check it out, cherry-pick, revert, reset, copy the hash. On a branch: push, pull, check out, merge, rebase, rename, delete, or delete it on the remote. Push and pull are per branch, and always there. The Sync group at the top
of a branch's menu offers both every time, with the state in the description —
Anything destructive asks first, and says what will be lost. Manage remotesThe Remotes button on the toolbar — beside Fetch, Pull, and Push, since they
all concern the other end of the wire — or Add, rename, re-point, or remove one; fetch a single remote with pruning from the list without opening anything; or prune deleted branches without fetching. Removing a remote and pruning both ask first: they delete tracking refs, and nothing in the reflog brings those back. Work across several repositories
Open a folder of projects and GitHawk finds the repositories inside it. The name at
the left of the toolbar switches between them; so does
Submodules, linked worktrees, and repositories nested inside a monorepo are all
found. How deep it looks is Keep up with the repositoryCommit in a terminal, check out from the Source Control view, let an agent rebase in a worktree — the graph reloads on its own. GitHawk watches git's metadata, not your working tree, and waits for an operation to finish rather than redrawing on every step of a rebase. Your place in the history is kept: the row you are looking at stays where it is instead of sliding down as commits arrive above it. Manage worktrees
A worktree is a second directory with a different branch checked out, sharing one repository. They stay niche because git's errors are opaque — it refuses a checkout because of a directory you deleted last month, and tells you only that the branch "is already used by worktree at …". GitHawk names the rule instead:
Each row has buttons to open a new VS Code window, open a terminal, or start an AI CLI there — Claude Code, Codex, Gemini CLI, and opencode by default, configurable. That is the one place AI appears in GitHawk: launching your tool in the right directory. It reads nothing and sends nothing. Settings
Commands
Known limitationsHonest list, in the order they are likely to annoy you:
ContributingBug reports and pull requests are welcome — issues. See CONTRIBUTING.md for the architecture, how to run it locally, and how the three tiers of tests work. LicenceMIT — see LICENSE. Actually MIT, in the sense that you may fork it, ship it, and sell it. |





