This is a slightly large Architectural question. Within Salesforce you have many components. Those components are either declarative or imperative (like APEX and VF). As implementations get larger the need for source control management and potentially CI may be required as opposed to using Salesforce change sets.
So once you've reached this stage there are two ways to go about this.
use a developer sandbox for Declarative components development and sync with SCM, use an external IDE for Imperative components (i.e. APEX/VF,etc.) and sync with SCM. In here what does a branch release look like if your primaries are coming from two different sources?
You manage all components in an external IDE/editor (like Eclipse). But that means update to things like validation rules and workflows are done by editors and not within a sandbox potentially. But it has an advantage of having a single source of development into an SCM, and from an SCM into a sandbox.
My question is what have people generally fond to be the best approach for developing declarative and imperative components in salesforce, but targeting a single SCM. And what makes sense to be able to automate deployment from that SCM.