Differences between revisions 13 and 21 (spanning 8 versions)
Revision 13 as of 2008-01-15 23:55:14
Size: 7214
Editor: abuehl
Comment: #language pt
Revision 21 as of 2013-04-04 22:31:53
Size: 11364
Comment: Using the command reference to commit as per style guide.
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
#pragma section-numbers 2
= Entendendo o Mercurial =
Line 7: Line 9:
Veja o ["Tutorial"] para instruções passo a passo. Veja o [[BrazilianPortugueseTutorial|Tutorial]] para instruções passo a passo.
Line 11: Line 13:
[[TableOfContents]] <<TableOfContents>>
Line 15: Line 17:
Os [:Repository:repositórios] do Mercurial contêm um [:WorkingDirectory:diretório de trabalho] acoplado: 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]]):
Line 22: Line 62:
 subgraph cluster_1 {
  style=filled;
  color="#eeeeee";
  node [shape=box,style=filled,color=lightgray];
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3";
  label = "store";
 }
Line 30: Line 63:
  label="diretório de trabalho";
Line 35: Line 69:
  label="working directory";
Line 37: Line 70:
 "rev 2" -> ".hgtags" [lhead = cluster_0 constraint=false]
}
}}}

O repositório contém o histórico '''completo''' do projeto. Diferente dos [:SCM: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, rev 2). Devido às [:Tag:tags] e os arquivos ignorados serem serem controlados pela revisão, eles também são incluídos.

== Salvando (Committing) Modificações ==

Quando você submete suas modificações ([:Commit:commit]), o estado do diretório de trabalho em relação aos seus [:Parent:pais] é gravado como uma nova [:Revision:revisão]:

{{{#!dot
digraph G {
 compound=true;
 rankdir = LR
 background="#999999";
Line 56: Line 71:
  label = "armazenamento de histórico";
  labelloc = b;
Line 59: Line 76:
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3";
  "rev 2" -> "rev 4";
  label = "store";
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3" [dir=back];
  "rev 2" -> "rev 4" [dir=back];
Line 63: Line 79:
 subgraph cluster_0 {
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  edge [style=invis];
  "main.c"-> "main.h" -> ".hgignore" -> ".hgtags"
  label="working directory";
 }
 "rev 2" -> ".hgtags" [style = dotted lhead = cluster_0 constraint=false]
 "rev 4" -> ".hgtags" [lhead = cluster_0 constraint=false]
 ".hgtags" -> "rev 4" [color = red label = "commit" ltail = cluster_0 constraint=false]
}
}}}

Note que a revisão 4 é um '''ramo''' (branch) da revisão, a qual era a revisão no diretório de trabalho. Agora, a revisão 4 é o '''pai''' do diretório de trabalho.

== Revisões, Changesets, Heads, and Tip ==

O Mercurial agrupa as modificações relacionadas a múltiplos arquivos um único conjunto atômico de modificações ([:ChangeSet:changesets]), as quais 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.

Devido ao Mercurial permitir o desenvolvimento distribuído em paralelo, estes números de revisão podem ser diferentes entre os usuários. Assim, o Mercurial também atribui para cada revisão um identificador global de modificações ([:ChangeSetID:changeset ID]). Os ''Changeset IDs'' são números hexadecimais de 40 dígitos, mas podem ser abreviados para um prefixo qualquer que não seja ambíguo, como "e38487".

{{{#!dot
digraph {
   rankdir = LR
   node [shape=box]
   "rev 0:838e" -> "rev 1:34ef" -> "rev 2:4563"
   "rev 1:34ef" -> "rev 3:fe56"
   "rev 2:4563" -> "rev 4:ac98"
   "rev 3:fe56" -> "rev 4:ac98"
   "rev 4:ac98" -> "rev 5:0345"
   "rev 4:ac98" -> "rev 6:19e3 (tip)"
   label="example history"
}
}}}

Ramos (branches) e fusões ([:Merge:merges]) no histórico das revisões podem ocorrer em qualquer ponto. Cada ramo que não está unido 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 extremidade ([:Tip:tip]) do repositório, a cabeça com o maior número de revisão.

== Clonando, Modificando, Mesclando e Obtendo ==

Vamos iniciar com a usuária Alice, a qual tem um repositório que se parece com este:

{{{#!dot
digraph {
   label="Alice's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d
}
}}}

