I'm writing a Bash script, and I want to checkout a tag and then checkout back to where I started.
I tried git co HEAD@{1}
, but when starting at master, that takes me back to the commit SHA of master but with a detatched head.
Is there something like pushd
& popd
for Git?
git checkout @{-1}
which can be abbreviated to git checkout -
.
From the manpage:
As a special case, the "@{-N}" syntax
for the N-th last branch checks out
the branch (instead of detaching). You
may also specify - which is synonymous
with "@{-1}".
EDIT: wnoise's suggestion will work if you don't want to keep an explicit history the way pushd/popd does. If you do (and don't want an ordinary checkout
to affect your LRU):
I don't know of anything that will do what you want out of the box, but it's not to hard to hack together something along those lines. If you add a file named git-foo
to your PATH, you get a new git foo
command. So, git-pushd
could look like:
#!/bin/bash
SUBDIRECTORY_OK=1
. $(git --exec-path)/git-sh-setup
git symbolic-ref HEAD | sed s_refs/heads/__ >> $GIT_DIR/.pushd
git checkout "$@"
And git-popd
:
#!/bin/bash
SUBDIRECTORY_OK=1
. $(git --exec-path)/git-sh-setup
REF=$(head -n1 $GIT_DIR/.pushd)
[ -n "$REF" ] || die "No refs to pop"
git checkout "$REF" && sed -i -e '1d' $GIT_DIR/.pushd
In your script, first save the current branch (like written in this answer):
branch_name="$(git symbolic-ref HEAD 2>/dev/null)" ||
branch_name="(unnamed branch)" # detached HEAD
branch_name=${branch_name##refs/heads/}
then go and checkout the tag you want to
git checkout -b tag_branch tag_name
Do what you want to do on that branch, then checkout the old branch again:
git checkout $branch_name
That's it.