There certainly are lots of great tools for working with git. I've been using SmartGit/Hg for years to help visualize aspects of git repositories, commits and making changes. Here's a list of how SmartGit/Hg adds value to my development process:
Note: the official name of the product is now SmartGit/Hg, however I'm focusing only on the git portion of it.
The Index Editor
- A 3 way view of both HEAD, index and working tree!
- I can manually edit the index and the working tree.
- Each highlighted difference can be moved to the index or out of the index with shortcut keys or mouse clicks on the "x" and "<<" icons.
- It helps me keep my mind around what's in the index versus the working tree.
- Fantastic view of commits I haven't pushed remotely (shows this based on the current branch and it's remote tracked branch).
- I can right click to join commits, edit commit messages and reorder commits all without having to remember the intricate commands involved in an interactive rebase :)
- And, it prevents me from changing pushed commits!
- Prior to commit I can use short cut keys to step through changes across all files. This makes commit reviews very effective. Plus, I am using the advanced visual diff provided by SmartGit/Hg, not a unified diff of lines added/removed or otherwise.
- Amending the last commit -> it's just a check-box (or shortcut key) on commit and it pulls in the last commit message, very slick!
- Shortcut key to amend last commit message, F2 in Windows which seems natural :)
- Shortcut key to undo last commit (soft reset), Ctrl+Shift+K in Windows, the "opposite" of committing Ctrl+K
- Fantastic log tool with the ability to turn branches on/off, show lost commits, remote branches and stashes all in one spot. Also, I can easily look at the log of individual files and directories.
- Lost Heads shows unreachable commits so if I make a mistake I can get commits back. This also helps me understand how some things like a rebase in git work, by seeing the original versus new commits.
- Merging, cherry picking, reset and rebase are as simple as right clicking a commit in the log. No need to mess with the myriad of commit references (shas, branches etc). I can focus on what not how.
- The diff tool goes above and beyond most diff tools to show what code was removed, added, changed etc with different coloring and highlighting that flows across diff panels, even when scrolling through changes.
- See the swooshes indicating things removed from the index in purple.
- Things added in the working tree as green.
- Pink for changes to a line.
- All the little "x" "<<" ">>" actions to undo these changes.
- Can quickly switch diff from HEAD v Index to Index v Working Tree.
- When I hit a merge conflict I can quickly can step through a three way merge of each conflicted file.
- For each conflicting hunk of a file I can choose which way changes should flow and use short cut keys to make corrections in a very visual manner which I personally think makes resolving merge conflicts much less of a hassle.
- I get the same goodness of "x" "<<" ">>" actions like in the diff above.
Concise file status view
- Helps track changes to both the index and working tree and see their state at a glance.
- It automatically updates to reflect changes so I can quickly glance at what files I've changed.
- I don't have to worry about paths and complex command line status output.
- I can sort index state in the status view to show conflicted files at the top in a merge conflict to quickly resolve things.
- File filters to show/hide ignored files, unchanged files, new files and staged files.
- Can also search for files by name, as I type it updates.
- Each window within the interface can be customized for placement and size, allowing me to focus on the things that I use most frequently.
- There are two views too, Main and Review that each can be customized separately. I use main to work with my repository in general (logs, branches, outgoing commits) and I use review to work on a particular commit(s) (message, diff, changed files).
Abstracts away SVN :)
- Will clone the svn repository and setup a local git repository
- Naturally, my work is rebased on integrating with the central SVN repository
- All the power of git for local commits without manually setting this up
Abstractions Apply to Hg
- Seamlessly work with an Hg repository, can forgot most of the nuances between git and Hg.
- All the interactive rebase shortcuts, that work with git, work with Hg too (squash, drag and drop reorder, edit messages)
- SmartGit/Hg takes care of configuring the appropriate Hg extensions!
- I can focus on what, not how, of cleaning up and organizing my local commits before pushing
- Ctrl+Z in Windows to discard changes in a file(s), seems very natural to me :)
- Stage/unstage buttons front and center in the UI, no need to remember tedious CLI operations and pathing to stage/unstage files
- gravatar to show pictures of authors :)
- Integration with lots of hosting providers, quickly clone repositories
- Fully customizable shortcut keys.
- SmartGit/Hg is constantly being updated with great new features.
I personally prefer both the CLI and SmartGit/Hg when working with git repositories. I find that using SmartGit/Hg lets me focus more on the concepts of git and less on the specifics of executing commands. SmartGit/Hg provides nice visual confirmation of what I'm doing while providing all the power of keyboard control.