Git GUIs
Notes & comparisons about various Git GUIs
While I do not need a GUI, certain operations can be done more easily with a GUI than the command-line tools: Visualizing changes, staging partial commits, cleaning up history, etc.
I seldom use any of the GUIs that I use to rebase or merge. I sometimes use a GUI to stage changes and then use the CLI to commit – the Vim plug-in gives me hints about when my subject or body lines are too long and has all the features a full editor includes like line wrapping/paragraph filling.
Applications
SourceTree
Pro
- Commit message box has guide for body of commit.
- Easy to stage individual lines for commit.
- View contents of stash.
- Free (as in beer).
- Able to select a single branch to view; select parents to view.
- Configurable fonts (diff only).
Con
- No Linux; OS X only.
- Commit text box lacks summary/first line guide
- Commit amend only shows amendment
- Diffs only unified.
GitKraken
Pro
- Runs on Linux & OS X
- Commit graph might be best I've seen?
- Collapses multiple remotes with the same branch (fork-sync'd, e.g.) into little icons, rather than separate text labels for each
- But can be difficult to tell which branch is checked out
- Free (as in beer).
- Hide individual remotes.
- "Branch solo" hides all but selected branch.
Con
- No way to view contents of stash (?!?)
- Stash contents are there but they're sprinkled in-line with the branches, tags, etc, which is both good and bad
- Weird when I went to commit a change taken from the stash: Kept stashed save message as subject and wouldn't let me edit it.
- Needs external merge tool.
- Only unified, single file diffs.
- Fonts not configurable; diff font is ugly and too big. It can scale, however.
- Paid version available; some features in paid-only.
GitUp
Pro
- Side-by-side, all-files diff (have to select all files in working copy diff; automatic in log "Quick View").
- Log navigable with keyboard, but need trackpad, mouse to scroll commits.
- Easy to stage individual lines for commit (a little awkward w/side-by-side).
- Separate guidelines for summary & body of commit.
- Pretty easy to move a commit from the tip of one branch to another.
Con
- Log is not front-and-center; have to select (non-obvious) "Repository > Browse Head Ancestors". Even then, doesn't show full commit message without opening "Quick View".
- Doesn't set environment variables needed for pre-commit hook to tell if running from hook or not.
- No Linux.
- Fonts not configurable; fonts are fine for normal use but too small for presentation.
- Commit graph is attractive but:
- Multiple remotes with the same branches take way too much space.
- Can be too busy and sometimes I have a hard time telling what all the options do.
Note
- Has "Snapshot" feature, but I am uncertain what it is for – seems less useful than, say, PyCharm's "Local History", but that might be cause I don't leave GitUp running.
GitBox
Pro
Con
- Amazingly primitive.
- No commit graph.
- No internal diff viewer (presumably also no merge tool).
- Does not seem to support partial commits (see previous).
- No Linux; OS X only.
GitTower
Pro
Con
- Support partial application from stash but the only way to do so is by non-obvious drag-and-drop. Also unclear if it can do less than a hunk.
- No Linux; OS X only.
- Pricy at $80.
Github Desktop
TBD
Gitk/Git GUI
Pro
Con
Desired Features
These are features that seem to be lacking in general or might be missing. This is not an exhaustive list of requirements.
- Side-by-side diff.
- Side-by-side, all-files diff, like commits on Github: e.g. https://github.com/git/git/commit/72d917a7f9a5123ef7c0d6db306bbc0d385227e2
- History navigable with keyboard while viewing diffs (esp where linear)
- Much better for group code-reviews
- View contents of stash.
- Runs on Linux & OS X (I don't care about Windows).
- Commit text box has separate guidelines/fields for first line/summary and rest of commit.
- Easy to stage individual lines for commit.
- Works correctly with standard commit hooks (presents same environment to hook, for example).
- Commit graph is understandable.
- Select arbitrary branches/tags/remotes to include in commit graph.
- Compare commits as direct diff (diff between any two revs, either as entered text or by selecting w/mouse):
- Github can do this. Also difficult to find – requires editing URL.
- Compare commits as commit log:
- Github can do this, although it's a bit clunky – you get either a diff or a log of commits, but not both at the same time. Also difficult to find – requires editing URL.
- Commit amend shows what entire new commit looks like, not just what amend changes.
- Can be its own merge tool (doesn't require external merge tool).
- Selectively save/apply lines/hunks with stash:
- Typically requires staging, stashing w/keep staged, stashing staged, applying.
- Ability to "fixup" changes being staged for partial commit.
- For example, when renaming a Python function parameter (changes in both
def
and within body) and changing docstring in an unrelated way, one might want to stage the function parameter rename but not the docstring change. Often this results in the docstring in the index being moved above thedef
line. The only way I've found is to copy the existing file out of way, revert the docstring of the working copy and then staging, which is pretty tedious.
- For example, when renaming a Python function parameter (changes in both
- Worktree support.
- Support for gitflow-avh (esp "bugfix" branches).
- Configurable fonts(?!?).
- Free (as in beer).
- Free (as in freedom).
Nice to Have Features
Things that I like but don't bother me as much.
- "Squishier" diffs, like meld: http://meldmerge.org/images/meld-filediff-full.png
- Recognize ticket references in commits and make links.
- Ability to hide individual remotes from display, without really removing them.
- Diff stats.
- Git notes support.
- Uses git annotations to provide better diffs.
- Rewrite individual commits (like "
git rebase -i"
but less cumbersome; GitUp does this nicely).