Elijah Newren [off-list ref] writes:
Using your own words:
"the replace mechanism is about telling Git: when anybody refers to
deadbeef, use its replacement if defined instead."
"When anybody wants the contents of deadbeef, give the contents of
its replacement" is what the replace (graft, too) is.
git branch didn't do that; it put deadbeef into refs/heads/foobar.
Yes, but refs/heads/foobar having deadbeef does not have a problem,
as long as you get the contents of the replacement object when you
ask for the contents of deadbeef (or "the object referred to by
the refs/heads/foobar ref").