 <p>I don't understand your concern about G, H, I appearing on branchB instead of branchA. What I mean is, if you rename your <code>branchA</code> to <code>branchB</code>, and branch off from <code>I</code> to create the new <code>branchA</code>, and commit <code>M</code> to <code>branchA</code>, you should get what you want.</p> <p>As far as I know, the branches are simply named heads pointing to particular commits (look at .git/refs/heads), and the rest of the tree is determined solely by parent-child relationships in git. Even if you somehow manage to rebase J-K-L onto a new branchB, and commit M to the now vacant space, the object data would be identical. Both M and J would point at I as their parents, and G/D would point to C as their parents, and the rest would simply point to their immediate parent. Am I missing something here?</p>