Git rebase tricks

git log –oneline + git rebase –interactive

So there I was, wanting to insert a dozen or so commits from a particular branch on top of another.

Aside: this was the result of a long-running branch that had been rebased to master several times, resulting in branch.5, branch.6 and so on. So, I wanted a few changes from a branch that was based on branch.5 (say) on top of a newer branch based on branch.17 or so – but re-basing from branch.5 to branch.17 caused a bunch of conflicts. So, I could just git cherry-pick them onto the branch … but …

I think I first read about git rebase --interactive in this blog post where this mode is praised as “completely insane and quite dangerous but capable of exposing entirely new states of mind.”

When you run it, you are given an editor (which is in fact editing .git/rebase-merge/git-rebase-todo) which looks something like this:

pick 178e18a some commit mesage
pick 737bce0 another commit message
# Rebase a8aea9f onto 1d32b62
# Commands:
#  p, pick = use commit

If you do git log --oneline you get something pretty similar looking:

ea05563 another commit message
f8cb166 some commit message

(Note that one is in the reverse order of the other). In any case, it turns out you can just put in extra commits to the git-rebase-todo list! So, you can take the output of git log --oneline --reverse ..., add pick in front of each line and paste it into the editor you get from git rebase --interactive!

So, fun party trick! …and actually quite useful if you want to cherry-pick a bunch of commits from another branch but not type git cherry-pick .. a lot.

Update May 18, 2016: Andrew writes to point out:

Nice! To apply a series of commits from a different branch onto
the current one, I often do:

    git format-patch --stdout master..feature2  | git am -

Andrew’s solution is nice (and way simpler) if you want all the commits off another branch. In my case, I didn’t want all of them…