O Bob [:Clone:clona] este repositório da Alice e obtém uma cópia completa do mesmo (apesar do seu diretório de trabalho ser independente!):

{{{#!dot
digraph {
   label="Bob's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d
}
}}}

O Bob então [:Commit:submete] algumas modificações:

{{{#!dot
digraph {
   label="Bob's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
}
}}}

A Alice realiza suas modificações em paralelo:

{{{#!dot
digraph {
   label="Alice's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->g
   g [color=red]
}
}}}

O Bob então [:Pull:puxa] 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 do Bob:

{{{#!dot
digraph {
   label="Bob's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
   d->g
   g [color=red;label="g (tip)"]
}
}}}

Devido à revisão '''g''' da Alice ser mais nova que as revisões do repositório do Bob, esta agora passa a ser a extremidade ('''tip'''). O Bob então faz um [:Merge:merge] o qual combina as últimas modificações nas quais ele estava trabalhando em ('''f''') com o tip, submete o resultado e termina com:

{{{#!dot
digraph {
   label="Bob's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
   d->g
   g [color=red]
   f->h
   g->h
 "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> p1 | <p2> p2} | rev 0:838e}"];
   rev1 [label="{{<p1> p1 | <p2> p2} | rev 1:34ef}"];
   rev2 [label="{{<p1> p1 | <p2> p2} | rev 2:4563}"];
   rev3 [label="{{<p1> p1 | <p2> p2} | rev 3:fe56}"];
   rev4 [label="{{<p1> p1 | <p2> p2} | rev 4:ac98}"];
   rev5 [label="{{<p1> p1 | <p2> p2} | rev 5:0345}"];
   rev6 [label="{{<p1> p1 | <p2> p2} | rev 6:19e3 (tip)}"];
   workingdir [label="{{<p1> p1 | <p2> 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]
Line 185: Line 247:
Agora, Alice '''puxa''' de Bob suas modificações e obtém e, f e h, e estará totalmente sincronizada:

{{{#!dot
digraph {
   label="Alice's Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->g
   d->e->f
   e [color=blue]
   f [color=blue]
   g [color=red]
   f->h
   g->h
   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.
Line 217: Line 284:
   "Carl's Laptop" -> Carl
   Carl -> "Carl's Laptop"
   "Carl's Laptop" -> Central
   "Laptop de Carl" -> Carl
   Carl -> "Laptop de Carl"
   "Laptop de Carl" -> Central
Line 221: Line 288:
   label="A Mercurial Network"
}
}}}

Para uma introdução prática de como utilizar o Mercurial, veja o ["Tutorial"].
   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]].

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 Tutorial para instruções passo a passo.

(This page in English: UnderstandingMercurial)

1. O que é um Repositório

Os repositórios do Mercurial contêm um diretório de trabalho acoplado a um armazenamento de histórico:

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

2. Consolidando Modificações

Quando você consolida suas modificações (usando o comando commit), o estado do diretório de trabalho em relação aos seus pais é gravado como um novo changeset (também chamado de uma nova revisão):

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.

3. 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 (changesets), que são as revisões para o projeto como um todo. Cada uma destas modificações recebe um 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 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".

Ramos (branches) e mesclagens (merges) no histórico das revisões podem ocorrer em qualquer ponto. Cada ramo não mesclado cria uma nova cabeça (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 (extremidade) do repositório, a cabeça com o maior número de revisão. A revisão 4 é um changeset de mesclagem, pois possui dois changesets pais (revisões 2 e 3).

4. Clonando, Fazendo Mudanças, Mesclando, Trazendo Revisões e Atualizando

Vamos começar com a usuária Alice, que tem um repositório assim:

O Bob 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:

Bob pode então trabalhar de forma independente. Ele então consolida algumas modificações, e e f:

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

O Bob então 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:

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, 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):

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 changeset de mesclagem h em seu repositório:

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:

Note que o diretório de trabalho de Alice não foi modificado pelo pull. Ela deve fazer uma 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.

Agora Alice e Bob estão novamente totalmente sincronizados.

5. 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):

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.

6. 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 extensão Forest.

Para uma introdução prática de como utilizar o Mercurial, veja o Tutorial.


CategoryBrazilianPortuguese

BrazilianPortugueseUnderstandingMercurial (last edited 2013-04-04 22:31:53 by LeonardoPostacchini)