TIL: Understanding git rebase so it sticks
I endlessly misremember how to use git rebase. That ends today. Here are my notes to help me remember.
Rebase is traditionally documented as:
git rebase [--onto newbase] [upstream [branch]]
This is confusing for several reasons. A slight improvement is to rename the args:
git rebase [--onto target] [exclude [include]]
Where:
- 
includeis the tip of the branch to be transplanted. If omitted, it defaults to the current branch.
- 
excludeexcludes all its ancestors from being transplanted. Hence the transplanted branch will have its tip atinclude, and its base at the common ancestor ofincludeandexclude. If--ontoisn't specified,excludeis also used as the destination for the transplant.
- 
targetis the place to transplant the branch to. If not specified, it defaults to the value ofexclude.
Hence, a simple before and after:
o---o---o---o---o---o exclude
     \
      1---2---3 current branch
                or include
git rebase exclude [include]
                exclude
                v
o---o---o---o---o---1---2---3 current branch
                              or include
See how the commits to be transplanted start at include and go back to
the common ancestor of that and exclude. Since --onto isn't
specified, exclude is also used as the transplant destination.
Or a more complex one:
 o---o---o---o---o target
      \
       o---o---o exclude
            \
             1---2 current branch
                   or include
git rebase --onto target exclude [include]
                    target
                    v
    o---o---o---o---o---1---2 current branch
         \                    or include
          o---o---o
                  ^
                  exclude
Again, the commits to be transplanted are defined by include and
exclude, but this time a separate destination is specified using
--onto.