Skip to content

Instantly share code, notes, and snippets.

@EQuimper
Forked from mwhite/git-aliases.md
Created June 1, 2017 01:40
Show Gist options
  • Star 26 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save EQuimper/d875df92ef0ddaabf00636c90dbc9d25 to your computer and use it in GitHub Desktop.
Save EQuimper/d875df92ef0ddaabf00636c90dbc9d25 to your computer and use it in GitHub Desktop.
The Ultimate Git Alias Setup

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-"

See Must Have Git Aliases for more.

@nrcmkoh
Copy link

nrcmkoh commented Jul 18, 2018

Hello,

Can you tell me where __git_aliases is defined? When I open Git Bash, I am getting this error:

bash: __git_aliases: command not found

Thanks!

@nrcmkoh
Copy link

nrcmkoh commented Jul 18, 2018

I found a solution. __git_aliases was replaced with __git_pretty_aliases between versions of Git in "C:\Program Files\Git\mingw64\share\git\completion\git-completion.bash," so I added this to the file:

__git_aliases ()
{
__git_get_config_variables "alias"
}

@bhishp
Copy link

bhishp commented May 6, 2019

This is one I like to add for 'claiming' a new piece of work from the backlog. E.g. git claim fix-bug, and it will automatically create a new branch locally and in the upstream.

claim = "!f() { git cob $1 && git push -u origin $1; }; f"

If your issue-tracking software has transitions enabled on branch names then you can include your issue id and it will pick up that issue for you automatically.

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