how to keep diverged form of a merged commit in a cherry-pick?

73 Views Asked by At

I want to cherry-pick a range of commit and among them, there is a merged commit which when I want to cherry-pick my commits, this merged commit just get cherry-picked in a linear form but I want to keep its diverged form and to see which commits are the parents of this merged commit but this situation isn't possible in a linear history created by cherry-pick, so I was wondering if it is possible to keep our history diverged in a cherry-pick or if isn't possible, is there any other alternative in git?

command I used:

git cherry-pick (commit C hash)~1..(commit F hash)   (my head is pointing to test1)

Diagrams:

A--B--C--E--F--K (master)               Current history
    \  \   /
     J   D (test2)
    (test1)
A--B--C--E--F--K--T (master)             History after cherry-picking
    \  \   /
     J   D (test2)
      \
       C
        \
         D
          \
           E
            \
             F
             (test1)
A--B--C--E--F--K--T (master)             Expected history after cherry-picking
    \  \   /
     J   D (test2)
      \
       C
      / \
     D   E
      \   \ 
       \---F   
          (test1)
2

There are 2 best solutions below

7
ElpieKay On BEST ANSWER

One solution is interactive reabse (git rebase -i).

 git rebase -i -r --onto J C~ F
 # The edit screen pops up. Just save and quit.

The expected history is created in a detached HEAD. Then update test1 with this new HEAD.

git update-ref refs/heads/test1 HEAD

The commits C, D, E and F are rebased onto J. -r/--rebase-merges instructs to preserve the merge commit structure.

0
j6t On

You are looking for git rebase --rebase-merges:

git branch -f test1 F
git rebase --rebase-merges J test1