This is partially inspired by
git: how to insert a commit as the first, shifting all the others?
http://stackoverflow.com/q/645450/19750
Version control is about decoupling the patch of some changes with their
results. This lets you do neat things like cherry picking and rebasing,
and of course just viewing a diff.
Sometimes you want to take two snapshots and unify them with a merge or
unify them with a "theirs" merge.
Sometimes you want to take two snapshots and tell the VCS that one was
produced from the other --- to invent a merge base where none previously
existed, for example.
So T is the root of master, and we're working on newroot, and we want
T to apply cleanly to newroot.
(newroot)$ git cherry-pick T
# Conflicts etc.
That won't do.
(newroot)$ git read-tree T
(newroot)$ git commit
That will, and now we can rebase onto newroot master.