For configuration managed by the developer I strongly recommend update scripts. Create a module Projectname_Config
with a setup resource and put your configuration scripts in app/code/local/Projectname/Config/data
It is important to use data update scripts because they are triggered after the sql update scripts. So when you update a system with an outdated database, first all extensions are installed (tables created etc.) and then configured.
The naming scheme for data update scripts is
data-install-x.x.x.php
to install version x.x.x
data-upgrade-x.x.x-y.y.y.php
to upgrade version x.x.x to version y.y.y
Example update script
/** @var Mage_Catalog_Model_Resource_Setup $installer */
$installer = $this;
$germanStoreId = Mage::app()->getStore('de')->getId();
$installer->setConfigData('general/store_information/name', 'My cool shop');
$installer->setConfigData('general/store_information/name', 'Mein knorke Laden', 'stores', $germanStoreId);
Complex data
Theroretically you can create any data in these scripts, but I usually only use them for simple models like CMS pages and blocks, sometimes for categories.
I don't think, products should be created on a staging system and then moved over. If you must do so, I would try ImportExport
to export the new products on staging to CSV and import them on production.
But the usual approach is to manage your products outside of Magento anyway, then you can import them into each instance.
For other complex products like shopping cart rules it is so complicated and error-prone that I rather take the time to create them manually on each system.
You will find a few tools that promise migrating any data from one store to another but I don't think there is a silver bullet to this problem.