It used to be that a large part of releasing changes to a professional website required a long list of steps to ensure secure propagation of changes through the development cycle into production.
Each part needed to be kept in sync with the next, or the whole flow would break. The test server would have to be in sync with the staging server, which needed to be in sync with user acceptance testing servers and ultimately the production servers. Each server having the same versions, patches and settings installed to ensure they were close copies of each other.
Next, you would make sure the databases at each stop were in sync enough to cover the minimum data requirements needed for that stage. In many cases, you would need to do all this again for your content management server and databases to ensure production content was not affected during testing. The lynchpin is that all these pieces needed to be set up the “same” and should be copies of each other without the redundancies, security and performance enhancements required for production. Due to cost, time, and implementation difficulty at the lower stages, there is always a fine line between "same" and exact. In the end, you would usually have a close enough match yet inevitably deal with bugs, due to the infrastructure, as you progress.
Finally, the need to sync everything manually required frequent backups and propagation, which typically meant no content editing or code changes during these often lengthy processes.