thesecretmaster thesecretmaster - 4 months ago 14
Git Question

Undoing an old fast foreward commit

Looking back at some work I did, there was a fast forward commit that really makes it hard to tell what was worked on, so I would like to move that commit to it's own branch. Here is my current situation:

A--B--C--D


And lets say that C is the one commit I want to move. C also (from the FF commit) has it's own branch that is on it (
branch2
). I want it to look like:

A--B--------C2--D
\ /
\ /
C--/


So C is on
branch2
and C2 is a merge commit and A, B, and D are all on
master
.

Here is some extra info:

$ git reflog show branch2
245c52c branch2@{0}: commit: C
7c2a064 branch2@{1}: branch: Created from HEAD

$ git reflog show master
c0a8aff master@{0}: commit: D
244c52c master@{1}: merge branch2: Fast-forward
8a93b2f master@{2}: commit: B
fe872d8 master@{3}: commit: A

Answer

If you have:

 A--B--C--D (master)
       |
   (branch2)

You can reset master and redo the merge (in a non-FF way), then cherry-pick D (or rebase, if D is actually multiple commits)

git checkout master
git branch tmp # mark D if you need to
git reset --hard B
git merge --no-ff branch2

 A--B----C2
     \   /
      --C (branch2)
         \
          --D (tmp)

Then:

git cherry-pick D

If D was actually composed of multiple commits, the 'tmp' branch would come in handy:

git rebase --onto master branch2 tmp

That would replay all commits after branch2 (so excluding C), up until tmp HEAD (that is D) on top of master (C2)