Houve várias perguntas recentemente sobre pular mudanças ao manter ramos de lançamento no Mercurial. Por exemplo:
- Mercurial: mudanças específicas de ramo continuam voltando após a fusão fictícia
- Por que os backouts do Mercurial em um branch afetam outros branches?
Desde que foi introduzido no 2.0, tenho pensado em como usá-lo graft
para evitar esse problema. Dada uma árvore de revisão como esta:
A---B---C---D---E---F---G---H---I---J
Suponha que precisemos criar um branch de lançamento que ignore a mudança do Mal E
.
hg update -r D
hg graft "F::J"
dando-nos:
A---B---C---D---E---F---G---H---I---J
\
--F'--G'--H'--I'--J'
- Q1: O que aconteceu aqui? Eu posso entender que
transplant
isso teria gerado patchesF::J
e depois aplicadoD
, masgraft
dizem que usa mesclagem de 3 vias em vez de patches. Então, como isso funciona? Por que está melhor?
Digamos que agora eu conserte E
e mescle isso em meu branch de lançamento.
--E2-----------------
/ \
A---B---C---D---E---F---G---H---I---J---M1
\ \
--F'--G'--H'--I'--J'---------M2--
M1 é uma fusão direta; nada de especial aí. M2 está mesclando ramos que têm "o mesmo" (ou pelo menos equivalente) alterações ativadas.
- Q2: É este o merge apenas um normal, 3-way merge usando
D
,J'
eM1
? - P3: O mercurial armazenou / usou informações extras sobre a operação de enxerto para ajudá-lo na fusão?
E finalmente...
- Q4: Quais são os problemas potenciais com um fluxo como este?