IMO there are no amazing solutions right now with the way Cloud requires a backing git repo and the fact that they commit auto upgrades directly to it.
However, the way we do it is that repo is the same, so when you work locally you have 2 git remotes, our Azure DevOps repo where we do PRs, etc, and the Umbraco Cloud repo that we can pull autoupgrades from and push to in order to deploy.
So there is no need to copy files over, but there is a need to fetch multiple remotes and merge branches together before pushing them to those remotes to ensure everything is aligned and up to date.
Cloud has a CI/CD implementation where you can automate the deployments from your own repo which could make parts of this easier as well.