I also don't quite understand how darcs handle the global namespace problem of distributed development. Suppose I have three branches from the same source: A, B, and C. Then suppose I make patches pA and pB, then merge B into A and into C. (So now I have A+pA+pB, B+pB, C+pB.) If I then merge A into C, how does it know that pB has already been applied (that is, that A's pB is the same as C's pB) without a global identifier for B or pB?
I believe the answer to that is that patches are named by their md5 (or some such hash) but I'm not sure.