Patrick B. Patrick B. - 1 year ago 89
Git Question

Undoing a git rebase --skip - reapply a commit during a rebase

I'm doing a long

git rebase
with a lot of commits. I accidentally
a commit where there were some conflicts which I resolved. I should have done
git rebase --continue

Is there are way to re-apply this previous commit during this rebase phase and then continue the rebase?

One way I see is to

  1. stop the rebase at this point by creating a branch on the last commit which was correctly applied

  2. restart the rebase starting with the previously skipped commit.

Or can I do a cherry-pick whilst being in a rebase-phase?

Answer Source

I found a way which "worked for me":

During a rebase lots of things are happening in the .git/rebase-apply-path. Amongst others there is a file called next. next is containing a number which corresponds to a file which is residing the .git/rebase-apply-path as well. This file contains information about the commit which is currently being processed. For example:

$ cat .git/rebase-apply/next
$ less .git/rebase-apply/0260
<info about the commit which is currently processed (and has conflicts)

Git seems to keep the commits which are skipped as the above mentioned files. Whereas files corresponding to commits which have been applied are not there anymore. The commit I accidentally skipped was called 0259 and the file was still present.

Here is what I did:

$ echo "0258" > .git/rebase-apply/next

With that I told git that currently the 258th commit is processed (which previous applied correctly). Then I did

$ git rebase --skip

to tell git to forget this one and, voila, I could again work on the skipped commit, correct the conflicts and --continue. It has worked.