## page was renamed from PortugueseUnderstandingMercurial ## page was renamed from Entendendo o Mercurial ## page was renamed from Marcio Andrey Oliveira #language pt #pragma section-numbers 2 = Entendendo o Mercurial = O modelo de desenvolvimento descentralizado do Mercurial pode confundir os novos usuários. Esta página tenta ilustrar alguns conceitos básicos. Veja o [[BrazilianPortugueseTutorial|Tutorial]] para instruções passo a passo. ''(This page in English: UnderstandingMercurial)'' <> == O que é um Repositório == Os [[Repository|repositórios]] do Mercurial contêm um [[WorkingDirectory|diretório de trabalho]] acoplado a um armazenamento de histórico: {{{#!dot digraph G { rankdir = LR; compound=true; background="#999999"; subgraph cluster_0 { label="diretório de trabalho"; style=filled; color=lightgrey; node [style=filled,color=white]; edge [style=invis]; "main.c" -> "main.h" -> ".hgignore" -> ".hgtags"; } subgraph cluster_1 { label = "armazenamento de histórico"; labelloc = b; style=filled; color="#eeeeee"; node [shape=box, style=filled, color=lightgray]; "rev 0" -> "rev 1" -> "rev 2" -> "rev 3" [dir=back, label="pai"]; } "main.c" -> "rev 2" [ltail=cluster_0, label="pai", labeldistance=5, minlen=2]; } }}} O armazenamento contém o histórico '''completo''' do projeto. Ao contrário dos SCMs tradicionais, onde há apenas uma cópia central deste histórico, todo diretório de trabalho é acompanhado de uma cópia privada do histórico. Isto permite que o desenvolvimento ocorra em paralelo. O diretório de trabalho contém uma cópia dos arquivos do projeto em um determinado ponto do tempo, pronta para edição (por exemplo, revisão 2). O arquivo de [[Tag|etiquetas]] e o arquivo de padrões de arquivos ignorados ([[.hgignore]]) também fazem parte do diretório de trabalho, e também são armazenados no repositório. == Consolidando Modificações == Quando você consolida suas modificações (usando o comando [[Cmd:commit|commit]]), o estado do diretório de trabalho em relação aos seus [[Parent|pais]] é gravado como um novo [[ChangeSet|changeset]] (também chamado de uma nova [[Revision|revisão]]): {{{#!dot digraph G { compound=true; rankdir = LR background="#999999"; subgraph cluster_0 { label="diretório de trabalho"; style=filled; color=lightgrey; node [style=filled,color=white]; edge [style=invis]; "main.c"-> "main.h" -> ".hgignore" -> ".hgtags" } subgraph cluster_1 { label = "armazenamento de histórico"; labelloc = b; style=filled; color="#eeeeee"; node [shape=box,style=filled,color=lightgray]; "rev 0" -> "rev 1" -> "rev 2" -> "rev 3" [dir=back]; "rev 2" -> "rev 4" [dir=back]; } "rev 2" -> ".hgtags" [dir=back, style=dotted, lhead=cluster_0, label="pai antes do commit"] "rev 4" -> ".hgtags" [dir=back, color=red, lhead=cluster_0, headlabel="commit", labelfontcolor=red ] } }}} Note que a revisão 4 é um '''ramo''' (branch) da revisão 2, que era a revisão no diretório de trabalho. Agora, a revisão 4 é o '''pai''' do diretório de trabalho. == Revisões, Changesets, Cabeças e Tip == O Mercurial reúne mudanças relacionadas de vários arquivos em conjuntos atômicos de modificações ([[ChangeSet|changesets]]), que são as revisões para o projeto como um todo. Cada uma destas modificações recebe um [[RevisionNumber|número de revisão]] seqüencial. Como o Mercurial permite desenvolvimento distribuído em paralelo, estes números de revisão podem ser diferentes de usuário para usuário. Assim, o Mercurial também atribui a cada revisão um [[ChangeSetID|identificador de changeset]] global. Identificadores de changeset são números hexadecimais de 40 dígitos, mas podem também ser abreviados para qualquer prefixo que não seja ambíguo, como "e38487". {{{#!dot digraph { rankdir = LR node [shape=record] rev0 [label="{{ p1 | p2} | rev 0:838e}"]; rev1 [label="{{ p1 | p2} | rev 1:34ef}"]; rev2 [label="{{ p1 | p2} | rev 2:4563}"]; rev3 [label="{{ p1 | p2} | rev 3:fe56}"]; rev4 [label="{{ p1 | p2} | rev 4:ac98}"]; rev5 [label="{{ p1 | p2} | rev 5:0345}"]; rev6 [label="{{ p1 | p2} | rev 6:19e3 (tip)}"]; workingdir [label="{{ p1 | p2} | diretório de trabalho}"]; rev0 -> rev1:p1 [dir=back] rev1 -> rev2:p1 [dir=back] rev1 -> rev3:p1 [dir=back] rev2 -> rev4:p1 [dir=back] rev3 -> rev4:p2 [dir=back] rev4 -> rev5:p1 [dir=back] rev4 -> rev6:p1 [dir=back] rev6 -> workingdir:p1 [dir=back] label="repositório de exemplo" } }}} Ramos ([[Branch|branches]]) e mesclagens ([[Merge|merges]]) no histórico das revisões podem ocorrer em qualquer ponto. Cada ramo não mesclado cria uma nova cabeça ([[Head|head]]) do histórico de revisões. Aqui, as revisões 5 e 6 são cabeças. O Mercurial considera a revisão 6 como sendo a [[Tip|tip]] (extremidade) do repositório, a cabeça com o maior número de revisão. A revisão 4 é um [[MergeChangeset|changeset de mesclagem]], pois possui ''dois'' changesets pais (revisões 2 e 3). == Clonando, Fazendo Mudanças, Mesclando, Trazendo Revisões e Atualizando == Vamos começar com a usuária Alice, que tem um repositório assim: {{{#!dot digraph { label="repositório de Alice" rankdir = LR node [shape=box] a -> b -> c -> d -> "diretório de trabalho" [dir=back] } }}} O Bob [[Clone|clona]] este repositório e obtém uma cópia local, completa e independente do histórico desse repositório, e uma cópia de trabalho limpa da revisão mais recente, ''d'': {{{#!dot digraph { label="repositório de Bob" rankdir = LR node [shape=box] a -> b -> c -> d -> "diretório de trabalho" [dir=back] } }}} Bob pode então trabalhar de forma independente. Ele então [[Commit|consolida]] algumas modificações, ''e'' e ''f'': {{{#!dot digraph { label="repositório de Bob" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f -> "diretório de trabalho" [dir=back] e [color=blue] f [color=blue] } }}} A Alice faz sua própria mudança ''g'' em paralelo, o que faz com que seu repositório fique diferente do de Bob, criando assim um [[Branch|ramo]]: {{{#!dot digraph { label="repositório de Alice" rankdir = LR node [shape=box] a -> b -> c -> d -> g -> "diretório de trabalho" [dir=back] g [color=red] } }}} O Bob então [[Pull|traz]] as modificações da Alice para sincronizar seu repositório com o dela. Isto copia todas as modificações da Alice para o repositório de Bob (aqui, é apenas uma mudança, a ''g''). Note que o diretório de trabalho de Bob '''não é modificado''' por essa operação: {{{#!dot digraph { label="repositório de Bob" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f -> "diretório de trabalho" [dir=back] e [color=blue] f [color=blue] d -> g [dir=back] g [color=red, label="g (tip)"] } }}} Como a revisão '''g''' de Alice é a cabeça mais nova no repositório de Bob, ela passa a ser a '''tip'''. O Bob então faz um [[Merge|merge]], que em seu diretório de trabalho mescla a última modificação na qual ele estava trabalhando (''f'') com a revisão tip. Nesse momento, seu diretório de trabalho tem duas revisões pai (''f'' e ''g''): {{{#!dot digraph { label="repositório de Bob" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f [dir=back] e [color=blue] f [color=blue] d -> g [dir=back] g [color=red] f -> "diretório de trabalho" [dir=back, weight=3.0] g -> "diretório de trabalho" [dir=back, weight=3.0] } }}} Após examinar o resultado da mesclagem em seu diretório de trabalho, se certificando de que está correto, Bob consolida o resultado, criando um novo [[MergeChangeset|changeset de mesclagem]] ''h'' em seu repositório: {{{#!dot digraph { label="repositório de Bob" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f [dir=back] e [color=blue] f [color=blue] d -> g [dir=back] g [color=red] f -> h [dir=back, weight=3.0] g -> h [dir=back, weight=3.0] h -> "diretório de trabalho" [dir=back] h [color=green, label="h (tip)"] } }}} Se alice agora fizer um '''pull''' do repositório de Bob, ela obterá em seu repositório as mudanças ''e'', ''f'' e ''h'' de Bob: {{{#!dot digraph { label="repositório de Alice" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f [dir=back] e [color=blue] f [color=blue] d -> g [dir=back] g [color=red] f -> h [dir=back, weight=3.0] g -> h [dir=back, weight=3.0] g -> "diretório de trabalho" [dir=back] h [color=green;label="h (tip)"] } }}} Note que o diretório de trabalho de Alice não foi modificado pelo ''pull''. Ela deve fazer uma [[Update|atualização]] para sincronizar seu diretório de trabalho com o changeset de mesclagem ''h''. Isto muda o changeset pai de seu diretório de trabalho para o changeset ''h'' e atualiza os arquivos do seu diretório de trabalho para a revisão ''h''. {{{#!dot digraph { label="repositório de Alice" rankdir = LR node [shape=box] a -> b -> c -> d -> e -> f [dir=back] e [color=blue] f [color=blue] d -> g [dir=back] g [color=red] f -> h [dir=back, weight=3.0] g -> h [dir=back, weight=3.0] h -> "diretório de trabalho" [dir=back] h [color=green, label="h (tip)"] } }}} Agora Alice e Bob estão novamente totalmente sincronizados. == Um Sistema Descentralizado == O Mercurial é um sistema completamente descentralizado e portanto não tem nenhuma noção interna de repositório central. Assim, os usuários são livres para definir suas próprias topologias para compartilhar as modificações (veja CommunicatingChanges): {{{#!dot digraph { Alice -> Central Central -> Alice Bob -> Central Alice -> Bob Alice -> Carl Carl -> Central Bob -> Carl Carl -> Bob "Laptop de Carl" -> Carl Carl -> "Laptop de Carl" "Laptop de Carl" -> Central Central [style=fill;color=blue;label="Main Public Repo"] label="Uma Rede do Mercurial" } }}} Ao contrário de sistemas de controle de versão centralizados, onde experimentação pode ser desastrosa, em um sistema distribuído como o Mercurial você pode simplesmente clonar e experimentar. Se você gostar dos resultados, você pode enviá-los de volta; se não, remova o repositório clonado e tente algo diferente. == O que o Mercurial não faz == Muitos usuários do Subversion ou do CVS costumam manter projetos relacionados agrupados em um repositório. O Mercurial não foi projetado para isso; em especial, isso significa que você não pode obter apenas um diretório de um repositório. Se você precisa manter os repositórios de múltiplos projetos juntos em um tipo de meta-repositório, você pode tentar a [[ForestExtension|extensão Forest]]. Para uma introdução prática de como utilizar o Mercurial, veja o [[Tutorial]]. ---- CategoryBrazilianPortuguese