After reading the Continuous Delivery Book, I have been thinking a lot about branching strategies and Continuous Integration versus Feature Branching. I put together this little chart of the pros and cons of each.
|Feature Branching||Continuous Integration|
|Trust||Does not require trust. You can control via GitLab who can merge into main branch. Great for open source projects and other low-trust environments.||Requires some trust since anyone can check into main.|
|Knowledge Distribution||Pull/Merge Requests (PRs) can serve as a built-in code review that helps to distribute knowledge.||By continuously integrating with others code you become more aware of what others are working on.|
|Merging||You avoid having frequent merges by creating branches and playing in your own sandbox. However when you do have to merge at the end of a feature, it can be quite painful, particularly if the feature branch is long-lived. Merges can be more difficult if someone other than the original author performs the merge.||You do end up merging a lot, but most of them are small and relatively painless.Also because you are doing it often, the code is often fresh in your mind, so that makes resolving conflicts easier.|
|Ease of Releasing New Features||Can be quite painful. Merging a long-lived feature branch into main can be quite difficult. Depending on how you set up PRs, they could become a bottlekneck (ie if only 1 person can approve merging into main).||Easy, since you have been integrating them all along. To avoid the user encountering half-finished features, you can use the Keystone Pattern.|
|Refactoring||Discourages refactoring outside your immediate feature, because it may take a while to merge those changes back in, increasing the chance of a conflict. Even if your merge is successful, others also have long-lived branches as well, so there is more potential for conflicts when they merge their changes in.||Encourages refactoring, because you simply merge your refactorings back into the mainline immediately. Everyone is in the habit of pulling frequently, so the chances of conflicts are less.|