There are a number of approaches commonly used by all VCS, regardless of the type which are as follows:
Branching: This, in VCS, is the duplication of the repository so that changes can happen in parallel on both of the branches (imagine the branches on a tree). Branches are useful for experimenting with the code without impacting the main "trunk"/master branch. Once the changes are complete, and if they are successful, they can be merged back into the master branch.
Branching happens to be a divisive topic, with some CI/CD experts avoiding branches altogether, and others recommending to create a branch for every single feature under development (an approach called feature branching). To gain some insight into the discussion, ...