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.