Because a DVCS has to be distributed. If Alice writes patch p, Bob reverts it, and Charlie unreverts it, you might (without contexts) have three people with different states of the repo:
Alice: {p}
Bob: {p, !p} (or do you write this as {}?)
Charlie: {p, !p, p} = {p, !p}? So I guess this has to be {p}
Suppose these people are pushing and merge if in patches to the master. Then it has no way to distinguish these scenarios:
A:
1. Alice pushes; master applies p
2. Bob pulls, reverts p, pushes. Master reverts p
3. Charlie pulls, reapplies, pushes. Master does ??
B
1. Alice pushes; master applies p
2. Charlie pulls
3. Bob pulls and reverts; master reverts p
4. Charlie pushes
In both cases, the state of Charlie’s repo is the same: {p}, but in case A, p should be applied and in case B, it should not. Therefore there needs to be some additional context (or no applying a patch and it’s inverse).
In other words, this problem is basically having a distributed set with addition, deletion, and readdition of elements, which you can’t have in a nice way. A distributed set that you can only add to, on the other hand, is a lot more easy.