You have a typical scenario and everything is under control. With git, all the more simplified.
First, I would suggest that you have a central git repository. Production and development servers can be installed as different branches of this central git repository. Now, since you always deploy production code using the production branch, you can call it the master branch of your central repo.
With this, you can go to the development server. First you create another branch called dev and base it on the master branch. It reflects the latest stable version of your product, and at any point in time, the dev branch should be the master + functions to be released. Using this structure, you need to establish a protocol for testing and deploying all your projects that are in the process.
Now let's say that function F is handled by employee X. Then X can create a new branch named branchFeatureF on its local one. This must be created from the origin/master branch, as this is a stable version. X has been working on its function for several days and feels ready to test. Ok, now click this on the dev branch. Its as good as clicking on master , but since you are still in the testing phase, you are working on the dev branch to test it before it goes to master .
All QA runs in the development branch. After fixing the errors, the F function is now ready for release, so the time to merge the branchFeatureF branch into master and deploy your code is amazing.
Now the master has an F function, so before you check another F function with another X 's employee on the dev branch, you pull the changes from the last master with the F function and check that. Of course, if conflicting elements conflict with each other, F and F can work simultaneously with X and X by clicking on the dev branch and simultaneously testing their respective functions.
In essence, you give enough freedom to all your colleagues to work on their functions, asking them to create their own function branches, but making sure that they always click on the dev branch and that the dev branch is always up to date with the last wizard. This ensures that time is not wasted by figuring out any merge conflicts when merging branches. You, as the repo developer, will take responsibility for merging the approved branches of functions approved by QA in mastery and deploying code in production. Do not bother with the master branch.