Blazing 💥 fast terminal-ui for git written in rust 🦀



Blazing fast terminal client for git written in Rust


  • Fast and intuitive keyboard only control
  • Context based help (no need to memorize tons of hot-keys)
  • Inspect, commit, and amend changes (incl. hooks: commit-msg/post-commit)
  • Stage, unstage, revert and reset files and hunks
  • Stashing (save, apply, drop, and inspect)
  • Push to remote
  • Branch List (create, rename, delete)
  • Browse commit log, diff committed changes
  • Scalable terminal UI layout
  • Async input polling
  • Async git API for fluid control


For a RustBerlin meetup presentation (slides) I compared lazygit,tig and gitui by parsing the entire Linux git repository (which contains over 900k commits):

Time Memory (GB) Binary (MB) Freezes Crashes
gitui 24 s 0.17 1.4 No No
lazygit 57 s 2.6 16 Yes Sometimes
tig 4 m 20 s 1.3 0.6 Sometimes No


I do most of my git usage in a terminal but I frequently found myself using git UIs for some use cases like: index, commit, diff, stash and log.

Over the last 2 years my go-to GUI tool for this was fork because it was snappy, free, and not bloated. Unfortunately the free part will change soon and so I decided to build a fast and simple terminal tool to help with features I use the most.

Known Limitations

Currently, this tool does not fully substitute the git shell, however both tools work well in tandem.

gitui currently lacks essential features in git like push, pull, and checkout. The priorities are the basics (add, commit), and on features that are making me mad when done on the git shell, like stashes and hunks. Eventually, I will be able to work on features that could lead to making gitui a one stop solution to get rid of the shell entirely - but for that I need help - this is just a spare time project right now.

All support is welcomed! Sponsors as well! ❤️


For the time being this product is in alpha and is not considered production ready. However, for personal use it is reasonably stable and is being used while developing itself.

Arch Linux

There is an AUR package for gitui:

git clone
cd gitui
makepkg -si


sudo dnf install gitui


Available in dm9pZCAq overlay

sudo eselect repository enable dm9pZCAq
sudo emerge --sync dm9pZCAq
sudo emerge dev-vcs/gitui::dm9pZCAq

Homebrew (macOS)

brew install gitui

Scoop (Windows)

scoop install gitui

Chocolatey (Windows)

choco install gitui

Nix (Nix/NixOS)


nix-env -iA nixpkgs.gitui


nix-env -iA nixos.gitui

Release Binaries

Available for download in releases

Binaries available for:

  • Linux
  • macOS
  • Windows



Cargo Install

The simplest way to start playing around with gitui is to have cargo build and install it with cargo install gitui


To run with logging enabled run gitui -l.

This will log to:

  • macOS: $HOME/Library/Caches/gitui/gitui.log
  • Linux using XDG: $XDG_CACHE_HOME/gitui/gitui.log
  • Linux: $HOME/.cache/gitui/gitui.log

Color Theme

gitui should automatically work on both light and dark terminal themes.

However, you can customize everything to your liking: See Themes.

Key Bindings

The key bindings can be customized: See Key Config on how to set them to vim-like bindings.

Road(map) to 1.0

