Creating powerful git aliases
Multi-line and multi-command
Recently, while trying to improve my work flow, I noted I have several patterns that I would love to capture as a single command.
For example, I had the following common flow:
- While working on a branch, find out that I have to do work on another branch (due to a PR comment, for example)
- Check the status of my current work folder
git status
- Commit my current dirty files as WIP (or throw them away if not needed)
git reset --hard
# OR
git commit -a -m "WIP"
- Check out the bug branch that requires work
git checkout bug/4123
- And then, when I am done working, switch back, and possibly restore my WIP commit
git checkout feature/323
# Restore WIP commit if needed
git reset --soft HEAD~1
Since it was a pattern that was repeating constantly, I was looking for a way to turn it into a git alias.
After some initial Bash struggling, I had the following 3 aliases:
- safereset — A utility alias that checks for dirty files, and allows to the user an option to discard, commit WIP or cancel the operation
- switch — Uses safereset, then changes a branch. If a WIP commit is found, it is restored.
- switch-back — Uses switch alias to switch to the last branch that was checked out.
A practical usage of these aliases in a scenario I’ve described above would be:
# A PR comment was posted while I am in middle of feature
git switch bug/4123
# Fix bug
git switch-back
The code is quite simple, though it does has some unpleasant escaping. On the technical level, it allows me to make git aliases, in the future, that:
- Use Bash functionality in Windows easily
- Multi-command aliases
- Multi-line aliases (easier to read/debug)
- User input
- Basic error handling via trap
Here is the code itself, ready to be pasted: