Let's consider the following scenario: we have a main branch, main, and we have worked on a new feature
  by breaking it down into two successive branches, featA and featB.
  main        featA   featB 
   |           |       |
  
   v           v       v
  
   ca--c1--c2--c3--c4--c5
  Commits have been added to the main branch, and we would like to rebase our branches onto the new version of
  main.
           main 
            | 
            v 
  ca--cb--cc
  To do this, we will perform two successive rebases: a simple one first, followed by one using the
  --onto command.
git rebase main featA
git rebase --onto featA c3 featB
  The --onto command allows us to rebase a range of commits. Here, we are rebasing the commit range from
  c3 (exclusive) to featB onto featA, which includes commits c4--c5.
  By comparison, a simple rebase would have also rebased the commits from the old featA branch, resulting
  in duplicate commits c1--c2--c3.
We finally obtain the following commit tree:
           main          featA     featB
  
            |              |         |
  
            v              v         v
  
  ca--cb--cc--c1'--c2'--c3'--c4'--c5'