Over the course of a few years I piled up a long list of git aliases. This post will assume you know what aliases are and you have defined a few for yourself.
I rely on many of them dozens of times a day. And maybe some have slipped your radar. Maybe you've never thought you could do some of these useful things with an alias. Let me show you some of the cool things you can do.
You can add all the examples below to the [alias]
section of your
.gitconfig
.
To acquire the full list of my aliases you can check out my .gitconfig on Github.
Shorten and beautify your log command because you will use it a lot. I have a
ton of list(ls) and inspection commands that I use constantly. I recommend you
experiment with the examples below and come up with your own variation. I type
git ls
and git ll
several dozens of times a day.
List commits in short form, with colors and branch/tag annotations. My bread
and butter log command is invoked with git ls
and looks like this:
And you can have it by adding this to your aliases section:
ls = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate
List commits showing changed files is invoked with git ll
and looks like this:
And you can have it with this:
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
List with no colors if you need to chain the out put with Unix pipes:
lnc = log --pretty=format:"%h\\ %s\\ [%cn]"
List oneline commits showing dates:
With the line:
lds = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short
List oneline commits showing relative dates:
With the line:
ld = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=relative
And closing the listing aliases, here is the default look for short git log:
le = log --oneline --decorate
You can see all the commits related to a file, with the diff of the changes
with git log -u
which i shortened to fl
for filelog
:
filelog = log -u
fl = log -u
I constantly check what was in the last commit and so I used to type
git log --numstat -1
a lot. But now it's only dl
and dlc
.
Show modified files in last commit:
dl = "!git ll -1"
Show a diff last commit:
dlc = diff --cached HEAD^
And if the commit you want to inspect is not the last one the typical git command becomes even longer. For this you definitely need a shortcut. Example usage:
Show content (full diff) of a commit given a revision:
dr = "!f() { git diff "$1"^.."$1"; }; f"
lc = "!f() { git ll "$1"^.."$1"; }; f"
diffr = "!f() { git diff "$1"^.."$1"; }; f"
Find a file path in codebase:
f = "!git ls-files | grep -i"
Example usage:
[nick][u12:~/dev/projects/durdn-com]
$ git f trenches
source/drafts/2012-11-12-more-curated-git-tips-from-the-trenches.html.md
Search/grep your entire codebase for a string:
grep = grep -Ii
gr = grep -Ii
Example usage:
[nick][u12:~/dev/projects/durdn-com]
$ git gr trenches
source/drafts/2012-11-12-more-curated-git-tips-from-the-trenches.html.md:title: "More Curated Git Tips From The Trench
source/drafts/2012-11-12-more-curated-git-tips-from-the-trenches.html.md:## More Curated Git Tips From The Trenches
source/drafts/2012-11-17-must-have-git-aliases-advanced-examples.html.md: $ git f trenches
source/drafts/2012-11-17-must-have-git-aliases-advanced-examples.html.md: source/drafts/2012-11-12-more-curated-git
Grep from root folder:
gra = "!f() { A=$(pwd) && TOPLEVEL=$(git rev-parse --show-toplevel) && cd $TOPLEVEL && git grep --full-name -In $1 | xargs -I{} echo $TOPLEVEL/{} && cd $A; }; f"
Sometimes you forget all your aliases and don't want to open .gitconfig just to
check. This simple alias git la
will output all your aliases:
la = "!git config -l | grep alias | cut -c 7-"
In some of my workflows I wanted to quickly rename branches prepending
done-
to their names. Here is the alias that came out of that workflow:
done = "!f() { git branch | grep "$1" | cut -c 3- | grep -v done | xargs -I{} git branch -m {} done-{}; }; f"
If you interact with big corporate projects - like Java projects under
Subversion - you might run into the need to ignore certain files which are
under subversion control but you need to modify them but not commit. The
assume-unchanged
flag comes to the rescue.
Assume a file as unchanged:
assume = update-index --assume-unchanged
Unassume a file:
unassume = update-index --no-assume-unchanged
Show assumed files:
assumed = "!git ls-files -v | grep ^h | cut -c 3-"
Unassume all the assumed files:
unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"
Assume all:
assumeall = "!git st -s | awk {'print $2'} | xargs git assume"
Show the last tag:
lasttag = describe --tags --abbrev=0
lt = describe --tags --abbrev=0
Being the Branch/Integration manager at my current client, I use these constantly to merge stuff:
ours = "!f() { git co --ours $@ && git add $@; }; f"
theirs = "!f() { git co --theirs $@ && git add $@; }; f"
Of course I use a ton of basic shortcuts, here's a few ingrained in my fingertips:
cp = cherry-pick
st = status -s
cl = clone
ci = commit
co = checkout
br = branch
diff = diff --word-diff
dc = diff --cached
r = reset
r1 = reset HEAD^
r2 = reset HEAD^^
rh = reset --hard
rh1 = reset HEAD^ --hard
rh2 = reset HEAD^^ --hard
svnr = svn rebase
svnd = svn dcommit
svnl = svn log --oneline --show-commit
sl = stash list
sa = stash apply
ss = stash save
For the full list of my aliases you can check out my gitconfig on Github. And I know you'll ask so here is pre-emptively the answer: the colorscheme for my shells and editors is Solarized at the moment.
I love staring at branches and shuffle, reorder and squash commits
Using Git with Subversion: Tips that will make your life easier
Git: Twelve Curated Tips And Workflows From The Trenches
Git Tips And Workflows, Round 2: basics, stashes and other bits
Life As Advocate: More Git Than Ever