Luckily enough, your browser cache works on the basis of the entire URL, including the query parameters. If even one character in the URL changes, it can no longer be matched to the cached resource and will therefore be considered a new resource.
It is possible to include a file and add a query parameter without any effect on the inclusion:
<link rel="stylesheet" href="styles/main.css?version=12345" />
There are two ways you can go about using this technique, (i) at build time add a timestamp to all of your resources that you require to be reloaded or (ii) maintain separate versioning per resource. The first approach is less error-prone, though might not be what you want for sites with a lot of traffic. The second approach requires more organization, as it must be remembered what resources underwent change, but also gives you more control over what resources are forcibly reloaded.
To the developers -- it is in your power to prevent your user from suffering from stale resources after a redeploy. Your user will love you for it. To the users -- if you have firsthand experience with the scenario described here, bang your developers over the head with this post and make them promise to address the problem. Enjoy!