Let's assume you have four environments to take care of, which are as follows:
- Development
- Testing
- Stage
- Production
In the Git branch-based method, you will have one environment per branch. You will always make changes to Development first, and then promote those changes to Testing (merge or cherry-pick, and tag commits in Git), Stage, and Production. In this approach, you will hold one single inventory file, one set of variable files, and, finally, a bunch of folders dedicated to roles and playbooks per branch.