Introduction

When working with Git, and software in general, the most important thing for me is that the act of using the application blends seamlessly into my workflow. It should feel natural, simple, and shouldn't slow you down.

I've worked with Git for a few years now, and like all things, I've kept track of my favorite tweaks and configurations. I'd like to share a few of the most awesome Git shortcuts I use on a daily basis.

Configuration

First, let's talk about a few configuration options that every engineer should be familiar with.

A Damn Good Difftool

When invoking Git's difftool and mergetool, instead of relying on Git's (admittedly simple and awesome) to help you resolve conflicts, I recommend the brilliant Kaleidoscope OS X App.

This app is incredibly useful for comparing differences in files, be it text, image, or even entire directories.

rerere

To enable rerere:

git config --global rerere.enabled 1

rerere, short for reuse recorded resolution, is a lesser-known feature of Git which allows a user to replay already-resolved merges.

This is an extremely nice feature that will automatically re-resolve any merge conflicts that you resolved in the past when using rebase or merge(with your freshly installed Kaleidoscope mergetool).

As an aside, if you incorrectly resolve a conflict, you can always use git rerere forget <pathspec> to force Git to forget!

autosetuprebase

To enable autosetuprebase:

git config --global branch.autosetuprebase always

The autosetuprebase option will tell Git to automatically rebase instead of merge in new changes when pulling. Settings this configuration option to always has a subtle difference from the default setting of true. always will not only change the behavior on remote branches, but on local branches as well.

I prefer this setting to the default, as it keeps all commit history instead of merging in new changes as a single merge commit. This fits inline with my general strategy of keeping commit history very succinct and clean. I'm a big fan of fixup and squash commits before bringing new features over to a develop or master branch.

It's important to note that any existing branches will retain their current configuration on a branch-by-branch basis.

autosetupmerge

To enable autosetupmerge:

git config --global branch.autosetupmerge always

Often mistaken as the companion setting to autosetuprebase, autosetupmerge is quite different.

autosetupmerge specifies whether git branch and git checkout -b should pass the --track flag by default. Setting this to always causes both remote and local branches to automatically create new branches which track their parent.

shove

A super useful alias, git shove is generally my first command fired off after creating a new branch.

What shove does is perform a git push -u origin <current_branch>. You can think of it as a nice first step to tell your origin that you've created a new local branch you want to track remotely as well.

lg

git lg is a brilliant configuration to output the git log command in a readable, color-coded format that shows a GUI representation of your branches. Not only does it show where branches begin and end, it shows the commits they contain, and how they replayed onto other branches! Super handy.

git cleanup

git cleanup deletes any branches in your local that have been merged into the master or develop branches. This is handy to run from time to time to purge unused local branches.

Hub

If you use Github, hub is the perfect addition. hub is a command line utility that allows awesome interaction with Github, like creating pull requests, forking, and interacting with remote branches almost as if they were local.

For a pro-tip, alias hub to the git command:

eval"$(hub alias-s)"

I hope these tips are helpful -- if you learned anything, or have any comments, please post below! I'm happy to add more or follow up.