Changes and staging
A resizable file list with checkboxes and a bulk bar to stage, stash, or discard many files at once. The diff sits beside it, and a CodeMirror editor opens any file in the repo.
┌─ [ 01 ] · a desktop git client, for one repo or many
Staging, history, the branch graph, rebase and cherry-pick, worktrees, submodules, and a "Committing as" line that stops you pushing with the wrong email. Then the part other clients don't have: workspaces that act on a group of repos at once, and worksets that carry one ticket across several repos, from branch to ship to reset. All of it runs as plain git in the repos you already have, never inside .git.
over·git — a client that sits over your git repos, never inside .git. Stop using it anytime; your repos behave the same in any other tool.
api-gateway
~/payments/api-gateway
changes 3
committing as you <you@example.com> · system git config
@@ new file @@+ import { bucket } from "./bucket";++ export const loginLimiter = bucket({+ cap: 10,+ per: "60s",+ key: (req) => req.ip + ":" + req.body.username,+ }); @@ routes/login.ts @@+ import { loginLimiter } from "../middleware/rateLimit";- router.post("/api/login", login);+ router.post("/api/login", loginLimiter, login);
Two stacks of grouping. Workspaces above, worksets below.
[ 02 ] · the git client
Before workspaces and worksets, overgit is a complete desktop git client. Each thing it does runs as the plain git command you'd have typed, and most buttons show that command before you press them.
A resizable file list with checkboxes and a bulk bar to stage, stash, or discard many files at once. The diff sits beside it, and a CodeMirror editor opens any file in the repo.
History, Files, Graph, and Stash tabs for every repo. The graph colors each lane and labels branches and tags where they point.
⌘B opens a searchable picker of local and remote branches. Create a branch inline, with an optional sync and pull first, or cherry-pick commits from any branch with a commit picker.
Start them from the app, and continue or abort when git pauses. A repo stuck mid-rebase, merge, or cherry-pick is flagged, so it's never a surprise the next time you open it.
See every worktree a repo has. If a branch is checked out in another worktree, overgit tells you where and offers to adopt it or remove that worktree. Missing ones are flagged for pruning.
Committed too early or to the wrong branch? Undo the last commit from the command palette and keep the changes.
Above the commit box, "Committing as" shows the name and email the commit will use and where they come from. Set a per-repo identity once, and work, open-source, and personal repos stop borrowing each other's email.
Each repo has a manage sheet for its tags, remotes, and identity, plus submodules and Git LFS status, so you don't need a terminal to find out what a repo is made of.
Browse the repos your gh, glab, or git credential helper can already reach on GitHub, GitLab, or Bitbucket. Pick one and the URL and folder fill in. Overgit never stores a token of its own.
[ 03 ] · many repos at once
GitHub Desktop, Tower, and Fork are all one-repo-at-a-time. If your work spans services + shared libs + infra, you end up scripting your own "checkout feature/x everywhere" flow. Overgit fills that gap with two orthogonal ideas — workspaces for durable groupings, worksets for tickets — without ever writing inside .git.
A workspace is an identity-bearing bucket: "these repos are Platform," "these are Payments." It's the sidebar's collapsible section and the target for bulk actions across the whole group. Permanent. A repo can live in many workspaces — small shared libs are the common case.
A workset is a transient unit of in-flight work: "ship the auth migration across api-gateway, billing-svc, and ledger-core this week." Bound to a feature branch. Sits above the workspace list in the sidebar, waiting for you to pick up where you left off. Archive when shipped. Reset when done.
Overgit never writes inside .git. No manifest, no .overgit folder, no synthetic root, no special config. Workspaces and worksets live in overgit's settings file, not in your repos. Stop using overgit any time and your repos behave the same in any other tool.
Fetch every repo in a workspace. Status every repo. Reset every repo to its default branch — fan-out fetch → switch → hard-reset to origin/<default> across the whole group. Workspace-wide PR list via gh pr list --json merged into one view.
Pick the repos the ticket touches. Sync each to its default → pull → create the feature branch — all in one workflow. Per-repo outcomes if any of them fail. Stop scripting for d in */; do git checkout ….
Shipped the ticket? Archive the workset. It vanishes from the active sidebar into a collapsed "Archived" section. The repos on disk are unchanged — overgit just stops surfacing the grouping. Reactivate any time. Three weeks later, when oncall asks "how did we ship that?", it's right there.
One action fans out fetch → switch back to origin/<default> → hard-reset → delete the workset's bound branch across every member. Cleans up the whole feature in one shot. Same surface as workspace reset, scoped to just the repos the workset touched.
Both reset flows detect repos with commits not on origin/<default> and stop before the hard-reset would erase them. You get a [force reset (lose N)] / [skip] choice per repo, with the commit count visible. Never a silent disaster.
Type a message once, commit every dirty member, push every branch — per-repo outcomes if any of them fail. Same surface for fetch-all and "open PRs everywhere" via gh, scoped to the workset.
⌘K opens a context-aware palette: switch / create branches, jump to repos, workspaces, and worksets, search files, run repo actions (stage all, fetch, pull, push, AI review).
Detects claude, codex, and gemini. Pipes diffs into the chosen CLI in non-interactive mode. Suggest drafts a conventional-commit message from the staged diff and drops it into the commit input.
⌘K palette · ⌘B branches · ⌘N new branch · ⌘1–4 tabs · ⌘R refresh · ⌘\ sidebar · ⌘, settings. Whatever auth your claude, codex, gemini, and gh already have is the auth Overgit uses. Nothing leaves your machine via Overgit.
[ 04 ] · what a workspace looks like
A workspace is a durable bucket of repos you treat as one. Aggregate health at a glance — who's dirty, who's ahead, who's behind — then fetch all, status all, or reset all in a single action. Click any row to drop straight into that repo.
4 repos in this workspace. Aggregate health below; click any row to open the repo.
1 dirty · 0 ahead · 0 behind
| repo | branch | dirty | ahead | behind |
|---|---|---|---|---|
| api-gateway~/payments/api-gateway | main | 2 | · | · |
| billing-svc~/payments/billing-svc | main | · | · | · |
| ledger-core~/payments/ledger-core | main | · | · | · |
| infra~/payments/infra | main | · | · | · |
one bucket · every repo · one action
[ 05 ] · the workset lifecycle
A workset is a ticket pinned to a feature branch and the repos that branch touches. Create it once — overgit branches across every member in one move. Commit and push together. Open every PR with gh. When the work ships, one action fetches, switches back to origin/<default>, hard-resets every member, and deletes the bound branch — with per-repo safety checks for unmerged commits. The repos never know they're related. Overgit knows.
feature/rate-limit across them.
status · one branch is the goal — sync the stragglers
one branch is the goal · resume the stragglers · then ship together
origin/main · deleted feature/rate-limit
origin/main · deleted feature/rate-limit
feature/rate-limit
origin/main · [force reset (lose 2)] · [skip]
Smart safety: any repo with commits not on origin/<default> stops and asks. The other repos still complete. You get per-repo outcomes, never a silent disaster.
[ 06 ] · landing check
Landing Check keeps asking one question for every workset: will each branch merge cleanly into its repo's default branch? It lists the files that would conflict, and warns when two of your active worksets would collide in the same repo. It simulates every merge with git merge-tree, so your working tree, index, and branches are never touched.
2 lands clean · 1 conflicts · 1 already merged · as of 3 minutes ago
Committed work only. 1 repo has uncommitted files not included in this check.
src/limits.ts src/routes/login.ts
RebaseMerge
Collisions with other worksets 1 conflicting branch · 3 with no overlap
feat/rate-limit and chore/pg14 from pg14 migration both change src/db/pool.ts
api-gateway, ledger-core, infra: no overlap with other worksets
export const loginLimiter = bucket({ <<<<<<< feat/rate-limit cap: 10, per: "60s", ======= cap: 20, per: "1m", burst: 5, >>>>>>> origin/main key: (req) => req.ip, });
git merge-tree --write-tree works without changing your working tree, index, or refs. The leftover objects are unreachable, and git's normal cleanup removes them.[ 07 ] · why overgit exists
Overgit optimizes for the day your work spans four repos at once — when juggling them by hand is the thing slowing you down. Workspaces and worksets are UI groupings, not files on disk: every action is a plain git command run in the repo's own directory, so you keep moving without inventing a meta-format that something else has to understand. If you uninstall overgit tomorrow, your repos forget it ever existed.
It's built for the realistic case — your work spans services and shared libs and infra, your teammates use whatever client they like, and the only thing the repos agree on is git. Overgit sits over the top, coordinates, and stays out of the way.
Sibling project of overcli. Written & maintained by Lionel Farr and Owen Farr. Open-source — contributors, issues, and PRs welcome.
┌─ [ 08 ] · before you point it at real repos
Overgit is an overlay on git, not a replacement for it. Most of these answers follow from that one fact.
Nothing. Overgit is free and open source under Apache 2.0 — no licence to buy, no per-seat pricing, no paid tier holding features back. There is no account to create and no server to pay for: it is a desktop app driving the git you already have.
It never writes inside .git. Workspaces and worksets live in overgit's own state; everything it does to a repo runs as the plain git commands you'd have typed yourself.
Uninstall it and your repos forget it ever existed — same branches, same remotes, same config. There is no migration to undo and nothing to export, because nothing was ever stored in the repo.
A workspace is a durable grouping of repos — "these are Platform," "these are Payments" — the lens you fetch, status, and reset across. A workset is a ticket you can resume across those repos, pinned to a feature branch: spin up, ship, archive, reset.
Every destructive flow shows you exactly what it is about to discard, per repo, before it runs. That check is the reason the feature exists.
If it speaks git, yes — overgit doesn't care who hosts it. On top of that, cloning can browse GitHub, GitLab and Bitbucket directly, and pull request aggregation goes through the gh CLI. All of it rides on credentials already on the machine — your gh or glab login, or your git credential helper. Overgit never asks for, stores, or transmits a token of its own.
Yes — Apache 2.0, and the repo builds from source. There is no server component to review: it is a desktop app driving local git.
[ 09 ] · grab a build
Overgit is in beta, and from v0.3.0 the macOS builds are Developer-ID signed and notarized by Apple, with the same Developer ID as overcli. They open on a double-click. Windows isn't code-signed yet, so SmartScreen may still flag it. Either way, the source is right there if you'd rather build it yourself.
| ⌘ macOS arm64 + x64 | .dmg · .zip | ~ 120 MB | [download] |
| ⊞ Windows x64 + arm64 | NSIS installer | ~ 110 MB | [download] |
| 🐧 Linux x64 + arm64 | .AppImage · .deb | ~ 130 MB | [download] |