5th
Git Utilities You Can't Live Without
I found some new git toys to add to my toolbox. Let me share them with you:
1. git-completion.bash
The git tarball contains a sweet bash completion routine for git. Stick a copy from git-1.5.4.3/contrib/completion/git-completion.bash to /opt/local/etc/bash_completion.d/git-completion and tab away!
DEMO
MacBook-Pro:webrat kamal$ git <tab><tab>
add cherry diff instaweb rebase show-ref
am cherry-pick fast-export log relink st
annotate ci fetch lost-found remote stash
apply citool filter-branch ls-files repack status
archive clean format-patch ls-remote request-pull submodule
bisect clone fsck ls-tree reset svnimport
blame co gc merge revert tag
br commit get-tar-commit-id mergetool rm up
branch config grep mv send-email var
bundle convert-objects gui name-rev shortlog verify-pack
checkout count-objects imap-send pull show whatchanged
checkout-index describe init push show-branch
MacBook-Pro:webrat kamal$ git br<tab>
br branch
MacBook-Pro:webrat kamal$ git branch <tab><tab>
HEAD master onchange origin/HEAD origin/master
Pastie link if you can’t see it in full.
I like that last bit the most. It found my available branches. It can do a whole lot more. From the inline README:
- local and remote branch names
- local and remote tag names
- .git/remotes file names
- git 'subcommands'
- tree paths within 'ref:path/to/file' expressions
- common --long-options
2. Git-aware PS1
Once you have the git-completion file, you can set your PS1 to display the current branch you are in.
For stock-looking Leopard PS1, stick this in your ~/.bash_profile
PS1='\h:\W$(__git_ps1 "(%s)") \u\$ '
DEMO
MacBook-Pro:src kamal$ cd webrat/
MacBook-Pro:webrat(master) kamal$ git co onchange
Switched to branch "onchange"
MacBook-Pro:webrat(onchange) kamal$
It’ll only display the branch if it senses you are in a git repo. Freaking sweet or what??
3. git.rake
I stole this Rake task from the Rubinius project. Stick it in your lib/tasks directory. Rake now has new git powers.
MacBook-Pro:webrat(master) kamal$ rake -T git
(in /Users/kamal/src/webrat)
rake git:push # Push all changes to the repository
rake git:status # Show the current status of the checkout
rake git:topic # Create a new topic branch
rake git:update # Pull new commits from the repository
Now everytime you want to work on something, create a git topic branch by issuing rake git:topic.
MacBook-Pro:webrat(master) kamal$ rake git:topic
(in /Users/kamal/src/webrat)
Topic name (default quick): feature_x
git checkout -b feature_x
Switched to a new branch "feature_x"
MacBook-Pro:webrat(feature_x) kamal$
Edit, edit, edit. Commit. Time to push upstream with rake git:push.
MacBook-Pro:webrat(feature_x) kamal$ rake git:push
(in /Users/kamal/src/webrat)
Switched to branch "master"
* Switching back to master...
* Pulling in new commits...
git fetch
git rebase origin
Current branch master is up to date.
* Porting changes into feature_x...
Switched to branch "feature_x"
git rebase master
Current branch feature_x is up to date.
* Merging topic 'feature_x' back into master...
Switched to branch "master"
git merge feature_x
Updating e25c574..0eb83d5
Fast forward
doc/README_FOR_APP | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
* Pushing changes...
git push
Counting objects: 7, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 414 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
refs/heads/master: e25c57 -> 0eb83d
To git@github.com:kamal/webrat.git
e25c574..0eb83d5 master -> master
* Switching back to feature_x...
Switched to branch "feature_x"
MacBook-Pro:webrat(feature_x) kamal$
Dude, seriously. All that switching around, fetching, rebasing, merging? I bet only Linus Torvalds remembers the whole sequence off the top of his head.
Hope you enjoyed that. Also, I’ve got 5 GitHub invites if anyone wants ‘em.
