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.
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-"
[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.
I use this as a shortcut :
[alias]
lazy = "!f() { git add -A && git commit -m "$@" && git push; }; f"