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.