Supercharging Your Git With Aliases: My Developer Setup
In my previous post — Optimizing Your Git Config: My Developer Setup, I talked about tuning Git’s
behavior through .gitconfig
. Now it’s time to take that a step further — by teaching Git your
personal shorthand.
Git aliases are one of the simplest ways to make your workflow faster, smoother, and less repetitive. Think of them like custom keybindings — but for Git.
🧩 The Case for Aliases
We all type git status dozens of times a day. Multiply that across a week or a year and you are
burning time on keystrokes. Aliases fix that. They also reduce friction around those
slightly-too-long commands we should run more often, but avoid out of laziness (like
git log —graph —oneline
).
These are the Git aliases I actually use — grouped by category — with some real-world scenarios to show you how they help.
And as always, if you want to grab-and-go, copy-paste away my friends.
[alias]
# Essential Shorthands
s = status # Show working tree status
co = checkout # Switch branches or restore files
br = branch # List, create, or delete branches
brs = branches # List all local and remote branches
branches = branch -a # List all local and remote branches
c = commit # Regular commit
cm = commit -m # Commit with inline message
ca = amend # Amend the last commit
can = amend --no-edit # Amend the last commit with no message edit
amend = commit --amend # Amend the last commit
# Workflow Boosters
grepl = grep -E --line-number # Search repo with regex and line numbers
discard = checkout -- # Discard local changes to a file
untrack = rm --cached # Remove file from version control but keep it locally
abort = rebase --abort # Abort an in-progress rebase
uncommit = reset --soft HEAD^ # Undo last commit but keep changes staged
unstage = reset -q HEAD -- # Remove file from staging area
showRef = show-ref --abbrev # Show refs in abbreviated format
peeps = shortlog -n -e -s # List contributors by number of commits
# List all defined aliases
aliases = "!git config -l | grep alias | cut -c 7-"
# Simple one-liner commit graph
lo = log --graph --decorate --pretty=oneline --abbrev-commit
# Power Tools
# Print current Git identity
whoami = "!git config user.name && git config user.email"
# Show remote info (defaults to origin)
info = "!sh -c '[ $# -ne 0 ] && git remote show $1 && exit 0 || \
[ $# -eq 0 ] && git remote show origin && exit 0' -"
# Colorful log with author and relative date
logPretty = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset \
%s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
# Count lines of code per author
peepsLoC = "!git ls-files | xargs -n1 git blame --line-porcelain | sed \
-n 's/^author //p' | sort -f | uniq -ic | sort -nr"
# File & Branch Helpers
find = "!git ls-files | grep -i" # Search files tracked by git (case-insensitive)
# Visualize difference between two branches
diffBranches = "!f() { echo \"Showing ${1}..${2}\"; git log --graph \
--pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' \
--abbrev-commit --date=relative \"$1\"..\"$2\"; }; f"
Now, let’s get into the weeds.
🔡 Essential Shorthands
Save keystrokes on the stuff you type all the time. And yes, you can use your git aliases in other aliases.
[alias]
s = status # Show working tree status
co = checkout # Switch branches or restore files
br = branch # List, create, or delete branches
brs = branches # Shortcut to 'branches' (all branches)
branches = branch -a # List all local and remote branches
c = commit # Regular commit
cm = commit -m # Commit with inline message
ca = amend # Shortcut to 'amend'
can = amend --no-edit # Amend the last commit, no message edit
amend = commit --amend # Amend the last commit
🔄 Before
git status
git checkout -b feature/signup
git branch
git branch -a
git commit -m "Fix typo"
✅ After
git s
git co -b feature/signup
git br
git brs
git cm "Fix typo"
git ca
🎯 Save time on high-frequency commands without thinking.
🛠 Workflow Boosters
🧪 Grep
grepl = grep -E --line-number
You are in project, and want to track down where the generate_report function is defined or used.
❯ git grepl "generate_report"
reports/generator.py:12:def generate_report(data):
tests/test_generator.py:4:from reports.generator import generate_report
tests/test_generator.py:15: result = generate_report(mock_data)
📍Just like that, you’ve found the definition and all the usages across your project.
🗑 Discard Changes
discard = checkout --
You made some changes and realize… nope, not it. Time to wipe them.
❯ git status
modified: main.py
❯ git discard main.py
❯ git status
nothing to commit, working tree clean
📍Untracks the file without removing it locally. Git forgets it, you keep it.
🧹 Un-Stage a File
unstage = reset -q HEAD --
You’ve staged something that you didn’t mean to. Time to clean it up.
❯ git add script.py
❯ git status
Changes to be committed:
modified: script.py
❯ git unstage script.py
❯ git status
Changes not staged for commit:
modified: script.py
📍Quickly pull files back out of staging, no drama.
🛑 Abort a Rebase
abort = rebase --abort
You tried to rebase, but things went south. Let’s back out gracefully.
❯ git rebase main
(conflicts occur...)
❯ git abort
📍Instant escape hatch from a tangled rebase.
🔙 Un-Commit (Keep the Changes)
uncommit = reset --soft HEAD^
You committed too soon, maybe forgot to update something. This walks it back, but keeps your work in staging.
❯ git uncommit
❯ git status
On branch dev
Your branch is up to date with 'origin/dev'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: script.py
📍Soft reset = undo commit, keep all staged changes.
🕵️ Show Git References
showRef = show-ref --abbrev
Need to check what refs exist behind the scenes?
❯ git showRef
e1a3f1a refs/heads/main
a21d1c4 refs/tags/v1.0
📍Useful for CI pipelines or debugging detached HEAD states.
👥 Contributor Summary
peeps = shortlog -n -e -s
Check who’s the active maintainers are:
❯ git peeps
104 Ankit Dev <ankit.dev@example.com>
56 Coder Dev <coder.dev@example.com>
📍Fast, clean view of commit contributors.
🔧 Power Tools
🙋 Who Am I?
whoami = "!git config user.name && git config user.email"
Working across many repos or using different Git identities?
❯ git whoami
Ankit Dev
ankit.dev@example.com
📍Helps avoid those “why did I just push as work account to personal repo” moments.
🌐 Show Remote Info
info = "!sh -c '[ $# -ne 0 ] && git remote show $1 && exit 0 || \
[ $# -eq 0 ] && git remote show origin && exit 0' -"
Need to know where origin points or details about a specific remote?
❯ git info
* remote origin
Fetch URL: git@github.com:weirdion/my-repo.git
Push URL: git@github.com:weirdion/my-repo.git
HEAD branch: main
📍Smart default to origin, but handles any remote passed as arg.
📊 Visual Log: One-liner Graph
lo = log --graph --decorate --pretty=oneline --abbrev-commit
You want the big picture from the git log, fast.
❯ git lo
* f7b2dce - Merge pull request #45 (HEAD -> main)
* 83b12a7 - Fix tests
* 3ab89ec - Add report module
* c0829ce Merge pull request #44 from weirdion/add-config-dir
|\
| * 87e983f Add config script
|/
* 0f27cb9 Clean up misc stuff
📍Clean, color-coded, quick overview of commit history.
🎨 Visual Log: Author & Time
logPretty = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset \
%s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
When you want richer context — who wrote what, when, and you want it to be pretty.
❯ git logPretty
* f7b2dce - (HEAD -> main, origin/main) Merge PR #45 (2 hours ago) <Ankit Dev>
* 83b12a7 - Fix broken tests (5 hours ago) <Coder Dev>
📍Great for reviews or context on active branches.
🧠 Lines of Code by Author
peepsLoC = "!git ls-files | xargs -n1 git blame --line-porcelain | sed \
-n 's/^author //p' | sort -f | uniq -ic | sort -nr"
Who’s writing the code? Not just committing.
❯ git peepsLoC
1340 Ankit Dev
962 Coder Dev
📍Dig deeper than commit counts — see who owns the codebase.
🔎 Find Tracked Files
find = "!git ls-files | grep -i"
Find any file in the repo — even in deep sub-directories — case-insensitively.
❯ git find config
src/app/config.py
tests/test_config.py
📍Faster than scrolling or find ..
🌲 Diff Between Branches
diffBranches = "!f() { echo \"Showing ${1}..${2}\"; git log --graph \
--pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' \
--abbrev-commit --date=relative \"$1\"..\"$2\"; }; f"
Quick visual of what one branch has that the other doesn’t.
❯ git diffBranches main feature/reporting
Showing main..feature/reporting
* 8a74f0b - Add report generator (2 days ago)
* 0c1d2f9 - Initial feature setup (3 days ago)
📍Perfect for reviews or checking what’s left to merge.
🏁 Wrapping Up
These aliases aren’t meant to reinvent Git — they’re meant to unstick you faster and make daily work feel a little smoother. Think of it as Git with a coat of polish that’s 💯 yours.
If you’re just getting started, copy over a few, and see how you like it. If you’ve already got a custom config, maybe these sparked a few ideas.
Got favorite aliases of your own? Let me know — I’m always down to steal a good one 😄.