My question is in two parts.
First part: Two blobs in git rebase
I am familiar with git rebase -i HEAD^n, where n means the number of commits ago you wish to rebase onto.
But, I also sometimes see git rebase -i <branch> HEAD. In that case - How does the added <branch> parameter make a difference?
Second part: man page for git rebase
So....I checked the man page, and I see the following:
On that man page, I see [<upstream> [<branch>]], which I think might answer my question to the first part.
But, the peculiar thing about this is that I know <> means mandatory parameter, and [] means optional parameter. In [<upstream> [<branch>]], I see a mandatory parameter inside of an optional parameter. What does this mean?

It does because a rebase replays all commits between upstream and branch.
git rebase -i HEAD^nmeans all commits between HEAD^n and the current branch HEADgit rebase -i <branch> HEAD(orgit rebase -i <branch>) means all commits between<branch> HEAD(which is here the upstream branch) and the current branchHEAD. For example:git rebase -i origin/master HEAD: all commits not yet pushed.[<upstream> [<branch>]]means both parameters are optional.Since git has been created by the author of Linux, see man-pages - conventions for writing Linux man pages
For
git rebase, those optional parameters are:Regarding
<...>convention, see for instance "Utility Argument Syntax":Finally, a ref is not a type of blob.
A ref is (see "Git Internals - Git References") a reference to a SHA1 value.
A blob represents a content stored in a git repo. See "Git Internals - Git Objects - Object storage".