Differences between revisions 6 and 7
Revision 6 as of 2008-08-08 10:14:13
Size: 4820
Comment: renamed Resolve to ResolveConflict
Revision 7 as of 2009-05-19 19:30:55
Size: 4837
Editor: localhost
Comment: converted to 1.6 markup
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:
''(This page in English: [:TutorialConflict])'' ''(This page in English: [[TutorialConflict]])''
Line 8: Line 8:
Nós aprendemos como lidar com [:Merge:merges] (recombinações) simples em ../BrazilianPortugueseTutorialMerge. Nós aprendemos como lidar com [[Merge|merges]] (recombinações) simples em ../BrazilianPortugueseTutorialMerge.
Line 10: Line 10:
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 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]] .
Line 12: Line 12:
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 37: Line 37:
E nós fazemos o [:Commit:commit] da mudança: E nós fazemos o [[Commit|commit]] da mudança:
Line 43: Line 43:
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 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á?
Line 56: Line 56:
Até aqui tudo bem. Vamos tentar um [:Update:update]. Até aqui tudo bem. Vamos tentar um [[Update|update]].
Line 63: Line 63:
(veja também [:Branch]) (veja também [[Branch]])
Line 65: Line 65:
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}}}. 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]]).
Line 104: Line 104:
(para mais informações a respeito do merge de 3 vias, veja [http://revctrl.org/ThreeWayMerge ThreeWayMerge] no wiki [http://revctrl.org/ Revctrl] ). (para mais informações a respeito do merge de 3 vias, veja [[http://revctrl.org/ThreeWayMerge|ThreeWayMerge]] no wiki [[http://revctrl.org/|Revctrl]] ).

Tutorial - merging conflicting changes

(This page in English: TutorialConflict)

Nós aprendemos como lidar com merges (recombinações) simples em ../BrazilianPortugueseTutorialMerge.

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 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

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 fazemos o commit da mudança:

$ hg commit -m "Give thanks for dodging bullet"

Lembre-se que, em ../BrazilianPortugueseTutorialFirstChange, nós criamos um changeset em my-hello-new-output que também adicionou uma segunda linha de saída. O que acontece quando tentamos 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 um update.

$ hg update
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

(veja também Branch)

Como em ../BrazilianPortugueseTutorialMerge, nós devemos executar hg merge. Como antes, o 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, e o que acabamos de trazer com o pull).

$ hg merge

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.

Abaixo estão os conflitos do exemplo exibidos no editor vim em um sistema Linux.

/*
 * 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");
<<<<<<< /home/motoko/project/my-hello-not-cvs/hello.c.orig.197516148
        printf("sure am glad I'm not using CVS!\n");
||||||| /tmp/hello.c~base.aYR8Pf
=======
        printf("sure am glad I'm using Mercurial!\n");
>>>>>>> /tmp/hello.c~other.F7OpXy
        return 0;
}

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)

(para mais informações a respeito do merge de 3 vias, veja ThreeWayMerge no wiki Revctrl ).

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.

(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).

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 commit -m "Merged changes from my-hello-new-output"

Este comando não deve gerar uma saída.

Agora continuaremos e concluiremos em ../BrazilianPortugueseTutorialConclusion.


CategoryBrazilianPortuguese

BrazilianPortugueseTutorialConflict (last edited 2010-05-02 23:06:50 by WagnerBruna)