Working with git? These aliases will save you hours
catonmat.net
catonmat.net
Aliases are important for enhanced productivity, but shell aliases are too much. I find these git aliases much more comfortable:
alias.st=status
alias.co=checkout
alias.com=checkout master
alias.cam=commit -a -m
alias.cm=commit -m
alias.br=branch
push, pull, merge, rebase and the rest are infrequently used, so I don't alias them at all. Using shell aliases (as opposed to git aliases) is unjustified IMO, as is the horrible alias g='git'
which gives me the creeps.alias grm="git status | grep deleted | awk '{print \$3}' | xargs git rm"
[alias]
rm-a = "!git ls-files -z --deleted | xargs -0 git rm" complete -o bashdefault -o default -o nospace -F _git g 2>/dev/null \
|| complete -o default -o nospace -F _git g stat = status
stta = status
satt = status
tat = status
co = checkout
fo = fetch origin
ff = merge --ff-only
ffo = merge --ff-only @{u}
po = push origin HEADFrom a productivity point of view, since this is presumably used by developers, we can safely assume these are people who spend at least 10 hours a day typing (coding, internet etc.). Most of our lives are spend behind a keyboard yes?
That being the case, we can safely assume that most of us are pretty good typists. Even a marginally good typist can punch the keyboard at 60 words per minute. Considering the average English word length of 5.7 characters that gives us a speed of 342 characters per minute, or 5.7 per second.
Do you really really need to increase your mental load for translating acronyms/abbreviations into words in order to save fractions of a second? Really?
But I agree that using aliases for trivial, short commands such as these doesn't really help. Remembering the alias is more work then just typing the whole command.
Edit: why is jacques_chester's reply to this post killed!?
I myself only use couple aliases, for the most used commands - 'gita' for add, 'gits' for status, 'gitd' for diff. Those are the things I use A LOT (especially when preparing a commit), and shaving off couple characters there does pay off. And no, I don't feel that these muscle-memory level shortcuts add any mental load.
Basically, any command that I have to even passively think about the parameters which is used often enough gets its own alias. This does not include commands like "git add" because I don't even think about parameters when I'm typing it out. Having to remember that I set ga to "git add" adds more work than I'm doing now.
I am willing to believe that aliases like 'ga' and 'gp' would actually increase productivity if all you did all day long was manipulate a git repository or you had some physical disability in which it was actually difficult to type on a keyboard, but I mean, using my source control tool is such a small piece of the larger initiative I take on day in and day out, that in the end, the extra keystrokes aren't going to have any meaningful impact on the amount of value I add to the projects I work on.
There's also the issue with portability. You have to be able to bring those aliases with you anywhere you go. A great example I heard about was at a meetup once where a guy tried to give a talk on git and because he wasn't using his machine, that talk was almost worthless because he kept typing his precious little aliases and, arguably, didn't really know how to use the tool he was trying to demonstrate.
Nor will removing those keystrokes have a negative impact on the value you add.
Fear of forgetting the original commands is a reasonable argument against using aliases. It's very similar to the argument against using vim plugins for fear that you won't know how to use vi on servers or other peoples' machines. Nonetheless, most people use the plugins on their development machines which they feel make them the most productive in their day to day work. Same thing for aliases.
Using vim plugins on your development machine should only add value to your standard commands. You still use standard vim commands to move around and manipulate text. And noone expects you to modify whole application on server, so you don't need those extra plugins for project manipulation, code completion (you still can type, right?) or highlighting
So I use similar shortcuts and like them. There's nothing wrong with creating shortcuts for almost everything. Some shortcuts I remember better than others; the ones I don't remember I just type out in full, and eventually I either get inspired to remember the shortcut or the shortcut evolves out of my config file.
I use the trick of aliasing "git" to "g", which I learned from Howard Yeh:
http://www.metacircus.com/hacking/2011/02/18/play-git-like-a...
That's an easy one.
Especially when you're under hard time pressure, commits can often fall by the wayside, unless they're super easy (read: need very few keystrokes).
cm='git commit -m "#-checkpoint-" --edit'
I commit all the time that way; "cm -a", x, ZZI frequently get the order of the left hand letters of "status" wrong, or sometime SVN muslememory kicks in, and I just write "stat". Parsing the error message on the screen is orders of magnitude slower that just getting it right. "gs" would greatly decrease my risk of getting it wrong.
Your codebase should be optimized for reading. Your aliases file should be optimized for very, very frequent typing.
These are different goals, so naturally the solutions look different.
Yes, that's why we are not discussing the creation of easily typed aliases for "rm -rf". That would be bad.
Instead we are discussing aliases for a bunch of fairly innocent Git commands, most of which are reversible in case of catastrophic accident.
I admit that I do have a four-character abbreviation for "git reset --hard". Maybe that will burn me one day, though I rarely pile up so many uncommitted changes that I have much at risk. Or maybe I'll make that shortcut a little longer.
Of course, it's not "git merge" or "git status" or "git log" you want to alias, necessarily--it's "git merge --no-ff", "git status -sb", or "git log --oneline --decorate".
For instance, since the shell has command history that persists between sessions, once you've run e.g. "git push" once, you can run it again by typing e.g. "^R pu" (including the space to make it more unique). That's more keypresses than just "gp", but way clearer and more portable since it will work wherever you have Bash, not just where your particular aliases are installed.
You can't rely on muscle memory for history commands as you always need to pause and verify that history found what you were expecting it to find. If your history looked like this (real shell history for me):
git push
ssh ec2-75-101-198-99.compute-1.amazonaws.com
the ^R would find the ssh command first, so you can't trust that "^Rpu" will always find the command so muscle memory can't set in and will slow you downBut make sure you've found the command you really thought you were looking for before mashing the return key. Sometimes my muscle memory is a bit too fast...
"\e[A": history-search-backward
"\e[B": history-search-forward
In .inputrc lets me just start typing a command and then press the up arrow to search the history, no need for ^R.Try it for yourself: type "git stat<Tab>" and it'll autocomplete to "git status".
Then in your bash .profile: source /etc/bash_completion
E.g. the following does the trick for tcsh, search the web for '<myfavshell> git completion' and you'll find your way:
set gitcmds= ( `ls /usr/local/bin/git-*|sed ’s/\/usr\/local\/bin\/git-//g’` ) complete git “p/1/($gitcmds)/” ‘n/branch/`git branch|cut -c 3-`/’ ‘n/co/`git branch|cut -c 3-`/’ ‘n/remote/(show add rm prune update)/’ ‘N/remote/`git remote`/’
alias think="cd ~/Documents/docrepo && git pull && mvim personal/thoughts.htm"
When I want to think I just enter "think".I also set up aliases for my most commonly worked on projects that cd into the correct folder, set the correct rvm version, etc.
git st (status) git ct (commit) git br (banch) git co (checkout) git back (reset --hard) git last (log -1 head) git last2 (log -2 head)
Reducing "git" to "g" or "status" to "st" doesn't speed up my workflow much. The real gains come with aliasing something like this:
git --no-pager log --oneline --graph -n 18 --decorate
[1] https://github.com/dave1010/scripts/blob/master/gitconfig [alias]
svndiff = !"$(git svn dcommit -n | grep "diff-tree" | sed 's/diff-tree/git diff-tree --color=auto -p/')" # Make git completion work with aliases
complete -o default -o nospace -F _git_checkout gco
complete -o default -o nospace -F _git_rebase grb
complete -o default -o nospace -F _git_branch gbdf
complete -o default -o nospace -F _git_branch gbd
complete -o default -o nospace -F _git_diff gd
complete -o default -o nospace -F _git_log gl
complete -o default -o nospace -F _git_log glpHere's mine: https://gist.github.com/916019