There is another solution to the problem of creating workflows around code reviews: the pull request model, which has been made popular by GitHub.
In this model, pushing to repositories can be disallowed except for the repository owners. Other developers are allowed to fork the repository, though, and make changes in their fork. When they are done making changes, they can submit a pull request. The repository owners can then review the request and opt to pull the changes into the master repository.
This model has the advantage of being easy to understand, and many developers have experience in it from the many open source projects on GitHub.
Setting up a system capable of handling a pull request model locally will require something like GitHub or GitLab, which we will look at next.