TL;DR you are doing the right thing. Anvil has a simple dev/production model built in, and supports arbitrarily complicated ones via the Git interface.
Anvil already supports the idea of a “Published” version (choose it from the Version History dialog). If you have a published version of your app, there will be a separate Uplink key for the dev and published versions of your app. They will, however, access the same data tables
A second approach is to have two entirely separate apps! You’re on exactly the right track - clone one locally, then add the others as remotes, and force-push as necessary. Each app has its own name (eg “My App Staging” “My App Production”), its own uplink key(s), and its own set of data tables. (Apps can also share data tables.)
You are very much barking up the correct tree - this is an architecture we have used ourselves, and it works quite well!