We have a master branch and many short living feature branches that get merged into master after the customers have accepted the changes.
In addition to that we have long living environment branches for the user acceptance system and the production system, named stage and prod, that are originally branched from master.
Our workflow looks like that:
- develop feature on feature branch
 - merge feature branch into 
stage - wait for customer acceptance
 - on acceptance merge to 
master mastergets merged intoprodthe next day
Customer acceptance can take short to very long, so there are several "features" living on stage that are either waiting for acceptance or abandoned. Because if the customer does not accept the change we do not merge the feature to master but sadly it lives on on stage like a zombie :)
Now the question(s):
How would we reset the branch stage to current master without losing the ability to merge the feature branches that are still waiting for acceptance to stage again? The goal here is to get rid of the abandoned "features". 
Is this possible without altering history and force-push?