These are the high level goals before calling out 1.0:

  • upstream branches (#453)
  • simple pull (only for ff-merge) (#319)
  • merging with conflicts (#485)
  • log search (commit, author, sha) (#449,#429)
  • file history log (#381)
  • more tag support (#483)
  • file blame (#484)
  • visualize branching structure in log tab (#81)


  • Per line staging

    Per line staging

    Currently we can stage things only hunk by hunk or whole file at once. It would be nice to have ability to stage only current line or bunch of selected lines.

    Flow would look like something like this: We focus on diff panel and navigate to a hunk we want to work with. Select lines we want to stage with arrows and some modifier key (is tui allow that kind of thing?) and press [S]tage button. If there were no selection stage current line.

    Inspired by git-cola behavior, but it's a gui app.

    opened by non-descriptive 30
  • fix core-editor ignored (#414)

    fix core-editor ignored (#414)

    clean branch this time - i think.

    This fixes the following issues

    • core.editor config value ignored
    • config.get_str always fails (add new helper function)
    • external editor fails to launch if it has spaces in it (vscode on windows I'm looking at you)


    • I tried real hard to fix the 2 other config.get_str (in commit) but could not. I dont know enough about error conversions. I got it working but then clippy shot me down. I did verify that they always fail. If is set this will still return "unknown".
    • I did not fix the parsing of editor commands args that may have spaces in them (as per comments in the code)
    opened by pm100 27
  • pre-commit hooks do not run

    pre-commit hooks do not run

    I have been usuing gitui quite regularly for a few weeks and I am in love with it. The only downside is that pre-commit hooks are not running and sometimes I don't see errors until they hit CI.

    Describe the bug pre-commit hooks do not run.

    To Reproduce Create a commit in a repo with pre-commit hooks installed.

    Try with a sample pre-commit.

    pip instal pre-commit
    pre-commit sample-config > .pre-commit-config.yaml
    pre-commit install

    Expected behavior pre-commit hooks run after the message is entered.

    Screenshots If applicable, add screenshots to help explain your problem.

    Context (please complete the following information):

    • wsl/Debian 9
    • docker/stretch
    • GitUI Version: 0.10.1
    bug help wanted windows 
    opened by WaylonWalker 24
  • Branch popup

    Branch popup

    Implements a branch popup which can be accessed by pressing 'b' in the status tab. branch_popup A new branch can be created by pressing 'c' while the branch popup is open and a branch can be checked out by selecting the branch and pressing enter.

    This does currently work but it is still a work in progress.

    Linked to #91.

    opened by WizardOhio24 23
  • Linux builds, please?

    Linux builds, please?

    I currently use lazygit, but have a few gripes with it.

    I understand that this project is in very early stages, but I'd still want to try it.

    Having linux builds like other rust tools would be great, thanks!

    enhancement help wanted 
    opened by dufferzafar 21
  • Use gitui with remote repositories

    Use gitui with remote repositories

    Is your feature request related to a problem? Please describe. I would like to push and pull from remote branches.

    Describe the solution you'd like Potentially a tab beside Status and Log called Remote, the functions would be pull, push, fetch, and anything to do with remote branches.

    The functionality to push a local branch of some name to a remote branch of some other name like git push origin localdev:feature_remote should be included. I'm not a git poweruser, so I don't require much from remotes, I'm sure other people would have better ideas.

    Describe alternatives you've considered Ctrl+C to quit gitui, git push, gitui

    opened by alistaircarscadden 20
  • Fix for cursor not displayed in textinput (247)

    Fix for cursor not displayed in textinput (247)

    the space at the end of line should be NBSP telling tui not to eat it in text wrap mode but the code in tui is broken too.

    Fix posted to tiu

    In the mean time this fix uses '_' to get the underlined space at the end of line

    Comments are left in place explaining what to do when tui fixes this issue.

    opened by pm100 19
  • Add search bar at bottom of revlog

    Add search bar at bottom of revlog

    Closes #429, Closes #449, (part of 1.0 todo list)

    Adds a search bar at the bottom of the log tab which allows for searching commits. It works, but I'm not sure what keys are best for accessing this. Go to log tab then press s (suggested in #449), the search box will pop up and be in focus, type to search, the results will appear in the log where the arrow keys can scroll through them. Press esc to close the search box, then esc again to cancel the search and return to all commits.


    • [x] Async filtering
    • [x] Filter by sha (with :s)
    • [x] Filter by author (with :a)
    • [x] Filter by message (with :m)
    • [x] Filter by tag (with :t)
    • [x] Support for complement (i.e. not) filtering (with :!)
    • [x] Support for union filtering (with ||)
    • [x] Support for intersection filtering (with &&)
    • [x] Support case sensitive filtering (with :c)
    • [x] Support brackets and nested brackets in search
    • [x] Make a wrapper around git_log which supports filtering and have revlog use that instead of git_log, not going to implement because it might not be better right now

    Within the search:

    • :s xxx filters only shas for xxx
    • :a xxx filters only authors for xxx
    • :m xxx filters only messages for xxx
    • :t xxx filters only tags for xxx These can be combined to :sam(any order works, so :asm or :sma works as well) to search for all, which is equivalent to putting nothing at the start

    Complement filtering is possible with :!, which returns anything not containing what was searched for, for example to get all commits whose messages do not contain 'fix' or 'remove':

    • :!m fix &&:!m remove

    Case sensitive filtering is possible with :c, for example, to find messages which contain 'Fix' and do not contain 'fix':

    • :c Fix

    This also adds support for intersection filtering using &&(i.e only if 'x' and 'y'), for example, to find commits where author name contains 'richard' and the commits message has 'fix' in it:

    • :a richard&&:m fix

    And support for union filtering using ||(i.e or), for example to find any commits whose message contains 'fix' or 'move' or any commits which contain aabb':

    • :m fix ||:m move || aabb (notice spaces at start and end are irrelevant, they are trimmed, but : must come before a space if filtering by something).

    Intersection is currently always higher priority than union, for example, to find commit message which contain 'fix' and 'readme' or contain move = :m fix&&:m readme || move which is equivalent to ((:m fix&&:m readme) || move ).

    And so, for a more complex query:

    • :m fix && :m revlog ||:a richard &&:m status ||:s aabb ||:mc Remove || :!cm bigger

    For another example, show the commits which have tags where the commits contain 'pre' or ('fix' and 'CD'):

    • :t &&(:m pre ||(:m fix&&:m CD))

    Some screenshots





    opened by WizardOhio24 19
  • Use get_entry instead of get_str

    Use get_entry instead of get_str

    Related to #79 and #228.

    Beware that the additional tests most likely will fail locally because the local git config interferes with them. This PR is intended for testing whether there are issues on CI.

    opened by cruessler 19
  • Get vim keys to work

    Get vim keys to work

    Describe the bug I am not sure how to update the key bindings to make vim keys work for macOS.

    To Reproduce Steps to reproduce the behavior:

    1. Read how to set VIM key bindings here
    2. Run gitui one time so that default key bindings will be built.
    3. Examine the directory wither key defaults should be defined, $HOME/.config/gitui When running gitui the first time, a new file named key_config.ron is created with a number of struct based, ron, key bindings.
    4. Add the contents of vim_style_key_config.ron to the end of the key_config.ron.
    5. Run gitui. This results in a failure because of duplicate key bindings.
    6. Try again (start over) by removing the duplicates from the top of the file (the ones replaced by the items from vim_style_key_config.ron after appending the vim keys). This results in a failure message KeyConfig loading error: 16:18: Expected struct. The line and column numbers change but the result is the same no matter how I change the file.
    7. Try again (start over) this time by adding saving the vim_style_key_config.ron to the $HOME/.config/gitui directory as a file named key_bindings.ron. This also fails to set key bindings.

    Expected behavior

    I would expect that vim keys could be set, at the very least from a read of vim key bindings, perhaps like from here.

    Screenshots If applicable, add screenshots to help explain your problem.

    Context (please complete the following information):

    • OS/Distro + Version: macOS 11.6.1 (20G224)
    • GitUI Version: 0.18.0, installed from macports. gitui @0.18.0_2 (active)
    • Rust version: rustc 1.54.0 (a178d0322 2021-07-26)

    Additional context

    I am not sure what else to try

    opened by mmynsted 2
  • Bump crossterm from 0.20.0 to 0.22.1

    Bump crossterm from 0.20.0 to 0.22.1

    Bumps crossterm from 0.20.0 to 0.22.1.


    Sourced from crossterm's changelog.

    Version 0.22.1

    • Update yanked version crossterm-winapi and move to crossterm-winapi 0.9.0.
    • Changed panic to error when calling disable-mouse capture without setting it first.
    • Update bitflags dependency.

    Version 0.22

    • Fix serde Color serialisation/deserialization inconsistency.
    • Update crossterm-winapi 0.8.1 to fix panic for certain mouse events

    Version 0.21

    • Expose is_raw function.
    • Add 'purge' option on unix system, this clears the entire screen buffer.
    • Improve serialisation for color enum values.

    Version 0.20

    • Update from signal-hook with 'mio-feature flag' to signal-hook-mio 0.2.1.
    • Manually implements Eq, PartialEq and Hash for KeyEvent improving equality checks and hash calculation.
    • crossterm::ErrorKind to io::Error.
    • Added Cursor Shape Support.
    • Add support for function keys F13...F20.
    • Support taking any Display in SetTitle command.
    • Remove lazy_static dependency.
    • Remove extra Clone bounds in the style module.
    • Add MoveToRow command.
    • Remove writer parameter from execute_winapi

    Version 0.19

    • Use single thread for async event reader.
    • Patch timeout handling for event polling this was not working correctly.
    • Add unix support for more key combinations mainly complex ones with ALT/SHIFT/CTRL.
    • Derive PartialEq and Eq for ContentStyle
    • Fix windows resize event size, this used to be the buffer size but is screen size now.
    • Change Command::ansi_code to Command::write_ansi, this way the ansi code will be written to given formatter.

    Version 0.18.2

    • Fix panic when only setting bold and redirecting stdout.
    • Use tty_fd for set/get terminal attributes

    Version 0.18.1

    • Fix enabling ANSI support when stdout is redirected
    • Update crossterm-winapi to 0.6.2

    Version 0.18.0

    • Fix get position bug
    • Fix windows 8 or lower write to user-given stdout instead of stdout.
    • Make MoveCursor(Left/Right/Up/Dow) command with input 0 not move.
    • Switch to futures-core to reduce dependencies.
    • Command API restricts to only accept std::io::Write
    • Make supports_ansi public
    • Implement ALT + numbers windows systems.

    ... (truncated)


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    opened by dependabot[bot] 0
  • Open remote repository in the current branch

    Open remote repository in the current branch

    Is your feature request related to a problem? Please describe.

    For years I'm using the npm package git-open to open the remote repository in the current branch in the browser. This is very useful to create PR.

    I think that will be a great and useful feature to have in gitui

    opened by nucliweb 1
  • can't push/pull behind proxy

    can't push/pull behind proxy

    Describe the bug Git ui is not able to push/pull when behind corporate proxy

    To Reproduce Steps to reproduce the behavior:

    1. Commit a change
    2. Try to push it (press p) or
    3. open gitui
    4. Try to pull ( press f )

    Expected behavior Being able to push commits to remote when running behind porxy

    Screenshots When pulling following message comes up image

    but when git pull is run from same terminal it works

    $ git pull
    Already up to date.

    Context (please complete the following information):

    • PopOS (21.10) [ Ubuntu 21.10 ]
    • gitui 0.18.0
    • rustc 1.56.1 (59eed8a2a 2021-11-01)

    Proxy is set using environment variables http_proxy & https_proxy

    opened by kp2401075 3
  • Limit shown/loaded history

    Limit shown/loaded history

    Nice tool but not usable for the kernel as every modern branch is a million commits long. For this matter tig allows set main-options = -n 15000 in ~/.tigrc, would be nice to have a similar thing in gitui

    opened by aik 0
  • would be great to be able to search in branches

    would be great to be able to search in branches

    e.g. having / as a shortcut for search, n to jump to the next result etc

    opened by kyegupov 1
  • Missing some options to work on files/directories (create, delete, modify, rename, etc.)

    Missing some options to work on files/directories (create, delete, modify, rename, etc.)


    I've just found the project so maybe I'm missing something but I didn't find a way to invoke the editor ("Edit [e]" option) from the Files [3] tab to start modifying files. Also, I've not found the options to create, delete and rename files/directories through it.

    Maybe these options are out of the scope of the project, I don't know, but I think it'd be nice to have them for small and quick changes, thus avoiding context switches.

    Thanks for the outstanding job! Just keep it up!

    opened by chlopes 4
  • Font Color in changes macOS

    Font Color in changes macOS

    Is there a way to change the font color in changes? The background color is so bright and the font so light that there is not much contrast and it is hard to read with my terminal settings image

    opened by areyouready 2
  • [Feature] Allow checking out specific commits in log view

    [Feature] Allow checking out specific commits in log view

    Hi! I just found this project and think it's pretty cool!

    Anyway, I think it would be nice if the log view had an option to enter detached HEAD state and checkout the selected commit.

    opened by Omnikar 0
  • getting rid of chrono dependency

    getting rid of chrono dependency

    • [ ] right now gitui depends on chrono directly but the few uses can easily use time directly
    • [ ] we use simplelog which uses chrono, which should be easy to migrate to flexi_logger unless simplelog gets rid of the chrono usage: issue
    • [ ] syntect (open issue) depends on plist (which has a fix merged) which uses/used chrono

    this would fix #950 and #951

    opened by extrawurst 1
Stephan Dilly
Founder and Dev at and
Stephan Dilly
Terminal bandwidth utilization tool

bandwhich This is a CLI utility for displaying current network utilization by process, connection and remote IP/hostname How does it work? bandwhich s

Aram Drevekenin 6.7k Nov 29, 2021
Terminal disk space navigator 🔭

diskonaut How does it work? Given a path on your hard-drive (which could also be the root path, eg. /). diskonaut scans it and indexes its metadata to

Aram Drevekenin 1.1k Nov 26, 2021
A fast duplicate file finder

The Directory Differential hTool DDH traverses input directories and their subdirectories. It also hashes files as needed and reports findings. The H

Jon Moroney 299 Nov 21, 2021
A simple, fast and user-friendly alternative to 'find'

fd [中文] [한국어] fd is a program to find entries in your filesytem. It is a simple, fast and user-friendly alternative to find. While it does not aim to

David Peter 19.6k Nov 23, 2021
Super-fast command aliases with arguments.

Bonnie Bonnie is a command aliasing tool. If you have a super-long command that you have to run all the time, Bonnie is for you! Just define the comma

arctic_hen7 26 Nov 20, 2021
A modern replacement for ps written in Rust

procs procs is a replacement for ps written in Rust. Documentation quick links Features Platform Installation Usage Configuration Features Output by t

null 2.4k Nov 21, 2021
A bash-like Unix shell written in Rust

Cicada Unix Shell Cicada is a simple Unix shell written in Rust. Documents Install cicada Environment Variables Cicada Builtins Completion RC File His

Hugo Wang 864 Nov 22, 2021
Performs distributed command execution, written in Rust w/ Tokio

Concurr: Distributed and Concurrent Command Execution, in Rust This project is dual licensed under MIT and Apache 2.0. Originally inspired by the GNU

Michael Murphy 80 Oct 21, 2021
A TUI system monitor written in Rust

NO LONGER MAINTAINED. For a similar program, check out ytop Another TUI based system monitor, this time in Rus

Caleb Bassi 2k Nov 18, 2021
A non-root version of traceroute written in Rust

tracepath-rs A non-root version of traceroute written in Rust for Linux.

Peter Malmgren 5 Nov 22, 2021
Dancing Links (“dlx”) solver for the exact cover problem, written in Rust. Can be used to create a sudoku solver.

Dancing Links “dlx” Dancing Links solver for “algorithm X” by Knuth This solver solves the exact cover problem using “algorithm X”, implemented using

bluss 2 Oct 15, 2021
A system handler to get information and interact with processes written in Rust

A system handler to get information and interact with processes written in Rust

Guillaume Gomez 706 Nov 22, 2021
LeftHK - A hotkey daemon written in Rust

LeftHK LeftHK - A hotkey daemon written in Rust THIS IS BETA SOFTWARE The configuration file should be created in ~/.config/lefthk/ and called config.

null 5 Nov 23, 2021
minimalistic command launcher in rust

rrun Note: Apart from the occasional fix, this project is not actively developed anymore. rrun works fine and should run/compile for the time being on

null 98 Nov 17, 2021
Yet another fancy watcher. (Rust)

funzzy Yet another fancy watcher. (Inspired by antr / entr) Configure execution of different commands using semantic yaml. # .watch.yaml # list here a

Cristian Oliveira 158 Nov 17, 2021
A more intuitive version of du in rust

Dust du + rust = dust. Like du but more intuitive. Why Because I want an easy way to see where my disk is being used. Demo Install Cargo cargo install

andy.boot 3.2k Nov 26, 2021
Fuzzy Finder in rust!

Life is short, skim! Half of our life is spent on navigation: files, lines, commands… You need skim! It is a general fuzzy finder that saves you time.

Jinzhou Zhang 3k Nov 29, 2021
A library to listen to global hotkeys in Rust

Rust Hotkey A library to listen to global hotkeys in Rust How to use See the examples folder for how to use this library. OS Support This lib aims to

James Birtles 31 Oct 10, 2021
🔮 Futuristic take on hexdump, made in Rust.

hex (hx) Futuristic take on hexdump. hx accepts a file path as input and outputs a hexadecimal colorized view to stdout. $ hx tests/files/alphanumeric

Julian Sitkevich 302 Nov 22, 2021