Os modelos de dados internos são fundamentalmente diferentes.
Fundamentalmente, no SVN, quando você olha para o histórico de uma ramificação, vê apenas o que aconteceu nessa ramificação. Portanto, quando você mesclar de ramificação B
em ramificação A
, o histórico da ramificação A
conterá uma confirmação grande contendo todas as alterações feitas explicitamente B
desde que foram ramificadas.
Nas primeiras versões do SVN, se você tiver que mesclar ramificação B
em ramificação A
mais uma vez, precisará especificar manualmente qual intervalo de revisão de ramificação B
deseja mesclar para evitar mesclar as mesmas revisões duas vezes. É claro que o desenvolvedor inteligente usaria uma mensagem de confirmação como 'Mesclado em B: 1234'.
O SVN 1.5 "corrigiu" isso. Mas não mudou como as fusões são aplicadas fundamentalmente. Apenas adicionou alguns metadados extras à ramificação A
, informando ao SVN que a revisão 1234 foi mesclada, permitindo que o SVN escolha automaticamente o intervalo de revisão correto.
Mas essa solução é basicamente uma solução alternativa para um modelo de dados que fundamentalmente não suporta o rastreamento do que foi mesclado.
Mesclar duas ramificações é um exemplo relativamente simples. Mas imaginar esse cenário mais complexo
- Crie uma ramificação
A
de trunk
e faça algumas confirmações aqui
- Criar ramo
B
de A
e fazer alguns commits aqui
- Faça algumas confirmações
trunk
eA
- Mesclar
B
emtrunk
- Mesclar
A
emB
- Mesclar
A
emtrunk
- Mesclar
B
em trunk
(isso realmente não deve fazer nada)
Manipular isso corretamente usando o modelo de metadados se torna extremamente complexo (não sei se o SVN realmente manipula esse cenário corretamente e não me sinto inclinado a testá-lo).
Lidar com esse cenário no git é extremamente simples.
No git, toda vez que você confirma, o objeto interno que representa essa confirmação contém uma referência ao cabeçalho anterior. Quando você mescla um ramo, o commit contém referências ao cabeçalho anterior de todos os ramos que estão sendo mesclados (você pode mesclar mais de um ramo por vez no git)
Portanto, quando você examina o histórico de um único commit no git, pode ver todo o histórico, quando foi ramificado, quando foi mesclado e o histórico dos dois ramos entre a ramificação e a mesclagem.
Portanto, ao mesclar em uma ramificação parcialmente mesclada, é extremamente simples determinar o que já foi mesclado e o que não foi.
Não tenho experiência com Mercurial, mas suspeito que seu funcionamento interno seja semelhante ao git.
Então, fundamentalmente, para o SVN, era um objetivo do projeto tornar as ramificações baratas. Mas no git, era um objetivo do projeto tornar a fusão barata.
Por fim, da última vez que usei o SVN, ele não foi capaz de lidar com mesclagens, onde um arquivo foi renomeado em uma ramificação e modificado em outra.