# Mercurial

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.

## Instalação
### Windows e Mac

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

## Configuração

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:
Obs: substitua somente o conteúdo em negrito, mantendo os "<>" .
Com isso o Mercurial estará pronto para ser utilizado.

## Utilização

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:
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:
Para adicionar um arquivo para ser monitorado:
No entanto o comando acima não conclui a operação, ainda é necessário confirmar a operação realizando um 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:
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:
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:
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:
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:
Para realizar um pull usa-se:
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:
Para realizar um push usa-se:
Há dois comando importantes que podem ser utilizados antes de se realizar um pull ou um push. São os comandos:
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:
No entanto as modificações não são concretizadas até realizar o commit.

## Abreviações de Comandos
### Abreviações pré-definidas

* 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

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

| 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
### Vantagens

* Multiplataforma (Linux, BSD, Mac, Windows)
* 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

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

## Outros Sistemas de Controle de Versão

Sistemas de controle similares:
* Git
* Bazaar
Sistemas de controle sem uma arquitetura distribuída:
* Subversion
* CVS

## Fontes

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