rebase: dereference tags
commit7740ac691d8e7f1bed67bcbdb1ee5c5c618f7373
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Tue, 21 Sep 2021 10:24:07 +0000 (21 10:24 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 22 Sep 2021 19:04:52 +0000 (22 12:04 -0700)
tree636483021543997ae6993af19651e939401aa142
parent1d188263e0847fd356d7ff245c32e8ebb29115b3
rebase: dereference tags

A rebase started with 'git rebase <A> <B>' is conceptually to first
checkout <B> and run 'git rebase <A>' starting from that state.  'git
rebase --abort' in the middle of such a rebase should take us back to
the state we checked out <B>.

This used to work, even when <B> is a tag that points at a commit,
until Git 2.20.0 when the command was reimplemented in C.  The command
now complains that the tag object itself cannot be checked out, which
may be technically correct but is not what the user asked to do.

Fix this old regression by using lookup_commit_reference_by_name()
when parsing <B>. The scripted version did not need to peel the tag
because the commands it passed the tag to (e.g 'git reset') peeled the
tag themselves.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rebase.c
t/t3407-rebase-abort.sh