Mercurial é um sistema de controle de versão distribuído de código aberto licenciado sob os termos da GNU General Public License Version 2. Desenvolvido principalmente em Python e em C, o Mercurial é referenciado várias vezes por hg, por conta do elemento químico Mercúrio. Teve sua primeira release em 2005, data próxima ao do sistema de controle de versão git. Em comparativos com outros controles de versão, demonstra bom nível de feature e performance, sendo melhor em determinados aspectos [1][2][3].

Instalação

editar

Linux, Mac, BSD, e Solaris

editar
 # Debian/Ubuntu
 $ apt-get install mercurial
 
 # Fedora
 $ yum install mercurial
   
 # Gentoo
 $ emerge mercurial
  
 # Arch
 $ pacman -S mercurial
   
 # Mac OS (utilizando o gerenciador de pacotes homebrew)
 $ brew install mercurial
 
 # FreeBSD
 $ cd /usr/ports/devel/mercurial
 $ make install
   
 # Solaris 11 Express
 $ pkg install SUNWmercurial
 

Windows e Mac

editar

O Mercurial pode ser baixado para Mac e Windows em: http://mercurial.selenic.com/downloads

Configuração

editar

O Mercurial necessita de um usuário configurado para realizar commits. A melhor forma de realizar essa configuração é criando um arquivo chamado  .hgrc no diretório Home do sue usuário (ou em %USERPROFILE%\Mercurial.ini caso se esteja no windows), contendo um conteúdo seguindo o seguinte exemplo:

[ui]
username = Firstname Lastname <firstname.lastname@example.net>

Obs: substitua somente o conteúdo em negrito, mantendo os "<>" .

Com isso o Mercurial estará pronto para ser utilizado.

Utilização

editar

O Mercurial é chamado usando-se o alias hg, em referência ao elemento químico mercúrio. Assim, todos os comandos do Mercurial devem ser iniciados por hg.

Para se saber qual a versão do Mercurial instalado, digite no prompt de comando:

hg version

O Mercurial trabalha com repositórios. Um repositório é um diretório que contém todos os arquivos de origem que desejamos monitorar, juntamente com o histórico de mudanças desses arquivos. Esse histórico de mudanças encontra-se num diretório oculto chamado .hg.

Para inicializar um repositório, basta digitar:

hg init nome_repositorio

Para adicionar um arquivo para ser monitorado:

hg add arquivo.extensao

No entanto o comando acima não conclui a operação, ainda é necessário confirmar a operação realizando um commit:

hg commit -m"Mensagem do Commit"

Caso não se use o parâmetro -m, será aberto um editor de texto para ser inserido uma mensagem de commit mais extensa e/ou elaborada.

Para clonar um repositório remoto basta utilizar o comando:

hg clone http://www.selenic.com/repo/hello my-hello

Obs: http://www.selenic.com/repo/hello pode ser substituído por qualquer repositório compatível com Mercurial (a forge BitBucket é compatível), e my-hello pode ser subsituído por qualquer nome que deseja-se (caso esse parâmetro não seja passado, o nome será o default do projeto).

Para visualizar o histórico de modificações, utilize o comando dentro do repositório:

hg log

Obs: usando o parâmetro --graph será exibido um gráfico em ASCII do histórico de versão, muito útil para verificar a working tree.

Para ver o status do repositório, utilize o comando:

hg status

Obs: O comando hg status -A mostrará todos os arquivos inclusive os que não sofreram alterações (que não são mostrados por default). Caso haja modificações, será apresentado os nomes dos arquivos modificados junto com uma letra descrevendo o status do arquivo:

  • M = arquivo modificado
  • A = adicionado para ser commitado
  • R = arquivo removido
  • C = arquivo sem alterações
  • ! = arquivo não-encontrado(removido por um comando externo ao Mercurial) mas ainda sendo monitorado
  • ? = arquivo não monitorado
  • I = arquivo ignorado

Para mostrar a diferença entre dois commits, use:

hg diff -r0 -r3

Obs: substitua o 1 e o 3 pelas versões dos commits que se deseja comparar. Diferente do Git, todo commit recebe um id único inteiro que vai de 0 à n, sendo o valor 0 dado ao commit mais antigo.

