mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
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>
This commit is contained in:
parent
23fcdc7971
commit
5035242c47
@ -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.
|
||||
|
@ -190,4 +190,44 @@ test_expect_success 'checkout to detach HEAD with HEAD^0' '
|
||||
fi
|
||||
'
|
||||
|
||||
test_expect_success 'checkout with ambiguous tag/branch names' '
|
||||
|
||||
git tag both side &&
|
||||
git branch both master &&
|
||||
git reset --hard &&
|
||||
git checkout master &&
|
||||
|
||||
git checkout both &&
|
||||
H=$(git rev-parse --verify HEAD) &&
|
||||
M=$(git show-ref -s --verify refs/heads/master) &&
|
||||
test "z$H" = "z$M" &&
|
||||
name=$(git symbolic-ref HEAD 2>/dev/null) &&
|
||||
test "z$name" = zrefs/heads/both
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'checkout with ambiguous tag/branch names' '
|
||||
|
||||
git reset --hard &&
|
||||
git checkout master &&
|
||||
|
||||
git tag frotz side &&
|
||||
git branch frotz master &&
|
||||
git reset --hard &&
|
||||
git checkout master &&
|
||||
|
||||
git checkout tags/frotz &&
|
||||
H=$(git rev-parse --verify HEAD) &&
|
||||
S=$(git show-ref -s --verify refs/heads/side) &&
|
||||
test "z$H" = "z$S" &&
|
||||
if name=$(git symbolic-ref HEAD 2>/dev/null)
|
||||
then
|
||||
echo "Bad -- should have detached"
|
||||
false
|
||||
else
|
||||
: happy
|
||||
fi
|
||||
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user