Tutorial - Merging changes

(This page in English: [:TutorialMerge])

Em ../BrazilianPortugueseTutorialExport, nós aprendemos como compartilhar uma mudança com outra pessoa. Agora iremos demonstrar como [:Merge:recombinar] mudanças a partir de um [:Pull:pull] de outro [:Repository:repositório] que realizou uma mudança incompatível.

Primeiramente, nós devemos criar algo para [:Merge:recombinar]. Vamos [:Clone:clonar] o repositório my-hello} novamente:

$ cd ..
$ hg clone my-hello my-hello-desc

Nós colocaremos em hello.c uma descrição em sua seção de comentários.

$ cd my-hello-desc
$ vi hello.c

Vamos trocar a segunda linha, que é:

 * hello.c

por esta linha:

 * hello.c - hello, world

Salvemos, fechemos o editor, e façamos o [:Commit:commit] de nossa alteração. Desta vez, nós economizamos um pouco de tempo através da opção -m para o comando commit , para evitar que o editor de texto seja chamado:

$ hg commit -m "Add description of hello.c"

Neste ponto, nós fizemos uma mudança em hello.c no repositório my-hello-new-output , e outra mudança em hello.c no repositório my-hello-desc (veja [:Branch]). Como nós recombinamos essas duas linhas divergentes de desenvolvimento? Haverá algum problema quando tentarmos fazer um [:Pull:pull] de um para o outro?

Isso funcionará sem problemas. Enquanto ainda estamos em my-hello-desc, vamos fazer um pull das mudanças de my-hello-new-output e ver o que acontece:

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

Isto se parece exatamente com a saída de pull em ../BrazilianPortugueseTutorialShareChange! Então tudo o que temos de fazer agora é um [:Update:update], certo?

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

Não. Algo aconteceu. O Mercurial está nos dizendo que devemos recombinar as mudanças que fizemos em cada repositório. Isso soa doloroso, certo? Mas na verdade é bem fácil. Vamos seguir as instruções da última linha da saída:

$ hg merge
merging hello.c
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

(Nota para usuários do Windows: se você receber um erro como hgmerge is not recognized as an internal or external command., o Mercurial não consegue encontrar um programa de merge. Veja MergeProgram para informações sobre como consertar isso.)

E é apenas isso! O Mercurial foi capaz de gerenciar o merge automaticamente para você, chamando implicitamente o script hgmerge (ou qualquer que seja seu programa de merge. Dependendo do seu ambiente, o hgmerge pode chamar um programa gráfico de resolução de recombinações. Se olharmos hello.c, veremos que contém ambas as mudanças de my-hello-new-output e de my-hello-desc.

(Nota: em versões anteriores ao Mercurial 0.9, hg update -m seria usado ao invés de hg merge).

Ao trabalhar com mudanças feitas por outras pessoas, esse é o tipo de recombinação que você fará na maior parte das vezes. Não esqueça de fazer o commit desta mudança para o repositório, como sugerido na última linha da saída de hg merge:

$ hg commit -m "Merged changes from my-hello-new-output"

Esse comando não deve mostrar nenhuma saída.

Para mostrar as mudanças de nossa recombinação, nós usamos o comando annotate para mostrar informações de [:ChangeSet:changeset] para cada linha do arquivo.

Note que a revisão 2 foi nossa modificação em my-hello-desc e a revisão 3 foi a mudança trazida de my-hello-new-output e recombinada no repositório my-hello-desc .

$ hg annotate hello.c
0: /*
2:  * hello.c - hello, world
0:  *
0:  * Placed in the public domain by Bryan O'Sullivan
0:  *
0:  * This program is not covered by patents in the United States or other
0:  * countries.
0:  */
0:
0: #include <stdio.h>
0:
0: int main(int argc, char **argv)
0: {
0:      printf("hello, world!\n");
3:      printf("sure am glad I'm using Mercurial!\n");
0:      return 0;
0: }

Vamos agora ver como lidar com situações onde foram feitas mudanças [:Conflict:conflitantes] em ../BrazilianPortugueseTutorialConflict.


CategoryTutorial