Step-by-Step: Programming Incrementally
ourmachinery.com
ourmachinery.com
Feature branches discourage refactoring because if the work that is off master is bigger merge conflicts can easily get much hairier
Small commits also forces one to have a good automated tests because one is not going to test everything manually after every very small commit. It ties in very nicely with the TDD cycle.
Not all work can be done this way so sometimes one needs a feature branch but most of the time it is not needed. In many cases feature switches are a good alternative, if needed.
Overall I like the idea of working incrementally and ensuring that every commit adds value. I'm just not sure about the specific git workflow presented here.
Also I merge master into my branch several times a day just as a matter of habit, because yeah it's usually better to discover conflicts ASAP instead of two weeks after they've happened. Keeping your branch short-lived also helps prevent conflicts in the first place.
The only time I'd maybe work without feature branches is on a solo project that hasn't been launched yet. But even then, probably for a quick prototype. As soon as there's a publicly deployed master, it's feature branches each and every time. Too much can go wrong ;-)
After you get the important things right, the will exist relevant optimizations on the workflow like those on the article. But they won't make or break your team, and will certainly depend on a lot of details so any universal preaching must be taken with care.
You can still do a code review using an incremental workflow. Do a pull request and wait someone for review and merge. The idea is to do them often on small incremental changes. It is much faster to review a small code change.
A valid answer might be "nowhere". Code review is a hot topic at the moment, but I'm pretty sure a lot of software I've found useful over the years was created with little or no formal review, and I think we should at least consider the possibility of leaving trustworthy developers to work without constant oversight.