History-first Git for the desktop.
Search the commit graph, review inline or side-by-side diffs, resolve conflicts,
and clone from GitHub, GitLab or Bitbucket. For Windows, macOS and Linux.
Website · Features · Install · Host accounts · Search · Keyboard · Build · Docs
The commit graph across all branches. Selecting a commit shows its files and diff in the inspector.
|
Working tree |
Merge editor |
| Feature | What it does |
|---|---|
| History-first graph | Large commit topology with search, branch filter, and inline or side-by-side diffs |
| Working tree | Stage whole files, hunks or lines; commit with a message draft saved per repository |
| Branches & sync | Create/switch branches, merge/rebase, fetch, pull and push; configure remotes and choose publication destinations |
| Reference comparison | Compare branches, tags or commits as exact snapshots or changes since their common ancestor |
| Recovery | Restore tracked-change backups and create branches from saved commits or recent HEAD history |
| Commit actions | Cherry-pick, revert, reset, create/delete tags and push tags from the commit actions menu |
| File history & blame | Follow a file across renames and see which commits introduced its lines |
| Merge editor | Three-way conflict resolution: colored conflicts and scrollbar marks, F7 navigation, inline accept actions, panes that scroll together, columns or stacked layout |
| Host accounts | GitHub, GitLab (including self-managed instances), and Bitbucket for browsing and cloning |
| New repository | Create a repository with its initial branch and a first README commit |
| Clone | HTTPS or SSH from URL or linked host listings, with progress and cancel |
| Auto-updates | Updates itself from GitHub Releases on Windows and Linux; on macOS, install new versions from the releases page |
Download the latest build from Releases:
| Platform | Download |
|---|---|
| Windows (x64, Arm64) | Installer (.exe) |
| macOS (Apple silicon) | Disk image (.dmg) or .zip |
| Linux (x64) | .AppImage for any distribution, or .deb for Ubuntu and Debian |
Builds are not code-signed yet, so the first launch needs one extra step:
- Windows: if SmartScreen appears, choose More info → Run anyway.
- macOS: open the app with right-click → Open, or run
xattr -cr "/Applications/Git Manager.app". - Linux: make the AppImage executable (
chmod +x Git-Manager-*.AppImage), or install the package withsudo apt install ./Git-Manager-*.deb.
On Windows and Linux the app then updates itself from the same releases. macOS updates need a signed build, so for now install new versions from the releases page.
- Windows 10 or 11, macOS on Apple silicon, or Linux x64
- System Git on
PATH, or setGIT_MANAGER_GIT_PATHto a Git binary
The app probes for Git at startup and guides you to install it if missing.
Use Host accounts from the welcome screen, or Accounts in the app menu, to link GitHub, GitLab (GitLab.com or your own instance), or Bitbucket. The app uses OS secure storage when available and marks accounts whose tokens were stored without OS encryption. It lists remote repos so you can clone them (HTTPS or SSH).
- Open Host accounts.
- Choose a provider.
- Paste a personal access token (for a self-managed GitLab, also enter its address; for Bitbucket: an Atlassian API token plus your Atlassian account email).
- Click Connect.
- Select an account in the list to load remote repositories, then Clone a repo.
| Provider | Credential | Notes |
|---|---|---|
| GitHub | Personal access token | Classic or fine-grained. Needs permission to read your profile and list repositories (private repos need repo access). |
| GitLab | Personal access token | Needs API access to read your user and projects (e.g. read_api). For a self-managed instance, create the token there and enter the instance's HTTPS address, e.g. https://gitlab.example.com; leave the address empty for gitlab.com. |
| Bitbucket | API token | Enter your Atlassian account email plus the API token (Bitbucket app passwords were retired). Needs read access to your account and repositories. |
Clone, fetch, and push still use your normal Git credentials: HTTPS via Git Credential Manager, SSH via your OpenSSH agent and keys. Connecting an account only unlocks browsing and one-click clone from the host listing.
More detail: docs/features/host-accounts.md.
To review a whole feature branch, use Compare… above History, enter a base and target, and leave Changes since common ancestor checked. Uncheck it to compare exact snapshots. A commit's actions menu also offers Compare with HEAD…. Reference comparison explains the modes.
Type in the search box above the history and press Enter. Search runs in Git across all branches, unless you narrow it:
| Search | Finds |
|---|---|
fix login |
Commits whose message contains the text, ignoring case |
author:Ada |
Commits by that author |
3f2c1ab |
That commit (7–40 hex digits) |
branch:main |
The history of main, together with remote-tracking copies such as origin/main |
branch:feature/* |
The history of every branch the pattern matches (* and ? are wildcards) |
branch:main fix |
A branch filter combined with a message search |
While you type, matching branches are suggested: ↑ / ↓ to pick one, Enter to show that branch, Alt+Enter (Option+Enter on macOS) to jump to its tip. Each branch in the sidebar also has Show only this branch and Jump to tip.
More detail: docs/features/history-graph.md.
Repository → Remotes & Publishing… adds or edits remote URLs, changes branch tracking and publishes the current branch to a selected remote/destination branch. The server repository must already exist. Fetch to load its branches before choosing an upstream. See Remotes & publishing.
Commit messages restore after switching views or repositories and after restarting. Successful commits clear their draft; failed commits keep it.
Repository → Recovery… (also above History) lists previous commits and tracked-change snapshots saved before amend, reset, rebase, branch deletion and tracked discard. Create a branch to recover a commit. Restore a snapshot onto a clean working tree/index to recover staged and unstaged edits. Untracked files discarded from Changes are in the Trash. See Recovery for limits and retention.
The app remembers its last maximized/full-screen mode. On startup, it opens saved repositories directly; repository setup appears when the saved list is empty.
| Key | Does |
|---|---|
| F6 / Shift+F6 | Move between the sidebar, history or changes, the inspector, and the search box |
| F11 | Toggle full-screen mode (also in the View menu) |
| ↑ / ↓, PageUp / PageDown, Home / End | Move through commits, changed files, repositories and branches |
| Enter | Commit list: go to the commit's files. Sidebar: open the repository or check out the branch |
| Esc | Commit files: back to the commit list. Menus and suggestions: close them |
| Space | Changes: check or uncheck the file |
| Tab | Leave a read-only diff |
| Arrow keys on a divider or column edge | Resize it (Shift: bigger steps; Home / End: smallest / largest) |
Menu shortcuts use Ctrl on Windows and ⌘ on macOS:
| Shortcut | Does |
|---|---|
| Ctrl+1 / Ctrl+2 | Show History / Changes |
| Ctrl+F | Focus the history search |
| Ctrl+B | Show or hide the sidebar |
| Ctrl+Shift+D | Dock the inspector at the bottom or on the right |
| Ctrl+N, Ctrl+O, Ctrl+Shift+O | New, add local, or clone a repository |
| Ctrl+Shift+F / Ctrl+Shift+L | Fetch / pull (push has no shortcut on purpose) |
Requires Node.js 22 and Git.
npm install
npm run devnpm test
npm run typecheck
npm run lintnpm run dist # current platform
npm run dist:win
npm run dist:mac
npm run dist:linuxPushing a v* tag that matches package.json runs .github/workflows/release.yml: it builds all three platforms and publishes the release with the built-in GITHUB_TOKEN after the required Windows and macOS jobs succeed; Linux is optional. Release notes come from docs/releases/<version>.md when present. Signing is optional: add MAC_CSC_LINK, MAC_CSC_KEY_PASSWORD and APPLE_ID, APPLE_APP_SPECIFIC_PASSWORD, APPLE_TEAM_ID for a notarized macOS build, or WIN_CSC_LINK, WIN_CSC_KEY_PASSWORD for Windows. Without them macOS builds are ad-hoc signed. See release preparation and the 1.2.0 release notes. The website in site/ deploys through .github/workflows/pages.yml.
| Layer | Role |
|---|---|
src/main |
Electron main — IPC, menus, secure storage, updater |
src/preload |
Narrow contextBridge API (window.gitManager) |
src/git-worker |
Git CLI runner and repository operations |
src/history-core |
Commit-graph layout and search helpers |
src/merge-core |
Conflict region model |
src/renderer |
History-first React UI |
flowchart LR
subgraph renderer [Renderer]
UI[App + shell + features]
end
subgraph bridge [Preload]
API["window.gitManager"]
end
subgraph main [Main process]
IPC[ipc handlers]
Store[userData state]
Prov[providers]
Upd[updater]
end
subgraph git [Git worker]
Runner[runGit]
Ops[ops/*]
end
UI --> API
API -->|ipcRenderer.invoke| IPC
IPC --> Ops
Ops --> Runner
Runner -->|spawn| GitCLI[(system / GIT_MANAGER_GIT_PATH)]
IPC --> Store
IPC --> Prov
Prov -->|HTTPS| HostAPIs[(GitHub / GitLab / Bitbucket)]
IPC --> Upd
Upd -->|electron-updater| GHReleases[(GitHub Releases)]
Opening a repository lands on History. The graph uses most of the workspace; selecting a commit shows files and a Monaco diff, inline or side by side, with syntax colors for the file's language (the palette button turns them off).
Full write-up: docs/architecture.md.
| Doc | What's inside |
|---|---|
| Docs index | Entry point for all project docs |
| Architecture | Components, data flow, diagrams |
| Domain model | Entities and invariants |
| Brandbook | Ink & Ember design system |
| Repository management | Open, create, clone, remove |
| History graph | Topology UI |
| Working tree | Changes & commits |
| Branches & sync | Branch ops and remotes |
| Remotes & publishing | Remote URLs, upstreams and publication destinations |
| Reference comparison | Exact snapshots and feature-branch review |
| Recovery | Saved commits, tracked-change snapshots and reflog |
| Merge editor | Conflict resolution |
| Host accounts | GitHub / GitLab / Bitbucket |
| Auto-updates | Release updates |