Maybe I don't know about git subtree. I guess it can "preserve history" in the sense of keeping a corresponding new commit for every old commit, but they wouldn't have the same hash id?
git-subtree(1) also allows splitting subtree.
git-subtree(1) uses plumbing git command, which is stable interface, unlike this one, which uses porcelain command.
IIRC, Git’s maintainer uses git-subtree(1) to merge gitk and git-gui to Git.