Acho que o truque aqui é usar ramificações nomeadas.
Para cada usuário, crie uma ramificação nomeada separada. Quando eles pressionam / puxam entre seus repositórios e qualquer um, eles recebem todas as mudanças que outras pessoas cometeram, mas eles só atualizarão para os conjuntos de alterações da sua própria ramificação e se comprometerão com sua própria ramificação.
Se um usuário quiser incorporar alterações de outro usuário, ele mesclará esse changeset em sua própria ramificação, fazendo backup de quaisquer changesets que eles realmente não desejarem.
Por exemplo:
--> B1 ---> B2 ---> B3
/ \
A1 ---> A2 ---> A3 ---> A4 ---> A5 ---> A6
\ X
--> C1 ---> C2 ---> C3 ---> C4
O usuário da filial A quer as mudanças B adicionadas nas revisões B1 & B2, então, mescla B2 em A3, configurando-o como A4. O usuário B não quer as mudanças de A, por isso não combina em A3 ou A4 e apenas cria um novo B3.
O usuário C quer todas as alterações do A4, então o mescla no C3 para criar o C4.
No entanto, o usuário A quer tudo que C fez além de C1, então A mescla C3 em A4, criando A5 e depois usa back-out para desfazer as alterações em C1, criando A6. A partir de então, sempre que a ramificação C for mesclada na ramificação A, não haverá alterações em C1.O usuário C agora precisa ser cuidadoso. Se A6, ou um de seus decendentes, for mesclado novamente em C4, então o backout de C1 também será mesclado.
Espero que isso ajude,
Edit: Para mais informações sobre a ramificação e fusão do Mercurial, você pode fazer pior do que verificar o entrada de blog .
Das opções listadas, a técnica clone é a mais fácil de começar, mas basta um pull inadequado e você deixa de saber quais partes do branch são quais e tudo fica confuso. As agências nomeadas facilitam muito a tarefa quando você pega o jeito delas.