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 update e hg merge sã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-git permite 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