It’s a sunny day, you are having a great time coding, and being the diligent individual you are, you commit regularly.

And then it hits you: several commits, all to the wrong branch. What now?

Well, this is Git we are talking about, so the good news is that it’s relatively straightforward.

Let’s say you committed to master, and you meant to commit to a new branch called “myfeature”. There are two things that need fixing. First of all, you need to revert the master back to where it originally was. And secondly, you need to get your changes on that new branch.

Now here are your options:

  • Undo commits on master, checkout new branch myfeature and commit all your changes as one commit.
  • Modify refs manually for the master to point back to where you were and for your new branch ref to.

The first solution is nice, simple and easy to apply without a relatively small margin for error. The downside is, however, that you don’t get your original commit messages on the new branch, and all changes are applied as a single commit with a new commit message etc.

The second solution is a little more involved. However, it means that all your commits are passed over to the new branch – though, of course, you should check your results before pushing up to your central repo, as it is slightly easier to get wrong.

Undo and Commit to New Branch

Make sure you are on the branch to which you have been committing. Use git log to check how many commits you want to roll back. Then undo the commits with git reset HEAD~Nwhere “N” is the number of commits you want to undo.

For example, to undo one commit:

git reset HEAD~1

Then create a new branch and check it out in one go and add and commit your changes again.

git checkout -b newbranch

git add -A

git commit -m "Committed on new branch"

Be careful with the add -A though as you may be adding unrelated uncommitted files and directories. Have a look at git status before you commit to checking.

Move Commits to the Other Branch

There is more margin for error with this one. The first step is to take a note of the commit id of the commit you want to make the head of the new branch.

git log

Copy the commit id to somewhere safe.

Then reset your current branch back by one commit (or however many commits you need to go back):

git reset --hard HEAD~1

And the final step is to move the commits that follow to the new branch:

git checkout -b newbranch

git reset --hard < commit_id >

And it’s done! Time to push both branches (with --force if needed, i.e. if you had previously pushed the changes). However, as always, when using --force make sure there are no other commits that follow yours as they would be undone.

New to Git? Find out more and get in touch!

Published: Apr 12, 2018

Updated: Nov 15, 2023

DevOpsAtlassian