How to maintain (mostly) parallel branches with only a few difference
dotfiles, git
Solution
For that particular case, where there is a lot of common files evolving in one branch, and only a few config files specific per environment... we do not store the config file in Git. At all.
We do store template of said config files, plus all the specific per-environment values, plus a script able to replace the variables in the template files by the correct value (detecting the current platform)
That way, we do not need to make a branch only for those files.
Another good way to manage those kind of files (with a platform-specifc content) is through a git attribute filter driver (see also Pro Git book).
A filter driver consists of a `clean` command and a `smudge` command, either of which can be left unspecified. Upon `checkout`, when the `smudge` command is specified, the command is fed the blob object from its standard input, and its standard output is used to update the worktree file. Similarly, the `clean` command is used to convert the contents of worktree file upon check-in.
That way, a script (managed with Git) referenced by the smudge can replace all the variables by platform-specific values, while the clean script will restore its content to an untouched config file.
The main idea remains: avoid creating branches only for that kind of parallel evolution.
Problem
Scenario: I'm trying to get my unix dot-files under git. I have to work between (at least) the cygwin environment and some standard linux distros (ubuntu and opensuse), and I have files/lines of code that are only specific to, say, cygwin. Since I don't want to checkout useless files or have to deal with lots of cases inside my dotfiles, I'm creating branches for each of my environments. But most of the edits I do are common to all environments, so almost every time I made a commit I need to propagate that change to all my branches. So basically I have several branches that are almost identical except for a few commits, and most commits I do need to be in all branches. The question: what is the recommended git workflow for this, if there is any? Or is there a better setup (without using multiple branches?) for my scenario? [I tried cherry-picking, but that involves quite a bit of work, and not to mention all the duplicate commits out here and the nightmare it is to keep my branches in sync.]