I hit an interesting situation recent which I’ll try to recreate here in the hopes that others might benefit.

Imagine that we cut a branch called tp1 from our master and did some work on that branch. At the same time, some other work was done and pushed onto master. Our current DAG looks ike this.

Initial scenario

Now, while on the topic branch, we do some work and commit them to create this. I’ve used tb2 in the commit messages so that you can identify them easily.

Two commits on topic branch 1

Now, we realise that these two commits should be on a different topic branch which should be based off master. We look at the logs (while on the topic branch) and see this

(ol)[1] noufal@sanitarium% git log --pretty=oneline 
32abaeefed66ee5165b7e7edddb5604ecdb2fa64 tb2 5
4541e86113cb4ceaf654ed74abe85d477950ed2f tb2 4
84d1f43da8b6d63592627aca6ecd4c7e3df29600 tb1 3
7956bc382d183674208f1b04c3e62d12806c517c tb1 2
a6d74c2cb1e0b7ba456626898fd63a3c0d1fc863 tb1 1
c60c4c22f2eb8d3c7465ad3b138a7d4a3aee3c5f master 3
0c99224a32fcc61e123f94837d971456a2659bb0 master 2
c3522d06410e2a37444ed5759f7a6f4c7b67ad17 master 1

We want 8a94e9cf00aa2df580d7beed8efb52557bdfce16 to be based off the current tip of the master branch

(ol)[1] noufal@sanitarium% git log --pretty=oneline master
755b7823acfa30f60ade5ad6c5c575116c38fe92 master 5
95da533bb52e60497ba5312dcd0540c1bd32db96 master 4
c60c4c22f2eb8d3c7465ad3b138a7d4a3aee3c5f master 3
0c99224a32fcc61e123f94837d971456a2659bb0 master 2
c3522d06410e2a37444ed5759f7a6f4c7b67ad17 master 1

In other words, off commit 755b7823acfa30f60ade5ad6c5c575116c38fe92. How do we do this?

We first create a the new topic branch (lets call it tp2). Our DAG now looks like this

New topic branch created

And then we rebase this onto the master branch using the 84d1f43da8b6d63592627aca6ecd4c7e3df29600 as the branching point like so git rebase --onto master 84d1f43da8b6d63592627aca6ecd4c7e3df29600 tp2.

(ol)[1] noufal@sanitarium% git rebase --onto master 84d1f43da8b6d63592627aca6ecd4c7e3df29600 tp2
First, rewinding head to replay your work on top of it...
Applying: tb2 4
Applying: tb2 5

Once this is done, we get

Rebasing is done

And then we switch back to the tp1 branch and reset it to discard the two extra commits that are now tracked by tp2.

noufal@sanitarium% git co tp1
Switched to branch 'tp1'
noufal@sanitarium% git reset --hard 84d1f43da8b6d63592627aca6ecd4c7e3df29600
HEAD is now at 84d1f43 tb1 3

We get this

Final product

blog comments powered by Disqus