Aliases and configuration
Objectives
Learn to use aliases for most common commands.
Are you getting tired of typing so much? In Git you can define aliases (shortcuts):
These are great because they can save you time typing.
But it’s easy to forget them, get confused, or be inconsistent with your colleagues.
There is plenty of other configuration for Git, that can make it nicer.
Aliases
Aliases offer a way to improve the usability of Git: for example
git ci
instead ofgit commit
.Aliases are based on simple string replacement in the command.
Aliases can either be specific to a repository or global.
Global aliases help you do the things you are used to across Git projects.
Per-project aliases can also be created.
Global aliases are stored in
~/.gitconfig
.
Example alias: git graph
A very useful shortcut which we use a lot in our workshops:
$ git config --global alias.graph "log --all --graph --decorate --oneline"
$ cd your_git_repository
$ git graph
Using external commands
It is possible to call external commands using the exclamation mark character “!”.
In this example here we create a local alias which is
stored in .git/config
and not synchronized with remotes:
$ cd your_git_repository
$ git config alias.hi '!echo hello'
$ git hi
Food for thought: When to alias?
How many times should you wait before aliasing a command?
Do you believe a list of generic two-letter acronyms for common commands will save your time?
List of aliases the instructors use
You are welcome to reuse, suggest, improve.
You can see your current aliases in ~/.gitconfig
.
$ git config --global alias.ap "add --patch"
$ git config --global alias.br branch
$ git config --global alias.ci "commit -v"
$ git config --global alias.cip "commit --patch -v"
$ git config --global alias.cl "clone --recursive"
$ git config --global alias.di diff
$ git config --global alias.dic "diff --staged --color-words"
$ git config --global alias.diw "diff --color-words"
$ git config --global alias.dis "!git --no-pager diff --stat"
$ git config --global alias.fe fetch
$ git config --global alias.graph "log --all --graph --decorate --oneline"
$ git config --global alias.rem remote
$ git config --global alias.st status
$ git config --global alias.su "submodule update --init --recursive"
Here is what they do:
ap
: add, selecting parts individually, interactively.br
: branch (obvious)ci
: commit (check in), with-v
option for claritycip
: commit, selecting parts individually, interactively.cl
: clone, init submodules (submodules are an advanced topic)di
: diff (obvious)dic
: diff of staging area vs last commit (what is about to be committed)diw
: a word diff, color. Useful for small changes.dis
: a “diffstat”: what files are changed, not contentsfe
: fetch (obvious)graph
: show whole git graph (so useful, some of us call itl
)rem
: remote (obvious)st
: status (obvious)su
: submodule update (advanced)
A useful setting for the p
aliases:
$ git config --global interactive.singlekey true
Advanced aliases
These are advanced aliases and configuration options. We won’t explain them, but if you are bored, have some time, or want to go deeper, try to figure out what they do. You might want to check the Git manual pages!
$ git config --global alias.cif "commit -v -p --fixup"
$ git config --global alias.rb "rebase --autosquash"
$ git config --global alias.rbi "rebase --interactive --autosquash"
$ git config --global alias.rbis "rebase --interactive --autosquash --autostash"
$ git config --global alias.rbs "rebase --autosquash --autostash"
$ git config --global alias.rec "!git --no-pager log --oneline --graph --decorate @{upstream}^^^..HEAD"
$ git config --global alias.ls-ignored "ls-files -o -i --exclude-standard"
$ git config --global alias.new "log HEAD..HEAD@{upstream}"
$ git config --global alias.news "log --stat HEAD..HEAD@{upstream}"
$ git config --global alias.newd "log --patch --color-words HEAD..HEAD@{upstream}"
$ git config --global alias.newdi "diff --color-words HEAD...HEAD@{upstream}"
$ git config --global alias.rec "!git --no-pager log --oneline --graph --decorate @{upstream}^^^..HEAD"
$ git config --global alias.reca "!git --no-pager log --oneline --graph --decorate -n10 --all"
$ git config --global alias.recd "log --decorate --patch @{upstream}^^^..HEAD"
$ git config --global alias.recs "!git --no-pager log --oneline --graph --decorate @{upstream}^^^..HEAD --stat"
Advanced Git configuration
Besides aliases, you can do plenty of other configuration of git
.
Here are some of the most common ones:
$ git config --global interactive.singlekey true
$ git config --global core.pager "less -RS"
$ git config --global core.excludesfile ~/.gitignore
$ git config --global merge.conflictstyle diff3
$ git config --global diff.wordRegex "[a-zA-Z0-9_]+|[^[:space:]]"
$ git config --global diff.mnemonicPrefix true
Do you get tired of typing and copying and pasting your remote names
all the time, like git@github.com:myusername
? You can create remote
aliases like this:
$ git config --global url.git@github.com:.insteadOf gh:
$ git config --global url.git@github.com:/username/.insteadOf ghu:
Then, when you add a remote ghu:recipe
, it will automatically be
translated to git@github.com:/username/recipe
using a simple prefix
matching.
Keypoints
If you are frustrated about remembering a command, you should create an alias.