Git - Aliases & Shortcuts
Intermediate
Git aliases transform repetitive Git commands into powerful shortcuts, dramatically improving your productivity and workflow efficiency. Master aliases to work like a Git professional.
What are Git Aliases?
Aliases are custom shortcuts for Git commands, stored in your Git configuration:
# Basic alias syntax
git config --global alias.<alias-name> '<git-command>'
# Example
git config --global alias.st 'status'
git st # Now runs 'git status'
Benefits of using aliases:
- Speed: Reduce typing and command length
- Consistency: Standardize complex command patterns
- Memory: Easier to remember short, logical names
- Customization: Tailor Git to your workflow
Basic Aliases
Essential Short Aliases
# Basic status and log
git config --global alias.st 'status'
git config --global alias.co 'checkout'
git config --global alias.br 'branch'
git config --global alias.ci 'commit'
# Quick add and commit
git config --global alias.ac 'commit -am'
git config --global alias.ca 'commit --amend'
# Log variations
git config --global alias.lg 'log --oneline'
git config --global alias.last 'log -1 HEAD'
# Usage examples
git st # git status
git co main # git checkout main
git br -a # git branch -a
git ac "message" # git commit -am "message"
Enhanced Status and Information
# Detailed status
git config --global alias.s 'status -sb'
# Show all aliases
git config --global alias.aliases '!git config --list | grep alias | cut -c7-'
# Show current branch
git config --global alias.current 'symbolic-ref --short HEAD'
# Show remote tracking info
git config --global alias.track 'branch -vv'
Advanced Log Aliases
Beautiful Log Formats
# One-line log with graph
git config --global alias.lg1 'log --oneline --graph --decorate'
# Detailed log with stats
git config --global alias.lg2 'log --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit'
# Log with file changes
git config --global alias.lg3 'log --graph --stat --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset"'
# Example output of lg2
* 2f8a1c4 - (HEAD -> main, origin/main) Add user authentication (2 hours ago)
* 5b3e8f1 - (tag: v1.0) Fix login validation bug (1 day ago)
* 9c7d2a8 - Initial commit (3 days ago)
Specialized Log Views
# Show commits today
git config --global alias.today 'log --since="1 day ago" --oneline --author="$(git config user.name)"'
# Show commits this week
git config --global alias.week 'log --since="1 week ago" --oneline --author="$(git config user.name)"'
# Show file history
git config --global alias.filelog 'log -u'
# Show what changed in last commit
git config --global alias.dl '!git ll -1'
# Log with search
git config --global alias.find 'log --pretty="format:%Cgreen%H %Cblue%s" --name-status --grep'
Branch and Merge Aliases
Branch Management
# Quick branch creation and checkout
git config --global alias.cob 'checkout -b'
# Delete merged branches
git config --global alias.cleanup '!git branch --merged | grep -v "\*\|main\|master\|develop" | xargs -n 1 git branch -d'
# Push current branch to origin
git config --global alias.publish '!git push -u origin $(git branch --show-current)'
# Show branches sorted by last commit
git config --global alias.recent 'branch --sort=-committerdate'
Merge and Rebase Shortcuts
# Fast-forward merge only
git config --global alias.ff 'merge --ff-only'
# No fast-forward merge
git config --global alias.noff 'merge --no-ff'
# Interactive rebase
git config --global alias.ri 'rebase -i'
# Rebase on main
git config --global alias.rom 'rebase origin/main'
# Merge main into current branch
git config --global alias.mm '!git checkout main && git pull && git checkout - && git merge main'
Diff and Comparison Aliases
# Staged changes
git config --global alias.ds 'diff --staged'
# Word diff
git config --global alias.dw 'diff --word-diff'
# Diff with external tool
git config --global alias.dt 'difftool'
# Show changes in last commit
git config --global alias.last-changes 'diff HEAD~1 HEAD'
# Compare with main branch
git config --global alias.compare 'diff main...'
Stash Aliases
# Quick stash with message
git config --global alias.save 'stash save'
# Stash including untracked files
git config --global alias.staash 'stash --include-untracked'
# Pop and apply stash
git config --global alias.sp 'stash pop'
git config --global alias.sa 'stash apply'
# List stashes with details
git config --global alias.sl 'stash list --stat'
Complex Multi-Command Aliases
Complete Workflow Aliases
# Add all, commit, and push
git config --global alias.acp '!f() { git add -A && git commit -m "$1" && git push; }; f'
# Create feature branch and push
git config --global alias.feature '!f() { git checkout -b feature/$1 && git push -u origin feature/$1; }; f'
# Complete pull request cleanup
git config --global alias.done '!f() { git checkout main && git pull && git branch -d $1 && git push origin --delete $1; }; f'
# Undo last commit but keep changes
git config --global alias.undo 'reset --soft HEAD~1'
# Usage examples
git acp "Fix user login bug" # Add, commit, push
git feature user-authentication # Create and push feature branch
git done feature/user-authentication # Clean up after merge
Advanced Workflow Aliases
# Sync with upstream (for forks)
git config --global alias.sync '!git fetch upstream && git checkout main && git merge upstream/main && git push origin main'
# Create hotfix branch from main
git config --global alias.hotfix '!f() { git checkout main && git pull && git checkout -b hotfix/$1; }; f'
# Squash last N commits
git config --global alias.squash '!f() { git reset --soft HEAD~$1 && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; }; f'
# Archive old branch
git config --global alias.archive '!f() { git tag archive/$1 $1 && git branch -D $1; }; f'
Information and Statistics Aliases
# Repository statistics
git config --global alias.stats 'shortlog -sn --all --no-merges'
# Show contributors
git config --global alias.contributors 'shortlog -nse'
# Show file rankings by changes
git config --global alias.churn '!git log --all -M -C --name-only --format="format:" "$@" | sort | grep -v "^$" | uniq -c | sort -nr'
# Show repository size
git config --global alias.size '!git bundle create /tmp/tmp.bundle --all >/dev/null 2>&1 && ls -lh /tmp/tmp.bundle | awk "{print \$5}" && rm /tmp/tmp.bundle'
# Show ignored files
git config --global alias.ignored 'ls-files --others --ignored --exclude-standard'
Utility and Maintenance Aliases
# Clean everything
git config --global alias.cleanall '!git clean -fxd && git reset --hard'
# Optimize repository
git config --global alias.optimize '!git repack -Ad --depth=250 --window=250'
# Find large files
git config --global alias.large-files '!git rev-list --objects --all | git cat-file --batch-check="%(objecttype) %(objectname) %(objectsize) %(rest)" | sed -n "s/^blob //p" | sort --numeric-sort --key=2 | tail -20'
# Backup current branch
git config --global alias.backup '!git tag backup/$(git branch --show-current)/$(date +%Y%m%d-%H%M%S) HEAD'
Team Collaboration Aliases
# Show who changed what in a file
git config --global alias.who 'blame -w -C -C -C'
# Show commits by author
git config --global alias.author '!f() { git log --author="$1" --pretty=format:"%h %s" --since="1 month ago"; }; f'
# Find merge commits
git config --global alias.merges 'log --merges --oneline'
# Show branch relationships
git config --global alias.tree 'log --graph --oneline --all'
# Review changes before push
git config --global alias.review 'log origin/main..HEAD --oneline'
Debugging and Recovery Aliases
# Find commits that touched a specific string
git config --global alias.search '!f() { git log -S "$1" --source --all; }; f'
# Show what would be pushed
git config --global alias.outgoing 'log @{upstream}..HEAD --oneline'
# Show what would be pulled
git config --global alias.incoming 'log HEAD..@{upstream} --oneline'
# Emergency - list all commits in reflog
git config --global alias.reflog-all 'reflog --all --date=iso'
# Find lost commits
git config --global alias.lost 'fsck --lost-found'
Platform-Specific Aliases
macOS/Linux Aliases
# Open repository in file manager
git config --global alias.open '!open $(git rev-parse --show-toplevel)'
# Copy current branch name to clipboard
git config --global alias.copy-branch '!git branch --show-current | pbcopy'
# Show diff in external app
git config --global alias.diff-app '!git difftool -d'
Windows Aliases
# Open repository in Windows Explorer
git config --global alias.open '!explorer $(git rev-parse --show-toplevel)'
# Copy current branch name to clipboard
git config --global alias.copy-branch '!git branch --show-current | clip'
Managing Aliases
Viewing and Editing Aliases
# List all aliases
git config --global --get-regexp alias
# Edit git config file directly
git config --global --edit
# Remove an alias
git config --global --unset alias.old-alias
# Check if alias exists
git config --global --get alias.st
Organizing Aliases
# Group aliases by function in .gitconfig
[alias]
# Status and information
st = status -sb
current = symbolic-ref --short HEAD
# Branching
co = checkout
br = branch
cob = checkout -b
# Committing
ci = commit
ac = commit -am
ca = commit --amend
# Logging
lg = log --oneline --graph
last = log -1 HEAD
Sharing Aliases with Team
Team Alias Setup Script
#!/bin/bash
# setup-team-aliases.sh
echo "Setting up team Git aliases..."
# Basic shortcuts
git config --global alias.st 'status -sb'
git config --global alias.co 'checkout'
git config --global alias.br 'branch'
git config --global alias.ci 'commit'
# Team workflow
git config --global alias.feature '!f() { git checkout -b feature/$1 && git push -u origin feature/$1; }; f'
git config --global alias.sync 'pull --rebase origin main'
git config --global alias.review 'log origin/main..HEAD --oneline'
# Cleanup
git config --global alias.cleanup '!git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d'
echo "Team aliases configured successfully!"
git aliases
Include Aliases in Repository
# Create .gitalias file in repository
[alias]
# Project-specific aliases
setup = !npm install && npm run build
test-all = !npm test && npm run lint && npm run e2e
deploy-staging = !git push staging main
# Include in main .gitconfig
[include]
path = ~/projects/myproject/.gitalias
Advanced Alias Techniques
Conditional Aliases
# Different behavior based on branch
git config --global alias.smart-push '!f() {
if [ "$(git branch --show-current)" = "main" ]; then
echo "Direct push to main not allowed!";
exit 1;
else
git push origin HEAD;
fi
}; f'
Interactive Aliases
# Interactive branch selector
git config --global alias.switch-interactive '!git branch | fzf | xargs git checkout'
# Interactive file selector for add
git config --global alias.add-interactive '!git ls-files -m -o --exclude-standard | fzf -m | xargs git add'
Aliases with Parameters
# Flexible commit with optional scope
git config --global alias.commit-scope '!f() {
if [ $# -eq 2 ]; then
git commit -m "$1: $2";
else
git commit -m "$1";
fi
}; f'
# Usage: git commit-scope feat "add user auth"
# Result: "feat: add user auth"
Best Practices
Alias Best Practices:
- Keep aliases short but memorable
- Use consistent naming patterns
- Document complex aliases
- Test aliases thoroughly before sharing
- Organize aliases by function in config file
- Backup your alias configuration
Professional Alias Set
# Professional developer aliases
git config --global alias.st 'status -sb'
git config --global alias.lg 'log --oneline --graph --decorate'
git config --global alias.last 'log -1 HEAD --stat'
git config --global alias.unstage 'reset HEAD --'
git config --global alias.visual '!gitk'
git config --global alias.timeline 'log --graph --branches --pretty=oneline --decorate'
git config --global alias.mt 'mergetool'
git config --global alias.dt 'difftool'
Troubleshooting Aliases
Common Issues:
- Shell escaping in complex aliases
- Aliases not working in scripts
- Platform-specific command differences
- Alias conflicts with existing commands
# Debug alias execution
git config --global alias.debug-alias '!f() { set -x; git "$@"; set +x; }; f'
# Test alias without executing
git config --global alias.dry-run '!f() { echo "Would execute: git $@"; }; f'
Key Takeaways
- Productivity: Aliases dramatically speed up common operations
- Consistency: Standardize complex commands across team
- Customization: Tailor Git to your specific workflow
- Learning Tool: Complex aliases teach advanced Git concepts
- Professional Efficiency: Essential for serious Git users
Master Git aliases to transform your development workflow. Start with basic shortcuts and gradually build a personalized toolkit that matches your team's practices and your individual style.