I have a develop branch with feature 1, feature 2, and some fixes. For another dev reason we wanted to create another branch from develop and wanted only the fixes in that branch, with out the feature 1 and feature 2. So I create a branch from develop and revert the commit of feature 1 and two. Now we did some development in that new branch. Now I want to merge this branch with the develop branch. But we need the feature 1 and 2 in the develop branch. But if we merge, then the feature 1 and 2 commits will be removed from the develop.
So what is the best way to tackle it in git. One approach is to get the changes of feature 1 and 2 and apply as a patch to the merged develop branch. But the problem is these two features has several changes.
In the following answer, I assume that when you branched off from
develop, the first thing you did was to revert the two feature commits, and after this you did your actual development work. If this not be the case, my answer should still be helpful, though you would have to do some additional steps perhaps to fix your situation.
Perhaps the conceptually easiest solution to your problem would be to just cherry-pick the non revert commits from the new branch into
git checkout develop git cherry-pick B^..D
D with the SHA-1 commit hashes of the commits you want to bring into
develop from the new branch. Note that you may get merge conflicts from this, since you are reapplying your work onto a different base.
If you are feeling more adventurous, you could also try using
git rebase --onto. Here is a diagram which illustrates the current state of your new branch and
develop ... ---A---B---C \ newbranch R1---R2---D---E
And you would like to play the
E commits from
newbranch on top of
develop, while ignoring those
R2 revert commits. In other words, you want to end up with this:
develop ... ---A---B---C---D'---E' \ newbranch R1---R2---D---E
You can use the following commands to achieve this:
git checkout develop git rebase --onto C R2 E
onto command says to take
C as a base, and replay all commits whose parent is
R2 (but not including
R2 itself) up to, and including, commit
C coincides with the
develop, we are just asking Git to replay commits
E, in that order on top of the tip of
If you want an excellent explanation of Git's
rebase --onto, I recommend reading the answer given by @Enrico here: