git rebase with linked/chained pull requests

#git#rebase
Last updated . Originally published

--onto option#

Consider the following git history:

gitGraph
    commit id: "0-19as8su"
    commit id: "1-0a9s8ds"
    branch feature-1
    checkout feature-1
    commit id: "2-a0s9asd"
    commit id: "3-ss91820" type: HIGHLIGHT
    branch feature-2
    checkout feature-2
    commit id: "4-as98dam"
    commit id: "5-as0d9km"
    checkout feature-1
    commit id: "6-0as9d8s"
    commit id: "7-as90dia"
    checkout main
    merge feature-1 id: "8-0as9d8s"

We have two branches feature-1 and feature-2 branched off from the feature-1 and work on the feature-2. Then, there are two more commits on the feature-1 and it’s merged to the main branch.

To reduce conflicts when rebasing a branch on top of the main branch, we can use the --onto option of the git rebase command:

Terminal window
git rebase --onto main 3-ss91820

The 3-ss91820 is the commit hash where the feature-2 branch was branched off from the feature-1 branch.

The new git history will look like this:

gitGraph
    commit id: "0-19as8su"
    commit id: "1-0a9s8ds"
    branch feature-1
    checkout feature-1
    commit id: "2-a0s9asd"
    commit id: "3-ss91820" type: HIGHLIGHT
    checkout feature-1
    commit id: "6-0as9d8s"
    commit id: "7-as90dia"
    checkout main
    merge feature-1
    branch feature-2
    checkout feature-2
    commit
    commit

--update-refs option#

We can use the --update-refs option to update all the branches branched off in the chain with one command. Consider the following git history:

%%{init: { 'gitGraph': {'showCommitLabel': false}} }%%
gitGraph
    commit
    commit
    branch feature-1
    checkout feature-1
    commit
    commit
    branch feature-2
    checkout feature-2
    commit
    commit
    checkout feature-2
    branch feature-3
    checkout feature-3
    commit
    commit
    commit
    checkout feature-1
    commit
    commit
    checkout main
    merge feature-1

Technically, after merging the feature-1 branch to the main branch:

  1. The feature-2 branch should be rebased on top of the main branch
  2. And finally, the feature-3 branch should be rebased on top of the feature-2 branch

To achieve this, we can use the --update-refs option:

Terminal window
# Checkout the top branch in the chain
git checkout feature-3
# Rebase the branch on top of the main branch with --update-refs option
# This will rebase the branch on top of the main branch and update all the branches in the chain
git rebase main --update-refs

The new git history will look like this:

%%{init: { 'gitGraph': {'showCommitLabel': false}} }%%
gitGraph
    commit
    commit
    branch feature-1
    checkout feature-1
    commit
    commit
    checkout feature-1
    commit
    commit
    checkout main
    merge feature-1
    branch feature-2
    checkout feature-2
    commit
    commit
    checkout feature-2
    branch feature-3
    checkout feature-3
    commit
    commit
    commit

This way, we can reduce the efforts when rebasing a branch on top of another branch with the --update-refs options.