It sounds like you need branches to separate the development of new modules (demo) from the bugfixes on the live environment. You can then have the version control merge the changes. Depending on how much code was changed in both branches, it will be able to merge some of the changes automatically and some changes will 'conflict', meaning that the automatic merge cannot determine what the final code should be. You'll have to resolve those manually, either by a developer who is experienced with that part of the application or by all developers who contributed to the changes resulting in the conflicts. Then, even if there are no conflicts, test the final codebase on a separate environment (ideally a copy of the live environment, but the demo environment might work as well). Automatic merge isn't always flawless and you might have introduced additional dependencies in one branch, such as a parameter not being null, which aren't satisfied in the other branch.
If you have committed the changes in each branch, you won't lose code; if code disappear during the merge, you can always checkout a previous commit, copy the 'lost' code to somewhere outside the project, checkout the latest commit, and copy the code back in the project.