Skip to content

Instantly share code, notes, and snippets.

@panchalkalpesh
Forked from ypwu1/git-aliases.md
Last active December 26, 2024 17:32
Show Gist options
  • Save panchalkalpesh/7d5b45180e0ca07b4f5e3b108d5daba1 to your computer and use it in GitHub Desktop.
Save panchalkalpesh/7d5b45180e0ca07b4f5e3b108d5daba1 to your computer and use it in GitHub Desktop.
The Ultimate Git Alias Setup · GitHub

The Ultimate Git Alias Setup

If you use git on the command-line, you'll eventually find yourself wanting aliases for your most commonly-used commands. It's incredibly useful to be able to explore your repos with only a few keystrokes that eventually get hardcoded into muscle memory.

Some people don't add aliases because they don't want to have to adjust to not having them on a remote server. Personally, I find that having aliases doesn't mean I that forget the underlying commands, and aliases provide such a massive improvement to my workflow that it would be crazy not to have them.

The simplest way to add an alias for a specific git command is to use a standard bash alias.

# .bashrc

alias s="git status -s"

The disadvantage of this is that it isn't integrated with git's own alias system, which lets you define git commands or external shell commands that you call with git <alias>. This has some nice advantages:

  • integration with git's default bash completion for subcommand arguments
  • ability to store your git aliases separately from your bash aliases
  • ability to see all your aliases and their corresponding commands using git config

If you add the following code to your .bashrc on a system with the default git bash completion scripts installed, it will automatically create completion-aware g<alias> bash aliases for each of your git aliases.

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion                                                                                                                                                                
fi


function_exists() {
    declare -f -F $1 > /dev/null
    return $?
}

for al in `__git_aliases`; do
    alias g$al="git $al"
    
    complete_func=_git_$(__git_aliased_command $al)
    function_exists $complete_fnc && __git_complete g$al $complete_func
done

The main downside to this approach is that it will make your terminal take a little longer to load.

My aliases

Here are the aliases I use constantly in my workflow. I'm lazy about remembering many other aliases that I've decided I should be using, which this setup is great for because I can always list them all using gla.

[alias]
    # one-line log
    l = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short

    a = add
    ap = add -p
    c = commit --verbose
    ca = commit -a --verbose
    cm = commit -m
    cam = commit -a -m
    m = commit --amend --verbose
    
    d = diff
    ds = diff --stat
    dc = diff --cached

    s = status -s
    co = checkout
    cob = checkout -b
    # list branches sorted by last modified
    b = "!git for-each-ref --sort='-authordate' --format='%(authordate)%09%(objectname:short)%09%(refname)' refs/heads | sed -e 's-refs/heads/--'"

    # list aliases
    la = "!git config -l | grep alias | cut -c 7-"

My Config

[user]
	name = Kalpesh Panchal
	email = [email protected]
[core]
	excludesfile = /Users/kalpesh.panchal/.gitignore_global
[difftool "sourcetree"]
	cmd = opendiff \"$LOCAL\" \"$REMOTE\"
	path = 
[mergetool "sourcetree"]
	cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
	trustExitCode = true


# Some aliases to save 1000s keystrokes each year:
[alias]
  # Format: commitHash YYYY-MM-DD Commit Message [Author]
  l = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short
  
  # Format: * commitHash  Commit Message. 4 weeks ago by Author
  lg = log --graph --pretty=format:'%Cred%h%Creset %C(yellow)%d%Creset %s %Cgreen%ar%Creset by %C(yellow)%an%Creset' --abbrev-commit
  
  # Oneline Log format
  ll = log --oneline
  
  ## Detailed Log Format (Last 10 commits)
  lf = log --name-status -10

  co = checkout
  cob = checkout -b

  b = branch
  b = "!git for-each-ref --sort='-authordate' --format='%(authordate)%09%(objectname:short)%09%(refname)' refs/heads | sed -e 's-refs/heads/--'"

  c = commit --verbose
  ca = commit -a --verbose
  cm = commit -m
  cam = commit -a -m

  s = status
  st = status -s

  # Convenient to see diff in minified files
  dw = diff --color-words
  ds = diff --staged

  # List Aliases
  # For Windows
  # la = !git config --list | findstr "alias"
  # For Linux / Mac
  la = "!git config -l | grep alias | cut -c 7-"
  
  
  # BE CAUTIOUS - Reset Hard
  rh = reset --hard HEAD


# Add colors
[color]
  ui = true
  diff = auto

# Avoid messy merge commits with autorebase
[branch]
  autosetuprebase = always

# Push the current branch by default
[push]
  default = current

# Guess what you really meant
[help]
  autocorrect = 1

# Tell git you have a global .gitignore
[core]
  excludesfile = ~/.gitignore

# Remove usage hints
[advice]
  statusHints = false

# Tell where are the diff from,

# instead of using a and b notation
[diff]
  mnemonicprefix = true

See Must Have Git Aliases for more.

@yeasinat
Copy link

yeasinat commented Jan 9, 2024

I use this as a shortcut :
[alias]
lazy = "!f() { git add -A && git commit -m "$@" && git push; }; f"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment