You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
breaking changes can only be applied on top of the highest major/minor version number combination
process
find the highest {major}.{minor} version branch
git checkout {major}.{minor}
git checkout -b {major + 1}.0
develop change
non-breaking API change
limitations
non-breaking API changes can only be applied to the highest minor version within each major version
process
find the highest {minor} version branch within a {major} version that can take the API change
git checkout {major}.{minor}
git checkout -b {major}.{minor + 1}
develop change
for each other major version, apply the change on top of the highest minor version branch within that major version if that major/minor combination can take the
API change
non-breaking non-API change
limitations
non-breaking non-API changes can only be applied to the highest revision version within each major/minor version combination
process
find a {major}.{minor} version branch that can take the change
git checkout {major}.{minor}
develop change
for each other major/minor version combination, apply the change to that version branch if the branch can take the change
NOTE
we use branches and not tags; these release branches are under active development, so it makes sense to track them as branches. if we want to add a tag to the specific revision version commits when we do the release process for tracking, that is fine, but unrelated
we do not have to release every version branch that gets generated
just because we have been able to take a change in an older version branch due to convenience does not mean that we are committing to actively maintaining that version
if releases are automated, there is low overhead for following this process, and it gives customers fixes more often
we can release breaking changes more often because we will be able to easily take fixes from lower versions into higher versions (and vice versa) without the additional maintenance cost
voidApplyNonbreakingApiChange(intmajor,intminor){for(inti=major+1;true;++i){gitcheckout{i}.0if(%errorlevel%!=0){// this major version doesn't exist, we are donebreak;}intj;for(j=1;true;++j){gitcheckout{i}.{j}if(%errorlevel%!=0){// we found the highest minor version within this major versionbreak;}}gitcheckout-b {i}.{j+1}
git cherry-pick{major}.{minor+1}if(%errorlevel!=0){git cherry-pick --abort// this major version cannot take the new API, higher major versions won't be able to either
break;}}}