I’ve tried everything from raw git to gnu stow to manual symlinking and everything in between. They all work when the full context of the workflow is fresh in my brain. But after a few weeks I always mess up, even though I’ve documented the process in my dotfiles repo.
I eventually settled on chezmoi, and it just works. I set it up a year ago and haven’t needed anything beyond chezmoi -v diff and chezmoi -v apply.