A Quick git/vim Workflow Tip
Git makes it incredibly easy to work on a lot of a project’s features at once, hopping quickly back and forth between branches. I love this ability, but I hate remembering what exactly it was that I was working on in a particular branch. I know it had something to do with a particular bug, but I’ve no idea anymore which files I was fiddling around with to fix it.
Enter git vim
. I’ve set up two trivial alias in my ~/.gitconfig
file to
either show me a list of files effected by a particular revision or range, and
to directly open them in my editor of choice so that I’m back to work as
quickly as possible.
[alias]
...
fshow = ! sh -c 'git show --pretty="format:" --name-only $1 | grep -v "^$" | uniq | sed -e "s#^#`git rev-parse --show-toplevel`/#"' -
vim = ! sh -c 'vim `git fshow $1`' -
mate = ! sh -c 'mate `git fshow $1`' -
edit = ! sh -c '$EDITOR `git fshow $1`' -
The first alias calls git show
to get a list of all the files touched by a
revision or range, filters out empty lines, and ensures that the paths are
absolute after deduplicating the list of files. Any
valid revision or range will work: HEAD
, 37ad159
, master..
, etc.
To see a list of files changed over the last four revisions, I could type:
$ git fshow HEAD~5..
lib/rocco/layout.rb
lib/rocco/layout.mustache
lib/rocco.rb
rocco.gemspec
test/helper.rb
test/test_reported_issues.rb
To open those files for editing, I’d use the second alias:
$ git vim HEAD~5..
If I wanted to open the files in TextMate instead, I’d use the third:
$ git mate HEAD~5..
Or, if I was clever enough to set up an $EDITOR
environment variable (which
I should do, given that it’s used all over the place on the shell), I could
use the last alias to open the files in whatever program that was set to:
$ git edit HEAD~5..
I can hop from branch to branch, and open all the relevant files quickly and easily. It’s a small thing, but it’s made a big difference in my workflow over the last week or three.
— Mike West