Tutorial - Mesclando mudanças conflitantes
(This page in English: TutorialConflict). Esta página é a parte 8 de 9 da série BrazilianPortugueseTutorial. A parte anterior é BrazilianPortugueseTutorialMerge, a próxima parte é BrazilianPortugueseTutorialConclusion)
Nós aprendemos como lidar com mesclagens simples em BrazilianPortugueseTutorialMerge.
O Mercurial também gerencia mesclagens mais complexas. Não é tão incomum que duas pessoas editem exatamente as mesmas linhas de um arquivo, e precisem em seguida descobrir o que fazer. Esses casos são chamados conflitos; determinar o que fazer em um conflito é chamado resolvê-lo .
Vamos primeiro criar uma situação de conflito artificial. Como fizemos antes, começaremos criando um clone de my-hello:
$ cd .. $ hg clone my-hello my-hello-not-cvs updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Agora vamos colocar uma nova linha de saída em hello.c:
$ cd my-hello-not-cvs $ vi hello.c
Nós alteramos main da seguinte forma:
int main(int argc, char **argv)
{
printf("hello, world!\n");
printf("sure am glad I'm not using CVS!\n");
return 0;
}
E nós consolidamos a mudança:
$ hg commit -m "Give thanks for dodging bullet"
Lembre-se que em BrazilianPortugueseTutorialFirstChange nós criamos uma revisão em my-hello-new-output que também adicionou uma segunda linha de saída. O que acontecerá quando tentarmos fazer um pull daquela mudança para cá?
$ hg pull ../my-hello-new-output pulling from ../my-hello-new-output searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge)
Até aqui tudo bem. Vamos tentar uma atualização.
$ hg update abort: crosses branches (use 'hg merge' or 'hg update -C')
Como em BrazilianPortugueseTutorialMerge, nós devemos executar hg merge. O comando não será capaz de mesclar automaticamente, porque a mesma linha do mesmo arquivo fonte foi modificada de modo diferente em cada revisão (a que acabamos de criar com o commit, e a que acabamos de trazer com o pull).
$ hg merge
Neste momento, o que acontece depende de como o Mercurial foi configurado (veja MergeToolConfiguration). Por padrão, o Mercurial insere uma série de marcadores nos arquivos a serem mesclados em sua cópia de trabalho:
/* * hello.c * * Placed in the public domain by Bryan O'Sullivan * * This program is not covered by patents in the United States or other * countries. */ #include <stdio.h> int main(int argc, char **argv) { printf("hello, world!\n"); <<<<<<< local printf("sure am glad I'm not using CVS!\n"); ======= printf("sure am glad I'm using Mercurial!\n"); >>>>>>> other return 0; }
Como antes, você pode encontrar esses arquivos usando o comando 'hg status', notando que o Mercurial gravou uma cópia do arquivo original antes de inserir os marcadores de conflito:
$ hg status M hello.c ? hello.c.orig
Para resolver o conflito, nós abrimos 'hello.c' em um editor, apagamos os marcadores de conflito e mantemos a linha "sure am glad I'm using Mercurial!\n" line, removendo a linha sobre o CVS. Nós podemos então salvar o arquivo e fechar o editor.
Em seguida nós informamos ao Mercurial que o conflito foi resolvido, usando o comando hg resolve:
$ hg resolve -m hello.c
O Mercurial aceita a resolução sem gerar uma saída na tela.
Cokmo antes, certifique-se de consolidar essa mudança no repositório assim que a mesclagem estiver completa:
$ hg commit -m "Merged changes from my-hello-new-output"
O que nós vimos aqui foi o comportamento padrão do Mercurial. Você pode, se desejar, configurar o Mercurial para abrir o editor automaticamente. O Mercurial pode também ser configurado para invocar utilitários externos de mesclagem de 3 vias. Informação sobre isso pode ser encontrada em MergeToolConfiguration.
Agora continuaremos e concluiremos em BrazilianPortugueseTutorialConclusion.