Git rebase one branch on top of another branch

Beginner picture Beginner · Oct 13, 2016 · Viewed 67.4k times · Source

In my git repo, I have a Master branch. One of the remote devs created a branch Branch1 and had a bunch of commits on it. I branched from Branch1, creating a new branch called Branch2 (git checkout -b Branch2 Branch1) such that Branch2 head was on the last commit added to Branch1:(Looks like this)

Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 

Branch1 has had a number of changes. The other dev squashed his commits and then added a few more commits. Meanwhile, ive had a bunch of changes in my branch but havent committed anything yet. Current structure looks like this:

  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)

Now I want have to rebase my changes on top of Branch1. I am supremely confused on how to go about this. I know the 1st step will be to commit my changes using git add . and git commit -m "message". But do i then push? using git push origin Branch2 ? or git push origin Branch2 Branch1 ? Help is much needed and GREATLY appreciated, also if I can some how create a backup of my branch, it will be great in case I screw something up

Answer

Tim Biegeleisen picture Tim Biegeleisen · Oct 13, 2016

First backup your current Branch2:

# from Branch2
git checkout -b Branch2_backup

Then rebase Branch2 on Branch1:

# from Branch2
git fetch origin           # update all tracking branches, including Branch1
git rebase origin/Branch1  # rebase on latest Branch1

After the rebase your branch structure should look like this:

master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'

In the diagram above, the apostrophe on Branch2 indicates that every commit in the rebased Branch2 after commit 4 is actually a rewrite.

Keep in mind that you have now rewritten the history of Branch2 and if the branch is already published you will have to force push it to the remote via

git push --force origin Branch2

Force pushing can cause problems for anyone else using Branch2 so you should be careful when doing this.