Use the modularity of your language to organize a software product line, rather than the version control system. Quite simply, the merge process is not something you want to be a regular part of building your products. Rather, the design of your product should already take this into account.
By accounting for the software product family at the design level, this will also make it much clearer to developers what the variation points are: the variation points will be obvious in the design, rather than implied as source code differences.
This will ease developer testing as well: Any modifications you make should be tested on both products. You won't want to be making the same change twice, or constantly merging and undoing changes as they occur.
Review the literature on software product lines to see the best practices for your language. Using these techniques, you can create a third "product" that is streamlined for testing. For example, using dependency injection can be your mechanism for both testing and for having variants of the same program.