&quot;How changes get live&quot; is one of the first, most important things I tackle with a new project. This means I consider my &quot;live system&quot; is effectively part of my development environment.<p>Right now, I have a &quot;live system&quot; repository, and then development actually occurs in a second repository which is a submodule of the first.<p>This has a lot of advantages:<p>• Configuration and data is out-of-tree, so it is easy for me to have a read-only view of the live database, and read-write to a local (temporary) database<p>• I can select a branch using a signed cookie or a URL which makes it very easy to demonstrate features on the live system<p>• I can try out tags on 1% of traffic, or 5% of traffic, testing some features with my live users<p>• I can use git bisect on the live system to find regressions<p>There are a few disadvantages, but most of them are psychological: Testing on live sounds scary; how to make database migrations is a lot more work; etc.