Multi-Git


Multi-Git — Free Download. Multi-repo Git desktop client

Multi-Git is a local-first desktop client for Git that handles multiple repositories, separate SSH identities and commit identities, worktrees, line and hunk staging, visual interactive rebasing, commit splitting, conflict resolution, stashes, patches, bisect, reflog, submodules, Git LFS, remotes, commit and tag signing, and GitHub pull request creation. It runs on Windows, macOS and Linux, stores its data on the local machine, and requires no account or subscription. A Safety Net layer records recovery information before resets, rebases, branch deletion, stash drops, bulk discards and worktree removal, while an operations log shows every Git command the application executes with its arguments, working directory, exit code and duration. A built-in terminal workflow is available when direct command-line access is required.

★★★★★
5.0(1 ratings)
File size: 108 MB
The latest version of Multi-Git is: 5.2.2
Operating system: Windows, MacOS, Linux
Languages: English
Price: $0.00 USD (Open Source (MIT))
  • Multiple repositories and repository groups. The application is organized around one active repository that can be switched from the header at any time, with recent projects remembered between sessions. The Groups section collects repositories that belong together and a Fetch all action updates every member of a group with a concurrency cap, the ability to cancel, and a separate result report for each repository, so one unreachable remote does not hide the repositories that succeeded. Opening a repository in a new window gives it its own selection, diff and commit message, and asking twice focuses the window that already exists instead of creating a second one that would compete for the same index lock.
  • Per-repository SSH profiles and commit identities. An SSH profile carries a private key path, an optional commit name and email, and an optional stored passphrase. Profiles can be selected per repository, remembered afterwards, and matched automatically through Auto-Select Rules that evaluate the origin URL in list order. Authentication and authorship are written together or not at all, and a push whose authenticating account disagrees with the account the host greets is blocked with an explicit override, including for force pushes, so a repository cannot end up committing as one identity while pushing as another. A default account can be starred so every unpinned repository falls back to it.
  • Precision staging at line and hunk level. Clicking an added or removed line selects it, and the stage, unstage or discard actions apply to exactly the selected lines and nothing else in the file. Hovering a hunk header reveals buttons that act on the whole hunk. Which actions appear follows the diff being viewed, so an unstaged diff offers stage and discard, a staged one offers unstage, and an untracked file offers stage only. If the file changes on disk between opening the diff and acting on it, the action is refused rather than applied to the wrong lines, and the diff reloads so the choice can be made again.
  • Selective stashing. The same line and hunk selection works for stashes, so chosen changes go into a stash of their own while everything else stays in place, staged files included. A stash can be inspected without applying it, applied with the index restored so the staged and unstaged split returns as it went in, or checked out onto a new branch when it no longer applies in the current location. The filter box above the stash list searches stash messages and the files inside each stash. Only tracked files can be stashed piece by piece, because an untracked file has no previous version to leave behind.
  • Rich unified and side-by-side diffs. Split and Unified modes switch between side-by-side and single-column review, and the choice is remembered as files are changed. Words that actually differ within a changed line are highlighted, and indentation is treated as a change of its own so re-indenting reads as re-indenting. The whitespace setting controls display only, while staging, unstaging and discarding always work from the full diff, so a hunk staged with whitespace hidden still carries its whitespace changes. Images are shown before and after on a checkerboard, and other binary files report old and new sizes.
  • Visual interactive rebase with commit splitting. The rebase planner lists commits above the chosen base in the order Git reads them and supports pick, reword, edit, squash, fixup and drop, with arrow reordering and an autosquash preview that shows where fixup and squash commits would land. When the rebase stops for a conflict or at an edit, the same window shows the current step, the conflicted files, and offers Continue, Skip, Abort and Split this commit. Splitting undoes the commit into the working tree with nothing staged so each part can be staged and committed in turn. The rebase survives closing the window or restarting the application.
  • Conflict resolution workflow. Merge, rebase, cherry-pick and revert can all enter the conflict workflow, which parses conflict blocks in an editor and offers Keep Ours, Keep Theirs or manual editing of the combined result. Save and Resolve writes and stages the file, and the process repeats until no conflicts remain, after which Continue completes the operation or Abort abandons it. Because the meaning of ours and theirs depends on the operation, particularly during rebase, the resulting content is what should be reviewed. An external merge tool can be launched, and after it exits the application re-reads Git's state rather than assuming the file was resolved.
  • Safety Net recovery system. Undoable Operations keeps up to ten in-memory checkpoints per repository for merge, rebase, cherry-pick, revert and reset, and undoing hard-resets the branch to the saved pre-operation HEAD. Recovery Points are the durable half: before reset, rebase, merge, cherry-pick, revert, amend, undo-commit, branch deletion, stash drop, bulk discard, worktree removal, remote removal or prune, submodule deinitialize and patch apply, the position of every ref that could move is written to a file inside the repository's own .git directory, so it survives restarting the application. From a recovery point a branch can be created at a recorded position or the equivalent Git command copied.
  • Discarded file snapshots. Before a per-file or bulk discard, a copy of the file contents is stored in the operating system temporary directory, expires after twenty-four hours, and is capped at the thirty most recent entries per repository. Those copies can be restored to their original repository path from the interface. The warning shown before discarding can be disabled for a specific repository from the dialog. This is a convenience layer rather than a backup system, so irreplaceable work should be committed or backed up before destructive operations.
  • Worktrees. A worktree is a second working folder for the same repository, sharing remotes, history, configuration and the object store while keeping its own files, index and half-finished work. Worktrees can be created from a new branch, an existing branch or a detached commit; locked with a reason so Git refuses to prune or remove them; moved; relinked after folders were moved outside the application; pruned after a preview that lists what Git would forget; and removed, with a refusal for dirty or locked worktrees unless the folder name is typed. Removing a dirty worktree snapshots tracked staged and unstaged work into the shared object store first, and the confirmation warns that untracked files are not recoverable afterwards.
  • GitHub pull request creation. The pull-request button opens a preflight that verifies the repository has a GitHub remote, the GitHub CLI is installed and signed in, the branch is not detached, the head contains commits the base does not, and no open pull request already exists. The form shows the target repository, base and compare branches, ahead and behind counts, changed-file count and included commit subjects, and suggests a title and description without replacing text that was already edited. A draft or ready pull request can be created, maintainer edits allowed or denied, reviewers, assignees and labels added, and creation from a fork targeting its upstream repository performed. Creation runs through the GitHub CLI, so no token is stored.
  • Commit and tag signing. The Sign box beside the commit button signs a single commit, and Settings configures the repository to use the system Git configuration, an SSH key, a GPG key, or to never sign whatever the global configuration says. SSH mode offers the keys from registered SSH profiles, and settings are written to the repository's own Git configuration so a terminal in the same folder behaves identically. Signature status is reported as Verified, Unverified, Bad signature, or absent, and the distinction matters because Git reports a signed commit as unsigned when no allowed-signers file exists to check it against. If signing fails, no commit is made and the changes stay staged.
  • Visual history with commit actions. The History panel loads commits from all refs and draws colored branch and merge lanes, with branch and tag refs beside their commits and more history loading on scroll. Opening a commit shows the full SHA, author, date, message and changed-file list, and from that drawer the commit can be cherry-picked onto the current branch, reverted with a new inverse commit, tagged, or reset to in soft, mixed or hard mode. Per-file history is available for up to fifty commits with rename following. A Safety Net checkpoint is created before reset, though hard reset remains destructive.
  • Branch maintenance. Branch maintenance lists every local branch with where it tracks and how far it has diverged, whether it is already merged, whether anything has landed on it recently, and whether its upstream has been deleted. Branches can be filtered to merged, stale or orphaned ones and then pinned, renamed, re-pointed, or selected in bulk for deletion, with pinned and current branches never selectable. A bulk delete reports each branch's outcome rather than stopping at the first refusal. Prune remote shows what it would remove before removing it, and removing a remote or pruning its stale branches saves a recovery point first.
  • Search and comparison. Commit search finds commits by message or body, author, paths, refs and date range, with all filters optional and combinable, so an empty query with a path answers what touched this file and an empty query with a date range answers what happened last week. A search term that looks like an object name is resolved directly, making a commit findable by its hash even when its message does not mention it. Compare refs counts both directions from the merge base, lists what is unique to each side, and shows the changed files.
  • Built-in operations log and terminal handoff. The Terminal panel records what the application ran, written by the component that executes commands, so each line is the real argument vector with working directory, added environment, exit code and duration. Reads are folded behind a toggle because a single refresh runs more than forty Git commands and most are questions. Lines are filtered to the open repository or shown across all repositories, and the text is searchable. Buttons open Git Bash on Windows or a system terminal on each platform in the repository, carrying the repository's SSH identity through a GIT_SSH_COMMAND that names an agent-capable build with the same key.
  • SSH agent integration and passphrase vault. Selecting or unlocking a profile loads its key into the machine's native SSH agent after obtaining the passphrase from the unlocked vault or a one-time prompt, making the identity available to terminals, editors and coding agents launched for the repository. A key that is passphrase-protected is detected with ssh-keygen before ssh-add is invoked, which prevents the agent from waiting on a prompt no background process can answer. The optional vault encrypts saved passphrases on disk with AES-256-GCM using a key derived with scrypt plus a random salt and IV, and Lock removes session-owned keys one at a time without clearing identities from other applications.
  • Repository hub tools. One window holds the tools that act on a repository as a whole. Remotes shows fetch and push URLs separately, refspecs rather than assumptions, whether prune was set locally or inherited, and tests reachability with the account the repository uses. Submodules keeps the pinned commit apart from the working-tree commit so a row says which is out of step. LFS reports whether files are pointers or real bytes, previews every transfer, and can remove stale local hooks. Patches builds from commits, ranges or uncommitted work with a check-only mode. Bisect checks out the middle of a range and can decide by a saved command's exit code. Notes attaches text to commits in a separate ref, and Maintenance is the only place stale worktrees and merged branches can be cleared in bulk.
  • Coding agent launchers and external tools. Multi-Git can start a configured tool in a chosen worktree, passing the worktree as the working directory, arguments as separate values with no shell in the path, and an allowlisted environment rather than a copy of the application's. Detect installed searches the PATH for known CLIs and seeds an editable definition, and an optional starting prompt is passed as one argument and never recorded. Definitions for external diff, merge, editor, terminal and file-manager programs can be detected and edited, and on Windows the same tab can add an Open in Multi-Git entry to the File Explorer right-click menu under the user account without administrator rights.

The project is developed by Anthony Kopri and is distributed under the MIT license. The initial v1.0.0 release was published in 2024, and the current line is v3.0.0. Early versions focused on a new-repository wizard, first-run SSH setup, one-click ignore, confirmed file discard, and a redesigned interface with a commit history graph and SSH config synchronization. Version 2.2.1 migrated the application to TypeScript with a modular server and renderer, hardened process and path handling, and polished the SSH and vault interfaces. Version 3.0.0 expanded the workflow with native SSH-agent management, GitHub pull request creation, precision staging and selective stashing, richer diffs, interactive rebase, commit signing, search and branch maintenance, durable recovery, worktrees and multi-window groups, coding-agent launchers, repository-wide remotes, submodules, LFS, patches, bisect and notes, external tool definitions, cancellable operations, responsive panes, Unicode repository paths and configuration migrations. The application logic is predominantly TypeScript compiled into a bundled output directory, while packaging scripts and the terminal log window retain small JavaScript modules, and the interface communicates with a localhost JSON API that executes Git commands as argument arrays rather than through a shell.

Alternatives to Multi-Git

Latest Programs