Я думаю, что хитрость здесь заключается в использовании именованных веток.
Для каждого пользователя создайте отдельную именованную ветку. Когда они проталкивают / вытягивают между своими репозиториями и кем-либо еще, они получают все наборы изменений, совершенные другими людьми, но они будут обновляться только до наборов изменений своей собственной ветви и фиксировать в своей собственной ветви.
Если пользователь хочет включить изменения от другого пользователя, он объединяет этот набор изменений в свою собственную ветвь, возвращая все наборы изменений, которые ему на самом деле не нужны.
Например:
--> B1 ---> B2 ---> B3
/ \
A1 ---> A2 ---> A3 ---> A4 ---> A5 ---> A6
\ X
--> C1 ---> C2 ---> C3 ---> C4
Пользователь ветви A хочет, чтобы изменения B были добавлены в ревизиях B1 и B2, поэтому объединяет B2 в A3, переводя его в формат A4. Пользователь B не хочет изменений A, поэтому не объединяется в A3 или A4 и просто создает новый B3.
Пользователь C хочет все изменения от A4, поэтому объединяет его с C3, чтобы создать C4.
Однако пользователь А хочет, чтобы все, что делал С, кроме С1, поэтому А сливает С3 в А4, создавая А5, а затем использует откат для отмены изменений в С1, создавая А6. С тех пор всякий раз, когда ветвь C объединяется с ветвью A, она пропускает изменения в C1.
Пользователь C теперь должен быть осторожным. Если A6 или один из его потомков будет объединен обратно с C4, то и возврат C1 будет также объединен.
Надеюсь это поможет,
Изменить: Для получения дополнительной информации о ветвлении и слиянии Mercurial, вы могли бы сделать хуже, чем проверить запись в блоге Стива Лоша.
Из перечисленных опций метод клонирования является наиболее простым для начала, но все, что для этого нужно, - это одно неуместное извлечение, и вы перестаете быть в состоянии определить, какие части ветви являются какими, и все это сбивает с толку. Именованные ветки делают это намного проще, когда вы освоите их.