tl;dr I use bgg to shortcut a lot of tedious git commands.
Once a certain pattern appears where you find yourself doing the same thing over and over the first thing that should spring to mind is: let's automate that!
So a couple of years ago I started writing simple Python scripts that would wrap various git operations so I could do things like
G merge or
G rebase. That has helped me tremendously and when I at first showed these scripts to some people I was amazed how unimpressed they were. I guess that's because they have their own scripts or a geeky reluctance to adopting someone elses shortcuts unless you've personally be apart of going from tedious to shortcut.
So, a crucial part of my work here at Mozilla is to look at a Bugzilla and start a topic branch based on it and when it's done, push that into a Pull Request on GitHub.
The first command is
. It takes a single optional argument. If an argument is provided it has to be a Bugzilla bug number. If you supply a Bugzilla ID it will fetch the title of that bug (assuming you're online) and store that so that it can be used to mention it in the git commit message. For example:
(airmozilla):~/dev/MOZILLA/AIRMOZILLA/airmozilla (master)$ G start 1174316 You're currently on branch master Summary ["Start duration fetching when stopping a live event"]: Switched to a new branch 'bug-1174316-start-duration-fetching-when-stopping-a-live-event'
The git branch name becomes a "slugified" version of the bug summary. But note, it merely sets the default. I could override it if I want to.
Then you do some work on it and when you're done you type the next command;
G commit. It basically runs
git commit -a -m "..." using the bug number, the bug summary, optionally asking if you want to prefix the commit message with
and then pushed it to your fork. Example speaks for itself:
(airmozilla):~/dev/MOZILLA/AIRMOZILLA/airmozilla (bug-1174316-start-duration-fetching-when-stopping-a-live-event *)$ G commit MSG: bug 1174316 - Start duration fetching when stopping a live event OK? [Y/n] Add the 'fixes ' prefix? [N/y] y NOW, feel free to run: git checkout master git merge bug-1174316-start-duration-fetching-when-stopping-a-live-event git branch -d bug-1174316-start-duration-fetching-when-stopping-a-live-event OR git push peterbe bug-1174316-start-duration-fetching-when-stopping-a-live-event Run that push? [Y/n] To email@example.com:peterbe/airmozilla.git * [new branch] bug-1174316-start-duration-fetching-when-stopping-a-live-event -> bug-1174316-start-duration-fetching-when-stopping-a-live-event
You get the picture. It's interactive and mostly you just hit enter and it does stuff saving you copious milliseconds.
Other noteworthy commands:
- whilst on a branch, jumps over to the master branch, updates from the origin, then goes back to the branch you were on preparing you for an interactive git rebase.
G merge - goes over to the master branch, merges the branch you were on and if it works out, deletes the branch.
G getback - you're in a branch you know was merged (using GitHub's green merge button), it switches to the master branch, updates master and deletes the local topic branch (that was merged) and deletes the remote topic branch on your fork.
G cleanup [search] - you're on some other branch other than the one you search for. It finds that branch (if only 1 match) and does that
G getback does.
G branches [search]
- lists all your branches sorted by most recently worked on last also indicate how long ago you worked on it and if it has already been merged.
The reason I'm mentioning this isn't to convince you to use my tool to do your git but perhaps to inspire you to write your own scripts that wrap things you find yourself doing repetitively.
I know my own battle isn't over. I'm still finding things that I have to do additionally on an almost perfectly predictable basis. Thankfully I now have an infrastructure to add more scripting.