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