Here at Clear Measure we like to think we know what’s what and how’s how. When it comes to being powerful with Git, there’s still (often) no beating the command line by leveraging Git aliases. Here are some we won’t live without.
Disclaimer
We can’t and won’t take credit for all these great Git gems. We’re all indebted to Phil Haack.
Include my Git Aliases | You’ve Been Haacked
Git Aliases
Mike Sigsworth
I have two aliases from Phil Haack that I use pretty regularly.
up = !git pull --rebase --prune $@ && git submodule update --init --recursive
bclean = "!f() { git branch --merged ${1-main} | grep -v "${1-main}$" | xargs -r git branch -d; }; f"
bdone = "!f() { git checkout ${1-main} && git up && git bclean ${1-main}; }; f"
git bclean
deletes all merged branches.
git bdone
checks out the main branch, does a few things to update the local working copy, then does a git bclean
.
Whenever I am done with a PR and it’s been merged I always do a git bdone
. Keeps things tidy.
Corey Keller
git checkout -
git switch -
Returns to the last branch you were working on. That is the one I use all the time that I was not aware of for a while.
Quinn Wilson
I made this alias.
pushu = !git push -u origin HEAD
It’s for when you are pushing to a new branch and you don’t have an upstream repo set.
Charles Flatt
Here’s one I use almost every day. It shows a list of different files between two commits. Great for comparing branches.
diffshow = "!f() { git diff $1 ${2-HEAD} --name-status ; }; f"
# example 1
git switch clf/mybranch
git diffshow main
# example 2
git diffshow head~1 head~2
Leveraging some of Phil Haack’s work, I use git rbm
to rebase a branch onto mainline without leaving the branch. I use the -q
option a lot to reduce messages. Using a Powerline prompt tells me if I need to git push --force
.
# Get the mainline branch name
default = !git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
# Fetch remote mainline without leaving branch
fm = "!f() { DEFAULT=$(git default); git fetch -q origin $DEFAULT:$DEFAULT; }; f"
# Rebase onto mainline
rbm = "!f() { DEFAULT=$(git default); git fm; git rebase -q $DEFAULT; }; f"
This show me a pretty graph history of ten commits by default. Appending a number changes the amount of history.
hist = "!f() { git log -${1-10} --graph --date=short --pretty=format:\"%C(auto) %h %ad | %d %s [%an]\"; }; f"
# usage
git hist
git hist 20
You’ll hopefully never need this, but maybe it’ll inspire something similar. These steps create a Markdown report of a repository’s branches sorted by last committed date.
Check out all branches
git branch --list --all | clip
# paste into editor
# delete lines without "remote/origin/"
# replace "remote/origin/" with "git checkout "
# copy/paste commands to run in terminal
git checkout main
Then
echo "| LastCommittedOn | LastCommitedBy | Branch" > branch-history.md
echo "|-----------------|----------------|-----------------------" >> branch-history.md
git for-each-ref --sort=committerdate refs/heads/ --format='| %(committerdate:short) | %(authorname) | %(refname:short)' >> branch-history.md
Finally
# replace "git checkout" with "git branch -D"
# copy/paste commands to clean up
Favorite GUI Tools?
Charles Flatt
- KDiff3 for merging. It makes merge conflicts very clear. I have it set as my Git mergetool. Source on GitHub
Scott Wilson
- Tortoise Git, which has a great way to compare branches, and it has ~80% feature parity with the CLI client.
- Beyond Compare, my preferred Git Merge/Diff tool.
Mike Sigsworth
- GitKraken for the win!
About Us
We’re Clear Measure, a consultancy helping you learn to deliver high quality code faster. Call us if you feel like your company’s coding in a Model T and instead want ride a rocket.