Git Workflow and Multi Environment - how to approach I'd like to be able to use git version control with Craft. Is this possible and if it is what is the best approach to ensure that all files/assets and the database are properly synced across local, staging and production servers?
Matt has a point, this is similar to What's the best practice for handling data migration and organization across development environments?, but that question focuses mainly on how to handle the database (definitely see those answers).

More generally speaking...

Multi-Environment Config

Set yourself up with Multi-Environment Configs in both craft/config/general.php and craft/config/db.php so that you don't have to be updating path settings every time you migrate data between environments.

Be sure to set some Environment-Specific Variables for the site URL and server path for each environment. That way you can use those variables in the control panel settings (the Site URL setting in the Setting → System → General and Assets paths in Settings → Assets → Your asset settings).

Here is a sample general.php file

return array(

    '*' =&gt; array(
        'omitScriptNameInUrls' =&gt; true,
        'usePathInfo'=&gt; true,
        'cpTrigger' =&gt; 'example-admin',
        'allowAutoUpdates' =&gt; false,
    ),

    'example.dev' =&gt; array(
        'devMode' =&gt; true,
        'useCompressedJs' =&gt; false,
        'allowAutoUpdates' =&gt; true,
        'environmentVariables' =&gt; array(
            'siteUrl' =&gt; 'http://example.dev/',
            'sitePath' =&gt; '/Applications/MAMP/htdocs/example/html/',
        ),
    ),

    'staging.example.com' =&gt; array(
        'environmentVariables' =&gt; array(
            'siteUrl' =&gt; 'http://staging.example.com/',
            'sitePath' =&gt; '/var/www/vhosts/staging.example.com/html/',
        ),
    ),

);


And an example db.php file

return array(

    '*' =&gt; array(
        'tablePrefix'   =&gt; 'craft',
    ),

    'example.dev' =&gt; array(
        'server'        =&gt; 'localhost',
        'user'          =&gt; 'root',
        'password'      =&gt; 'root',
        'database'      =&gt; 'example_dev',
    ),

    'staging.example.com' =&gt; array(
        'server'        =&gt; 'localhost',
        'user'          =&gt; 'example_staging',
        'password'      =&gt; '********************',
        'database'      =&gt; 'example_staging',
    ),

);


For more on Multi-Environment Configs see Multi-Environment Workflows on Straight Up Craft

Version control with Git

You can definitely use Git. I version everything except for user file uploads and /craft/storage and it works great.

My master .gitignore file in the root of my project looks like (specific to my setup, YMMV)

.DS_Store

# Node/Sass
node_modules
html/css/public/main.css.map

# Config
dandelion.yml
sftp-config.json
craft/config/db.php


Then in each directory I want to ignore the contents of (craft storage and user uploads) I put a .gitignore file with...

# Ignore everything
*

# But not this file
!.gitignore


And as Matt pointed out in his other comment on your question, do see the answers on the related question What's the best practice for upgrading a versioned Craft site?