Skip to content

Instantly share code, notes, and snippets.

@unbracketed
Created April 7, 2015 17:49
Show Gist options
  • Save unbracketed/889c844473bcca1917e2 to your computer and use it in GitHub Desktop.
Save unbracketed/889c844473bcca1917e2 to your computer and use it in GitHub Desktop.
Moving commits between branches

Example: Moving up to a few commits to another branch

Branch A has commits (X,Y) that also need to be in Branch B. The cherry-pick operations should be done in the same chronological order that the commits appear in Branch A.

cherry-pick does support a range of commits, but if you have merge commits in that range, it gets really complicated

git checkout branch-B
git cherry-pick X
git cherry-pick Y

Example: Moving a range of commits

Branch A has a series of commits (X..Y) that need to be moved to branch B. For this case, you'll need to specify the commit before the initial commit you're interested in order for it to be included. Example: you want commits B..D from (...A->B->C->D-E->...) you would use "A" as the starting commit. You'll also need the commit SHA for the HEAD of the branch you are transferring to.

git checkout branch-B
git log  # Note the SHA of most recent commit (M)
git rebase --onto M <commit before X> Y
git rebase HEAD branch-B
@otheus
Copy link

otheus commented Feb 22, 2022

Sorry, but this makes no sense. It still needs some clarification. And what really drives me crazy, is that if you don't do this command exactly right, you can create a complete mess that will take hours of cherry-picking and searching through the reflog to undo. So it's not like you can experiment.

Branch A has a series of commits (X..Y) that need to be moved to branch B. For this case, you'll need to specify the commit before the initial commit you're interested in order for it to be included. Example: you want commits B..D from (...A->B->C->D-E->...) you would use "A" as the starting commit. You'll also need the commit SHA for the HEAD of the branch you are transferring to.

Where are commits X through Y in relation to commits A through E ? You're referring to Branch A and commit A. Are they the same? Where did branch B come from? Is it related to branch A or commit B? or does that not matter?

OK, you checkout branch B. Now rebase "onto" it the commits X through Y.

For this case, you'll need to specify the commit before the initial commit you're interested in order for it to be included.

In your example, we're interested in X and Y. So we find "M" which is the "most recent commit". You say the command is:

git rebase --onto M <commit before X> Y

so that's:

git rebase --onto <most recent commit> <commit before X> Y

But since we just did a checkout of branch B, why isn't M == HEAD? Or why not

git rebase --onto HEAD <commit before X> Y

which is (according to the documentation) the save as:

git reset --hard HEAD  ; git rebase <commit before X> Y

which is the same as

git rebase X^ Y

Or ... am I missing something? If not, the example is simply:

git checkout -b new-branch commit-of-starting-point
git rebase X^ Y

@iampeterbanjo
Copy link

I used this today and the Git did not implode 🎉 Thank you

@Simulacron-3
Copy link

Thanks, used cherry-pick today for the first time without collapsing the space-time continuum <3
@iampeterbanjo i feel your concerns :)

@piankris
Copy link

Nice and easy, thank you for the explanation and comments in the section for alternatives!

@dataheadless
Copy link

This article explains it well in details.

How To Move A Commit To Another Branch In Git

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment