If you work with Git and GitHub on a large team, then you’re probably familiar with the idea of feature branches.
The core idea behind the Feature Branch Workflow is that all feature development should take place in a dedicated branch instead of the master branch.
Essentially, we want to keep the master
branch “green” and always deploy-able to the production environment. This way, we can easily maintain and push new code to master
while continuing to build out features on separate branches.
Environment Setup
At Code School, we are constantly iterating to improve our codebase. We utilize feature branches and Pull Requests on GitHub in order to push changes. I’ve made optimizations to my local setup to speed up my feature-branch-to-pull-request workflow.
Bash Function
First things first, let’s set up a Bash function. This function can be added to the ~/.bash_profile
(or any equivalent file that’s loading the shell environment settings).
# ----------------------------------------------------
# Remote Tracking Branch
# -> Creates a new branch and pushes that branch to remote
# ----------------------------------------------------
#
# $1 - the branch name
#
# Usage: `git_remote_tracking_branch fix_sign_up_form_styles`
#
function git_remote_tracking_branch() {
git checkout -b $1 && git push -u origin $1
}
It’s a simple function. It creates a new branch and pushes that branch (as a tracking branch) to the remote. So, for example, if there’s a particular GitHub issue to fix, we could, from master
, type git_remote_tracking_branch fix_homepage_animation
. The function creates the new branch locally and immediately pushes it to the remote.
Tip: The function name should autocomplete, so git_
followed by a tab
should autocomplete the function name (assuming there are no other git_
functions). Also, you can always create an alias
for something even shorter.
Hub
By itself the above function is useful, but let’s speed up the next part of the workflow: creating a Pull Request on GitHub. To do this, we’ll use Hub, which is a command-line tool from GitHub. You can install it through Homebrew, an excellent package manager for OS X that you should be using, if you aren’t already.
brew install hub
With that installed, we have access to the hub
command, which lets us perform a ton of GitHub-specific actions, as well as some more convoluted Git actions, such as:
- Cloning repositories
- Creating repositories
- Adding remote URLs
- Forking
- Submitting Pull Requests
- And a lot more…
For our purposes, we’re interested in the hub pull-request
command. Once we’ve made our changes on our feature branch and we’re ready to submit the Pull Request, we don’t even have to open GitHub; we can do it all from the command line!
hub pull-request
That command will fire open our editor (or whatever the value of git config core.editor
is) to set the title and body of the Pull Request.
To make it even easier, we can set an alias
for the hub
pull-request
command: alias hpr='hub pull-request'
.
Flow
Alright, now that we’ve got everything set up, what does the overall flow look like?
$ git_remote_tracking_branch fix_header_style_bug
-> Make changes...
$ hub pull-request (or our 'hpr' alias, if set)
-> Add Pull Request title/body...
-> Save and close the file.
That’s it! We created our feature branch, made our changes, and opened a Pull Request with a nice, quick, efficient workflow.