When we develop software task by task, feature by feature, some (actually, most) features are too big to be represented by a single commit. This is because we need code versions history to understand those changes in the future, even if the author is not around, and wrapping my head around +5000/-3000 diff is very complex task by itself. On the other hand, in most CD systems pushing commit to master branch triggers a new version deploy. So we are doing small atomic "always green" changes in a separate branch, and then merge them all at once into master branch.