Branching is easy. Merging is hard.
Branching is like two people going off in their own directions and not collaborating. What’s hard about that?
If you think about it, in nature divergence is easier than convergence. Literal trees (like oak and maple) branch but they don’t merge. When a family enters Disney’s Magic Kingdom theme park, they can all run off and do their own thing, or they can spend half an hour bickering over which section of the park to see first.
People using a CVCS tend to avoid branching because most of those centralized tools aren’t very good at merging. When they switch to a DVCS, they tend to bring that attitude with them, even though it’s not really necessary anymore. Decentralized tools are much better at merging.
Why are they better?
They’re built on a DAG (see the section called “Directed Acyclic Graphs (DAGs)” in Chapter 4, More Basics). Merge algorithms need good information about history and common ancestors. A DAG is a better way to represent that kind of information than the techniques used by most centralized tools.
They keep the developer’s intended changes distinct from the merge she had to do in order to get those changes committed. This approach is less error-prone at commit time, since the developer’s changes are already cleanly tucked away in an immutable changeset. The only thing that needs to be done is the merge itself, so it gets all the attention it needs. Later, when tracking down a problem, it is easy to figure out if the problem happened during the intended changes or the merge, since those two things are distinct in the history.
They deal with whole-tree branches, not directory branches. The path names in the tree are independent of the branch. This improves interoperability with other tooling.