I have created an alias for catching up my tracking branches as needed. Here's the current line from the [alias]
section of my .gitconfig:
catchup = !CURRENTBRANCH=$(git symbolic-ref --short HEAD) && echo Currently on $CURRENTBRANCH - switching to $1 && git checkout $1 && git merge origin/$1 && echo Going back to $CURRENTBRANCH && git checkout "$CURRENTBRANCH"
I use it as follows (for example):
git catchup new_design
This code results in (for example):
Currently on integration
Switched to branch 'new_design'
Your branch is behind 'origin/new_design' by 1 commit, and can be fast-forwarded.
Updating c82f7db..51eea8a
Fast-forward
themes/theme1/css/styles.less | 17 +++++++++++++++++
themes/theme1/js/app.js | 6 +++---
2 files changed, 20 insertions(+), 3 deletions(-)
Going back to integration
error: pathspec 'new_design' did not match any file(s) known to git.
I have tried the last command in the alias both with and without the double-quotes, with the same result.
Anyone know how to resolve that error at the end?
For those who might suggest using git pull
, it doesn't resolve my problem, and would require entering my password. This alias is to be used if I have recently used git fetch
, and have no need to go back to the remote repo.
I am running git bash on Windows 7, fyi.
Use a shell function for the alias:
[alias]
catchup = "!f() { CURRENTBRANCH=$(git symbolic-ref --short HEAD) && .... ;}; f"
There the handling of $n
works as expected.
The OP mwotton confirms in the comments that the following works:
catchup = "!_(){ CURRENTBRANCH=$(git symbolic-ref --short HEAD) ; echo \"Currently on \"$CURRENTBRANCH\" - switching to \"$@ ; git checkout $@ ; git merge origin/$@ ; echo \"Going back to \"$CURRENTBRANCH ; git checkout $CURRENTBRANCH; }; _"
In multi-line, for more visibility:
catchup = "!_(){
CURRENTBRANCH=$(git symbolic-ref --short HEAD) ;
echo \"Currently on \"$CURRENTBRANCH\" - switching to \"$@ ;
git checkout $@ ;
git merge origin/$@ ;
echo \"Going back to \"$CURRENTBRANCH ;
git checkout $CURRENTBRANCH; }; _"
Late for the party.. The reason it failed is that git runs the command as
git catchup new_design
# turns
CURRENTBRANCH= ... && git checkout "$CURRENTBRANCH\" new_design
That is, it appends "new_design" to the command. A proof of this is simple to demonstrate:
# [alias]
# proof = !echo fixed text
> git proof tryme
# prints "fixed text tryme", not "fixed text"
So, an alternate option to stefan's answer is to use the comment trick
# [alias]
# proof = "!echo fixed text #"
> git proof tryme
# prints "fixed text", since command it ranned was
# echo fixed text #tryme
catchup = "!CURRENTBRANCH=$(git symbolic-ref --short HEAD) && echo Currently on $CURRENTBRANCH - switching to $1 && git checkout $1 && git merge origin/$1 && echo Going back to $CURRENTBRANCH && git checkout \"$CURRENTBRANCH\" #"
# multiline version:
catchup = "! \
CURRENTBRANCH=$(git symbolic-ref --short HEAD) && \
echo Currently on $CURRENTBRANCH - switching to $1 && \
git checkout $1 && \
git merge origin/$1 && \
echo Going back to $CURRENTBRANCH && \
git checkout \"$CURRENTBRANCH\" \
#"
Notes:
"!..."
and !"..."
are equivalent$*
), since it prevents at all the appendIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With