Git Alias - Multiple Commands and Parameters
GitShAliasGit AliasGit Problem Overview
I am trying to create an alias that uses both multiple Git commands and positional parameters. There are Stackoverflow pages for each, and it would appear painfully obvious to do both, but I am having trouble.
As an example, I want to switch to branch foo and perform a status. So in my .gitconfig
, I have:
[alias]
chs = !sh -c 'git checkout $0 && git status'
which doesn't work. Whereas something like this will work.
chs = !sh -c 'git checkout $0'
echoes = !sh -c 'echo hi && echo bye'
Any insight would be appreciated.
Git Solutions
Solution 1 - Git
This will work (tested with zsh and bash):
[alias] chs = !git checkout $1 && git status
Solution 2 - Git
This targets Windows batch / msysgit bash; might not work on other environments.
As Olivier Verdier and Lily Ballard have said
[alias] chs = !git checkout $1 && git status
almost works, but gives a spurious extra insertion of the argument ...
git chs demo -> git checkout demo && git status demo
But if you add && :
to the end of your alias, then the spurious argument is consumed into a location tag.
So
[alias] chs = !git checkout $1 && git status && :
gives the correct output ...
git chs demo -> git checkout demo && git status
Solution 3 - Git
You can define a shell function.
[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"
Solution 4 - Git
I was able to create multi-line and quite complex git aliases. They work fine on Windows but I assume they'd work elsewhere too, for example:
safereset = "!f() { \
trap 'echo ERROR: Operation failed; return' ERR; \
echo Making sure there are no changes...; \
last_status=$(git status --porcelain);\
if [[ $last_status != \"\" ]]; then\
echo There are dirty files:;\
echo \"$last_status\";\
echo;\
echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
read dirty_operation;\
if [ \"$dirty_operation\" == \"Y\" ]; then \
echo Resetting...;\
git reset --hard;\
elif [ \"$dirty_operation\" == \"W\" ]; then\
echo Comitting WIP...;\
git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
else\
echo Operation cancelled;\
exit 1;\
fi;\
fi;\
}; \
f"
I wrote a post and have a few more examples here.
Solution 5 - Git
[alias]
chs = !git branch && git status
Solution 6 - Git
Try this one:
[alias]
chs = "!sh -c 'git checkout \"$0\" && git status'"
Call it like this: git chs master
Solution 7 - Git
It's possible to have multiline git alias by appending \
at the end of each line.
[alias]
chs = "!git checkout $1 \
; git status \
"
Solution 8 - Git
The problem here is that the positional parameters seem to be getting sent to the shell command twice (as of git 1.9.2). To see what I mean, try this:
[alias]
test = !git echo $*
Then, do git test this is my testing string
. You should observe the following output (last two lines edited here for clarity):
03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
#1 #2
One way to work around this would be to
[alias]
chs = !git checkout $1 && git status && git echo x >/dev/null
This will consume the extra positional parameter as it gets applied to that last echo command and have no effect on the results.
Solution 9 - Git
[alias]
chs = !git checkout && git status
ac = !git add . && git commit -m
what is ! ?
> If the alias expansion is prefixed with an exclamation point, it will be treated as a shell command. What does the exclamation mark mean in git config alias?
To call alias from .gitconfig file
git chs
git ac "write_your_commit_message"
alias is more useful for add and commit in git you can do more fast
Solution 10 - Git
An example for people who want to try out what different aliases do.
Putting this in the alias-section of GIT's configuration-file (e.g. ~/.gitconfig
) :
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
And then executing this command:
cat ~/.gitconfig | grep --extended-regexp -- '(a[0-9])|(alias)' ; \
echo "" ; \
export CMD ; \
for I in {0..6} ; \
do \
CMD="a""${I}" ; \
echo -n "Executing alias.${CMD} = " ; \
git config --global alias."${CMD}" ; \
git $CMD 'hoi daar' en nu ; \
git $CMD hoi daar en nu ; \
echo "" ; \
done ; \
unset CMD ;
Should give this as output:
[alias]
a0 = "!echo $*"
a1 = "!echo $* #"
a2 = "!f () { echo \"$*\"; }; f "
a3 = "!f () { echo \"$*\"; }; f #"
a4 = "!f () { echo \"$*\"; }; f \"$*\" #"
a5 = "!f () { echo \"$*\"; }; f \"$@\" #"
a6 = "!f () { echo \"$*\"; }; f \"$1\" #"
Executing alias.a0 = !echo $*
hoi daar en nu hoi daar en nu
hoi daar en nu hoi daar en nu
Executing alias.a1 = !echo $* #
hoi daar en nu
hoi daar en nu
Executing alias.a2 = !f () { echo "$*"; }; f
hoi daar en nu
hoi daar en nu
Executing alias.a3 = !f () { echo "$*"; }; f #
Executing alias.a4 = !f () { echo "$*"; }; f "$*" #
hoi daar en nu
hoi daar en nu
Executing alias.a5 = !f () { echo "$*"; }; f "$@" #
hoi daar en nu
hoi daar en nu
Executing alias.a6 = !f () { echo "$*"; }; f "$1" #
hoi daar
hoi