Para mostrar a diferença entre um arquivo modificado com a ultima versão desse arquivo, basta usar:

hg diff nome_arquivo

Para realizar um pull usa-se:

hg pull repositorio_destino

Embora o pull atualize o histórico de mudanças do repositório, ele não atualiza os arquivos com as novas modificações em si. Para realizar essa atualização é necessário usar o comando:

hg update

Para realizar um push usa-se:

hg push repositorio_destino

Há dois comando importantes que podem ser utilizados antes de se realizar um pull ou um push. São os comandos:

hg incoming
hg outgoing

A primeira verifica as modificações que serão incluídas ao se realizar o pull, enquanto a segunda verifica as modificações que serão submetidas ao se realizar o push.

Para realizar um merge, utiliza-se o comando:

hg merge repositorio_destino

No entanto as modificações não são concretizadas até realizar o commit.

Abreviações de Comandos

editar

Abreviações pré-definidas

editar
  • hg st = hg status
  • hg ci = hg commit
  • hg cp = hg copy
  • hg rm = hg remove
  • hg mv = hr rename/move
  • hg sum = hg summary
  • hg up = hg update

Abreviações automáticas

editar

O Mercurial permite abreviar comandos desde que a sequência de caracteres digitado não seja ambígua. Assim o comando hg verify pode ser escrito como:

  • hg verify
  • hg verif
  • hg veri

A abreviação hg ver só não é permitida por entrar em conflito com o comando hg version que poderia ter a mesma abreviação. Sendo assim, o Mercurial permite abreviações intuitivas de qualquer comando.


Comandos Mercurial vs Git

editar
Git Mercurial
git pull hg pull -u
git fetch hg pull
git reset --hard hg update -C
git revert <commit> hg backout <cset>
git add <new_file> hg add <new_file> (Only equivalent when <new_file> is not tracked.)
git add <file> Not necessary in Mercurial.
git reset Not necessary in Mercurial.
git add -i hg record
git commit -a hg commit
git commit --amend hg commit --amend
git blame hg blame or hg annotate
git blame -C (closest equivalent): hg grep --all
git bisect hg bisect
git rebase --interactive hg histedit <base cset> (Requires the HisteditExtension.)
git stash hg shelve (Requires the ShelveExtension or the AtticExtension.)
git merge hg merge
git cherry-pick <commit> hg graft <cset>
git rebase <upstream> hg rebase -d <cset> (Requires the RebaseExtension.)
git format-patch <commits> and git send-mail hg email -r <csets> (Requires the PatchbombExtension.)
git am <mbox> hg mimport -m <mbox> (Requires the MboxExtension and the MqExtension. Imports patches to mq.)
git checkout HEAD hg update
git log -n hg log --limit n
git push hg push

Vantagens e Desvantagens

editar

Vantagens

editar
  • Multiplataforma (Linux, BSD, Mac, Windows) [1]
  • Fácil migração do git
  • Interface nativa para interação e visualização dos commits
  • Integração com outras ferramentas via plugins(Git, NetBeans, Emacs, etc)
  • Diversas forges disponíveis
  • Abreviação de comandos intuitiva e automática
  • Suporte a plugins
  • Log privativo

Desvantagens

editar
  • No geral, é mais lento que o Git [3] [4]
  • Não é recomendável para certos perfis de projetos [4]
  • Comunidade menos expressiva, já que o número de repositórios que utilizam Mercurial é menor em relação aos outros controles de versão [5]

Outros Sistemas de Controle de Versão

editar

Sistemas de controle similares:

  • Git
  • Bazaar

Sistemas de controle sem uma arquitetura distribuída:

  • Subversion
  • CVS

Fontes

editar

http://mercurial.selenic.com/wiki/

https://www.wikivs.com/wiki/Git_vs_Mercurial

https://code.google.com/p/support/wiki/DVCSAnalysis

  1. 1,0 1,1 https://code.google.com/p/support/wiki/DVCSAnalysis
  2. http://blogs.atlassian.com/2012/02/mercurial-vs-git-why-mercurial/
  3. 3,0 3,1 http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#disadvantages
  4. 4,0 4,1 http://draketo.de/proj/hg-vs-git-server/test-results.html
  5. https://www.openhub.net/repositories/compare