{"id":51097067,"url":"https://github.com/asidko/gitgit","last_synced_at":"2026-06-24T07:31:08.091Z","repository":{"id":365225099,"uuid":"1271059689","full_name":"asidko/gitgit","owner":"asidko","description":"Full-fledged git in your terminal - the JetBrains Git client, in a TUI","archived":false,"fork":false,"pushed_at":"2026-06-16T11:09:33.000Z","size":1298,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T13:10:51.980Z","etag":null,"topics":["cli","developer-tools","git","git-client","ratatui","rust","terminal","tui"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asidko.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-16T09:45:47.000Z","updated_at":"2026-06-16T12:12:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/asidko/gitgit","commit_stats":null,"previous_names":["asidko/gitgit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/asidko/gitgit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asidko%2Fgitgit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asidko%2Fgitgit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asidko%2Fgitgit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asidko%2Fgitgit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asidko","download_url":"https://codeload.github.com/asidko/gitgit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asidko%2Fgitgit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34722609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","developer-tools","git","git-client","ratatui","rust","terminal","tui"],"created_at":"2026-06-24T07:31:07.509Z","updated_at":"2026-06-24T07:31:08.076Z","avatar_url":"https://github.com/asidko.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gitgit\n\n**Full-fledged git in your terminal - the JetBrains Git client (IntelliJ, PyCharm,\nWebStorm), in a TUI.**\n\nThe full JetBrains Git panel - commit graph, diff viewer, branch / stash / patch\ntools - keyboard and mouse, in your terminal. The diff is live, too: edit the working\nfile right inside it (click, type, `Ctrl+S`) - no separate edit mode, no `$EDITOR`.\n\n![gitgit](docs/screenshot.png)\n\n[![Rust](https://img.shields.io/badge/built_with-Rust-orange.svg)](https://www.rust-lang.org)\n[![TUI](https://img.shields.io/badge/UI-ratatui-blueviolet.svg)](https://ratatui.rs)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n## Why\n\nMost terminal git tools show you a diff and make you leave to change it. gitgit\ncollapses the loop: the working file is live and editable right in the diff, with\nreal editor affordances and syntax highlighting on both sides. Browse history on the\nleft, edit the present on the right.\n\nIt drives a **real repository** (no demo mode): reads through `git2`, and routes\nevery write to the system `git` so your hooks, config, and credentials all apply.\n\nRight-click any commit for the actions the JetBrains panel gives you - cherry-pick,\nrevert, reset, interactive rebase, create patch, archive:\n\n![commit context menu](docs/menu.png)\n\n## Features\n\n- **Editable diff** - the synthetic `\u003ccurrent\u003e` row's right side is your working\n  file; edit, then `Ctrl+S` (or autosave on navigate). History rows are read-only\n  \"what this commit changed\".\n- **Mouse-first editor in the diff** - click to place the caret, drag / double-click /\n  triple-click to select, plus full keyboard selection, clipboard, undo/redo, and\n  syntax highlight - side-by-side or unified.\n- **Commit graph log** - hollow node = unpushed/working, filled = pushed; branch and\n  tag chips whose fill encodes local vs remote. `\u003ccurrent\u003e` row pins the working tree\n  on top with a live `+N ~N -N` badge.\n- **Full git workflow** - commit / amend / tag, branches / merge / rebase pickers,\n  one-click \"Update Project\" (smart fetch + ff-pull), stash, create / apply patch,\n  manage remotes, archive a commit or the tree.\n- **Per-file and bulk ops** - right-click a file, folder, or a multi-selected set for\n  commit / rollback / patch / compare / history / blame. Multi-commit cherry-pick and\n  numbered patch-series from the log.\n- **Blame** - a per-line blame gutter beside the editable diff (`View \u003e Blame`), plus\n  a one-shot full-file annotate overlay.\n- **Fast filtering** - filter the log by branch, user, or date; live file search; a\n  remembered search history.\n- **Diff comfort** - word wrap, whitespace glyphs, fold unchanged regions, a draggable\n  horizontal scrollbar for long lines, per-hunk revert.\n- **Auto-refresh** - the panes track on-disk changes via a cheap 2s status poll, no\n  flag needed; an open editor buffer and caret survive the refresh.\n- **lazygit muscle memory** - a context-sensitive bottom hint bar and bare keys\n  (`c` commit, `p` pull, `P` push, `S` stash, `?` keys). Mouse fully supported too.\n- **Sticky** - toggles, pane splits, and search history persist across runs.\n\n## How it compares\n\ngitgit stands on the shoulders of tools worth admiring. Where they stop is roughly\nwhere it begins:\n\n- **[lazygit](https://github.com/jesseduffield/lazygit)** - fast and feature-packed,\n  but the diff is dense and unified-only, hard to read at a glance. gitgit makes the\n  diff the main event: spacious side-by-side, syntax-highlighted, foldable - and editable.\n- **[hunk](https://github.com/modem-dev/hunk)** - a beautiful, focused diff/review\n  experience and nothing else. gitgit takes that \"the diff is the product\" idea and\n  wraps a whole git client around it - log graph, branches, stash, remotes, patches.\n- **[gitui](https://github.com/gitui-org/gitui)** - a superb client whose author keeps\n  it keyboard-only on purpose: *\"mouse support is not really a focus for me\"*\n  ([#226](https://github.com/gitui-org/gitui/issues/226)). gitgit makes the opposite\n  bet - it is mouse-first, built around click-to-edit, drag-to-select, and wheel-scroll -\n  without giving up a single hotkey.\n\n## Install\n\nPrebuilt binary (Linux / macOS, x86_64 / arm64) - installs to `~/.local/bin`:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/asidko/gitgit/main/install.sh | sh\n```\n\nRemove it with the same script:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/asidko/gitgit/main/install.sh | sh -s -- --remove\n```\n\nOr build with Cargo (any platform with a Rust toolchain):\n\n```sh\ncargo install --git https://github.com/asidko/gitgit\n```\n\n## Usage\n\nRun it inside any git repository:\n\n```sh\ngitgit\n```\n\n![keybindings](docs/keybindings.png)\n\nKey bindings (also under `?` in-app):\n\n- **Navigate** - `Tab` cycles Log / Files / Diff; arrows move; mouse clicks and the\n  wheel work everywhere.\n- **Repo** - `c` commit, `p` pull, `P` push, `S` stash; the top `Git` menu has the rest.\n- **Log** - `space` marks a commit, `Shift+Up/Down` range-marks (cherry-pick / patch a set).\n- **Editor** (on the `\u003ccurrent\u003e` diff) - type to edit, `Ctrl+S` save, `Ctrl+Z/Y` undo/redo,\n  `Esc` leaves editing.\n- **View** - `s` side-by-side toggle, `d` diff, `W` whitespace; `View` menu for word wrap,\n  hide-unchanged, blame.\n- **Quit** - `q` or `F10`.\n\nFlags:\n\n- `gitgit --watch` - also reload periodically (catches ref / remote changes a status\n  poll cannot see).\n- `gitgit snapshot \u003cW\u003e \u003cH\u003e [out.json] [--real]` - render one frame headless (used by the\n  tests / tooling).\n\n## Configuration\n\nOptional. gitgit reads `~/.config/gitgit/config.toml` if present (missing = sane\ndefaults), and remembers runtime toggles in `state.toml` beside it.\n\n```toml\n[repo]\npath = \"/path/to/repo\"   # default: current directory\n\n[view]\ndiff_mode = \"side\"  # or \"unified\"\nword_wrap = false\n\n[behavior]\nmouse = true\ncommit_cap = 300            # commits loaded before \"load more\"\n```\n\n## Build from source\n\n```sh\ncargo build --release      # binary at target/release/gitgit\ncargo test                 # unit + integration + golden-render tests\n```\n\n## Architecture\n\nA small Elm-style core: `apply(Msg)` is pure and IO-free, the runtime owns all IO,\nclock, and geometry, and layering is strict (`git -\u003e store -\u003e ui`, enforced by a test).\nAll git IO lives behind one `GitBackend` trait on a worker thread, so the UI never\nblocks. Rendering is a pure function of state; a golden snapshot test ratchets the\ndefault frame byte-for-byte.\n\n## License\n\nMIT - see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasidko%2Fgitgit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasidko%2Fgitgit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasidko%2Fgitgit/lists"}