I use git for version control in the development of my software projects. As it's frequently the case that I'm the sole developer of these projects, I've adopted a simple trunk-based-style branching strategy in which I make new commits to a devel
branch until deeming these changes stable enough to merge into master
. This allows me to edit commits in the development branch before "finalizing" them.
I found myself repeating the process of checking out the "production" branch, merging the development branch, and pushing—essentially "shipping" stable code—so I created a git alias. Let's check it out!
git aliases
git aliases allow you to specify alternative names for commands. For example, you can use an abbreviation for the checkout
command:
git config --global alias.co checkout
git co
Another handy feature is the ability to create an alias to a separate executable; this is done by prefacing the command with !
on the command-line using git config
:
git config --global alias.ship '!git-ship'
Remember to include the single quotes as !
is a special history expansion character in popular shells such as bash and zsh. Also, be sure this executable exists in your shell's PATH
.
git-ship
My alias points to a separate executable shell script that chains together multiple git commands:
#!/bin/sh
prod=${GIT_SHIP_PROD:-master}
dev=${GIT_SHIP_DEV:-devel}
git checkout $prod && git merge $dev && git push && git checkout $dev
These commands perform the following actions:
check out the production branch;
merge the development branch into production;
push the production branch to the default remote;
and check out the development branch to prepare for new commits.
The targeted branches can be changed using environment variables.
In the directory of a given project, I "finalize" development commits and "ship" them to the remote repository with:
git ship
And it couldn't be easier!