Commits link to their parent(s) until the initial commit. You can visualize a “branch” as a series of commits, but the same thing can exist without calling it a branch:
A -> B -> C —> Initial
Is that a branch? No. How about: /refs/heads/main = A
That’s a branch, and it looks exactly the same as a tag: /refs/tags/v1 = A
Neither a branch or a tag is “a series of commits” even if you think it does.You can visualize a "square" as a rectangle with equal sides, but the same thing can exist without calling it a square.
A branch is named, points to a commit and under normal circumstances will track the sequence of commits made via itself (i.e. when you commit and HEAD points to branch b, b starts pointing to the child commit). So you could say it's a named sequence of commits.
On the other hand you can reset the branch to any commit in the tree, even ones which aren't even on the current sequence of parents. It is still technically a named sequence of commits, just a totally different one.
[1] The main difference perhaps is that, if you create a new commit, the branch pointer will actually be moved to point to that latest commit (while tag stays fixed).
Having run into issues that appear to be caused by 3 not being true, I don't see that as a theoretical issue.
Until the gc reaps them, you can absolutely git checkout the hash of any of the rewritten history and it’s still there, same as you left it. You can even move the branch pointer back, undoing the history rewrite.