summaryrefslogtreecommitdiff
path: root/git-checkout.sh
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2007-06-08 08:19:13 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-06-08 08:19:13 (GMT)
commit5035242c4785bd23c53827a1656b5f97394f724e (patch)
treef7ea750c986e73b3d1eff27070e547f8d5373857 /git-checkout.sh
parent23fcdc79713c47a6a0d50762b9311c9933a60d3f (diff)
downloadgit-5035242c4785bd23c53827a1656b5f97394f724e.zip
git-5035242c4785bd23c53827a1656b5f97394f724e.tar.gz
git-5035242c4785bd23c53827a1656b5f97394f724e.tar.bz2
checkout: do not get confused with ambiguous tag/branch names
Although it is not advisable, we have always allowed a branch and a tag to have the same basename (i.e. it is not illegal to have refs/heads/frotz and refs/tags/frotz at the same time). When talking about a specific commit, the interpretation of 'frotz' has always been "use tag and then check branch", although we warn when ambiguities exist. However "git checkout $name" is defined to (1) first see if it matches the branch name, and if so switch to that branch; (2) otherwise it is an instruction to detach HEAD to point at the commit named by $name. We did not follow this definition when $name appeared under both refs/heads/ and refs/tags/ -- we switched to the branch but read the tree from the tagged commit, which was utterly bogus. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-checkout.sh')
-rwxr-xr-xgit-checkout.sh3
1 files changed, 2 insertions, 1 deletions
diff --git a/git-checkout.sh b/git-checkout.sh
index ed7c2c5..7c5ca3d 100755
--- a/git-checkout.sh
+++ b/git-checkout.sh
@@ -63,12 +63,13 @@ while [ "$#" != "0" ]; do
echo "unknown flag $arg"
exit 1
fi
- new="$rev"
new_name="$arg"
if git-show-ref --verify --quiet -- "refs/heads/$arg"
then
+ rev=$(git-rev-parse --verify "refs/heads/$arg^0")
branch="$arg"
fi
+ new="$rev"
elif rev=$(git-rev-parse --verify "$arg^{tree}" 2>/dev/null)
then
# checking out selected paths from a tree-ish.