4820
Comment: renamed Resolve to ResolveConflict
|
← Revision 8 as of 2010-05-02 23:06:50 ⇥
4551
synchronized with English page and program translation
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from WagnerBruna/BrazilianPortugueseTutorialConflict | |
Line 4: | Line 3: |
== Tutorial - merging conflicting changes == | == Tutorial - Mesclando mudanças conflitantes == |
Line 6: | Line 5: |
''(This page in English: [:TutorialConflict])'' | ''(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]])'' |
Line 8: | Line 7: |
Nós aprendemos como lidar com [:Merge:merges] (recombinações) simples em ../BrazilianPortugueseTutorialMerge. | Nós aprendemos como lidar com [[Merge|mesclagens]] simples em BrazilianPortugueseTutorialMerge. |
Line 10: | Line 9: |
O Mercurial também gerencia casos de merge mais complexos. 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 [:Conflict:conflitos]; determinar o que fazer em um conflito é chamado [:ResolveConflict:resolvê-lo] . | 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 [[Conflict|conflitos]]; determinar o que fazer em um conflito é chamado [[ResolveConflict|resolvê-lo]] . |
Line 12: | Line 11: |
Vamos primeiro criar uma situação de conflito artificial. Como fizemos antes, começaremos criando um [:Clone:clone] de {{{my-hello}}}: | Vamos primeiro criar uma situação de conflito artificial. Como fizemos antes, começaremos criando um [[Clone|clone]] de `my-hello`: |
Line 17: | Line 16: |
updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
Line 19: | Line 20: |
Agora vamos colocar uma nova linha de saída em {{{hello.c}}}: | Agora vamos colocar uma nova linha de saída em `hello.c`: |
Line 37: | Line 38: |
E nós fazemos o [:Commit:commit] da mudança: | E nós [[Commit|consolidamos]] a mudança: |
Line 43: | Line 44: |
Lembre-se que, em ../BrazilianPortugueseTutorialFirstChange, nós criamos um [:ChangeSet:changeset] em {{{my-hello-new-output}}} que ''também'' adicionou uma segunda linha de saída. O que acontece quando tentamos fazer um [:Pull:pull] daquela mudança para cá? | Lembre-se que em BrazilianPortugueseTutorialFirstChange nós criamos uma [[ChangeSet|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|pull]] daquela mudança para cá? |
Line 56: | Line 57: |
Até aqui tudo bem. Vamos tentar um [:Update:update]. | Até aqui tudo bem. Vamos tentar uma [[Update|atualização]]. |
Line 60: | Line 61: |
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes | abort: crosses branches (use 'hg merge' or 'hg update -C') |
Line 63: | Line 64: |
(veja também [:Branch]) Como em ../BrazilianPortugueseTutorialMerge, nós devemos executar {{{hg merge}}}. Como antes, o [:MergeProgram:utilitário de merge] será iniciado automaticamente. Ele tipicamente não será capaz de fazer a recombinação automaticamente, porque a mesma linha do mesmo arquivo fonte foi modificada de modo diferente em cada changeset (o que acabamos de criar com o [:Commit:commit], e o que acabamos de trazer com o [:Pull:pull]). |
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|commit]], e a que acabamos de trazer com o [[Pull|pull]]). |
Line 71: | Line 70: |
Neste momento, o que acontece depende de quais programas estão instalados em seu computador. Se somos precavidos (ou se temos sorte), e temos instalado um programa gráfico de merge, nós seremos capazes de ver quais conflitos existem entre os dois changesets, e decidir como resolvê-los. | 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: |
Line 73: | Line 72: |
Abaixo estão os conflitos do exemplo exibidos no editor vim em um sistema Linux. | |
Line 89: | Line 87: |
<<<<<<< /home/motoko/project/my-hello-not-cvs/hello.c.orig.197516148 | <<<<<<< local |
Line 91: | Line 89: |
||||||| /tmp/hello.c~base.aYR8Pf | |
Line 94: | Line 91: |
>>>>>>> /tmp/hello.c~other.F7OpXy | >>>>>>> other |
Line 99: | Line 96: |
O Mercurial usa um merge de 3 vias por arquivo. Isso quer dizer que há 3 arquivos de entrada para o processo de recombinação, que são: * o arquivo local (do repositório atual) * o outro arquivo (do repositório sendo recombinado) * o arquivo base (a versão mais recente do arquivo antes da divergência) |
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: |
Line 104: | Line 98: |
(para mais informações a respeito do merge de 3 vias, veja [http://revctrl.org/ThreeWayMerge ThreeWayMerge] no wiki [http://revctrl.org/ Revctrl] ). | {{{ $ hg status M hello.c ? hello.c.orig }}} |
Line 106: | Line 104: |
Caso não tenhamos instalado um programa gráfico de merge, será executado um editor de texto, que irá abrir os arquivos conflitantes um a um. Fazer isso à mão é '''altamente''' entediante e falível. É melhor sair do editor e usar o comando {{{hg rollback}}} para reverter os efeitos do merge, instalar um programa de merge, e tentar novamente. | 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. |
Line 108: | Line 107: |
(~-Nota: em versões anteriores ao Mercurial 0.9, `hg update -m` deve ser usado ao invés de `hg merge` e `hg undo` deve ser usado ao invés de `hg rollback`-~). | Em seguida nós informamos ao Mercurial que o conflito foi resolvido, usando o comando {{{hg resolve}}}: |
Line 110: | Line 109: |
Como anteriormente, esteja certo de fazer o commit dessa alteração para o repositório, uma vez que a recombinação esteja concluída: | {{{ $ 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: |
Line 116: | Line 121: |
Este comando não deve gerar uma saída. | 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]]. |
Line 118: | Line 126: |
Agora continuaremos e concluiremos em ../BrazilianPortugueseTutorialConclusion. | Agora continuaremos e concluiremos em [[BrazilianPortugueseTutorialConclusion]]. |
Line 120: | Line 128: |
##See also: ImergeExtension |
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.