G---H // Release Branch
/
/
A---B---E---F--- // master
\\
\\
C---D--- // bug fix branch
Based on our particular ne
This article advises to instead of merging two branches, you would rebase them where git would only rebase non duplicate commits.
But instead of cherry-picking, you might consider just rebasing the branch:
rebase --onto release B bug
where release
is the release branch and bug
is the bug branch.
You then get something like
C'---D' //Bug branch
/
/
G---H // Release Branch
/
/
A---B---E---F--- // master
But this would mean that when you want the bug fixes to be applied to master that you would need to merge bug with master, which causes all the changes in release also to be added to master.
It's up to you to decide what works best for you.
Note that you should not rebase branches that have been pushed to other, because it will create a mess for them.
Create a patch file containing the unique content from the bugfix branch. Then apply that patch file to the release branch.
Example:
> git checkout bugfix_branch
> git diff B HEAD > unique_changes.patch /* where "B" is the point where bugfix_branch split from dev */
> git checkout release_branch
> git apply unique_changes.patch
Et voila! You now have only the unique changes from the bugfix branch in your release branch. Note that format-patch
tends to more gracefully handle situations where files have been moved or deleted, so you may need to play around with the actual process by which the patch is generated, but this approach should get you close.
Note: as explained above, cherry-picking is acceptable here.
Its main drawbacks are:
In your case:
C
and D
aren't based on code introduced in B
, ... cherry-pick them wherever you need them.There is no real danger in using cherry-pick, especially if you don't plan on ever merging the release
branch into master
.
In general, you can prevent problems like these by basing bug fixes on commits that are included in all branches you want to merge the fix into. In the development of git itself, that is achieved by merging all bug fixes into the maint
branch (i.e. current stable series which only receives fixes) and then merging that into master
periodically. That way, the fix is everywhere and the merges are sane.