Sistemas de controle de versão distribuídos: introdução ao Mercurial
1. Fundamentos do Mercurial e conceitos-chave
O Mercurial é um sistema de controle de versão distribuído (DVCS) criado por Matt Mackall e lançado em 2005, no mesmo período que o Git. Diferentemente do Git, que prioriza flexibilidade e performance em operações complexas, o Mercurial foi projetado com foco em simplicidade e consistência de comandos, tornando-o mais acessível para iniciantes e equipes que preferem fluxos de trabalho previsíveis.
No modelo distribuído do Mercurial, cada desenvolvedor possui uma cópia completa do repositório, incluindo todo o histórico de alterações. Isso elimina a dependência de um servidor central para operações básicas como commits, diffs e logs. A clonagem de um repositório é uma cópia exata e independente, permitindo trabalho offline completo.
A estrutura de dados do Mercurial é baseada em um grafo acíclico dirigido (DAG), onde cada revisão recebe um número sequencial local (ex: 42) e um hash global único (ex: a1b2c3d4e5f6...). Os números de revisão são relativos ao repositório local, enquanto os hashes garantem integridade e identificação consistente entre diferentes repositórios.
2. Instalação e configuração inicial
A instalação do Mercurial varia conforme o sistema operacional:
# Linux (Ubuntu/Debian)
sudo apt-get install mercurial
# macOS (via Homebrew)
brew install mercurial
# Windows (via Chocolatey)
choco install mercurial
Após a instalação, configure o arquivo ~/.hgrc (Linux/macOS) ou %USERPROFILE%\Mercurial.ini (Windows):
[ui]
username = Seu Nome <email@exemplo.com>
editor = vim
[extensions]
histedit =
shelve =
[alias]
st = status
ci = commit -m
lg = log --graph --limit 10
Para inicializar um repositório, use hg init:
$ mkdir meu-projeto
$ cd meu-projeto
$ hg init
$ ls -la .hg
O diretório .hg contém toda a estrutura interna: objetos, histórico e configurações do repositório.
3. Comandos básicos do dia a dia
O ciclo de trabalho básico começa com a criação de arquivos e seu versionamento:
$ echo "Olá, Mercurial!" > README.txt
$ hg status
? README.txt
$ hg add README.txt
$ hg commit -m "Adiciona arquivo README inicial"
Para visualizar o histórico e o estado atual:
$ hg log
changeset: 0:8a2b3c4d5e6f
tag: tip
user: Seu Nome <email@exemplo.com>
date: Mon Jan 20 10:00:00 2025 -0300
summary: Adiciona arquivo README inicial
$ hg summary
parent: 0:8a2b3c4d5e6f tip
branch: default
commit: (clean)
update: (current)
Para desfazer alterações, o Mercurial oferece comandos distintos:
# Reverter um arquivo para a última versão commitada
$ hg revert README.txt
# Desfazer um commit específico criando um novo commit reverso
$ hg backout -r 0
Diferente do Git, não existe git reset no Mercurial. O hg revert é mais seguro, pois nunca perde alterações não commitadas.
4. Ramificação (branching) e mesclagem (merging)
O Mercurial suporta branches nomeados e anônimos:
# Criar um branch nomeado
$ hg branch nova-funcionalidade
$ echo "feature" > novo-arquivo.txt
$ hg commit -m "Inicia desenvolvimento da nova funcionalidade"
# Listar branches
$ hg branches
nova-funcionalidade 1:9b8c7d6e5f4g
default 0:8a2b3c4d5e6f (inactive)
Para mesclar branches:
$ hg update default
$ hg merge nova-funcionalidade
$ hg commit -m "Merge da nova funcionalidade na branch default"
Em caso de conflitos, o Mercurial sinaliza os arquivos conflitantes:
$ hg merge --tool meld
Após resolver os conflitos manualmente, finalize com hg commit. Para fechar um branch:
$ hg update nova-funcionalidade
$ hg commit --close-branch -m "Funcionalidade concluída e mesclada"
5. Trabalhando com repositórios remotos
A clonagem e sincronização com repositórios remotos segue um fluxo claro:
# Clonar um repositório
$ hg clone https://example.com/projeto
# Verificar alterações pendentes
$ hg outgoing
$ hg incoming
# Sincronizar
$ hg pull
$ hg update
$ hg push
O Mercurial suporta múltiplos protocolos:
# SSH
$ hg clone ssh://user@server.com/repo
# Local
$ hg clone /caminho/para/repo
# HTTP/HTTPS
$ hg clone https://example.com/repo
Para resolver conflitos de push:
# Enviar novo branch
$ hg push --new-branch
# Forçar push (com cuidado!)
$ hg push --force
6. Extensões que potencializam o Mercurial
A extensão histedit permite reescrever o histórico interativamente:
$ hg histedit -r 2
# Comandos disponíveis: pick, edit, fold, drop, mess
A extensão shelve guarda mudanças temporariamente:
$ hg shelve
$ hg unshelve
A extensão evolve oferece gerenciamento seguro de alterações:
$ hg amend -m "Mensagem corrigida"
$ hg evolve
7. Mercurial vs. Git: quando escolher cada um?
O Mercurial se destaca pela simplicidade e consistência:
- Curva de aprendizado: Comandos intuitivos como
hg commit -m,hg updateehg mergesão mais previsíveis que equivalentes no Git. - Casos de uso ideais: Projetos com fluxo linear, times pequenos, ambientes corporativos que priorizam estabilidade.
- Migração: A extensão
hg-gitpermite interagir com repositórios Git, facilitando transições.
Enquanto o Git oferece flexibilidade para workflows complexos (rebasing interativo, staging area), o Mercurial é preferível quando a previsibilidade e simplicidade são mais importantes que poder bruto.
Referências
- Documentação oficial do Mercurial — Guia completo de instalação, comandos e extensões do Mercurial.
- Mercurial: The Definitive Guide (O'Reilly) — Livro online gratuito que cobre todos os aspectos do Mercurial.
- Tutorial de introdução ao Mercurial (Atlassian) — Tutorial prático com exemplos de fluxos de trabalho.
- Comparação Mercurial vs Git (Stack Overflow) — Discussão técnica detalhada sobre diferenças entre os sistemas.
- Extensão Evolve do Mercurial — Documentação oficial sobre gerenciamento de alterações com segurança.
- hg-git: ponte entre Mercurial e Git — Ferramenta para interoperabilidade entre os dois sistemas de controle de versão.