Saltar para o conteúdo

Mercurial vs Git

Fonte: Wikiversidade

Este artigo irá discorrer sobre duas ferramentas de versionamento de software com uma utilização muito significativa nos dias atuais. Serão pontuadas os pontos que perpassam em cada um quanto ao contexto histórico, instalação e principais comandos, bem como um comparativo entre estas.

O Git, uma ferramenta multiplataformas, possui procedimentos muito simples para a sua instalação. De maneira geral, os seus desenvolvedores produziram binários para quatro plataformas:

  • Linux
  • Mac OS X
  • Windows
  • Solaris

Todos os binários estão disponíveis no repositório do git Downloads e podem ser instalados de acordo com o seu respectivo sistema operacional.

Ubuntu/Debian

[editar | editar código-fonte]

De maneira mais específica, existe um software empacotado para a sua instalação nos repositórios das distribuições Ubuntu e Debian. Para esta instalação, pode ser utilizado este seguinte comando:

# Instalar pacote git
$ sudo apt-get install git

A instalação do mercurial pode ser feita em várias plataformas: Linux, Mac, Windows, etc. Neste âmbito, iremos discorrer sobre qual a metodologia de instalação em várias destas.

Ubuntu/Debian

[editar | editar código-fonte]

Para uma instalação mais eespecífica, se tratando de Ubuntu ou Debian, este simples comando instala a ferramenta.

# Instalar pacote mercurial
$ sudo apt-get install mercurial

Demais Sistemas Operacionais

[editar | editar código-fonte]

Caso a máquina que receberá a instalação não esteja em nenhuma das bases anteriormente citadas, deve-se baixar o pacote executável respectivo com a plataforma utilizada. O mercurial libera repositórios para todas as plataformas que ele atende. Basta apenas escolher o sistema operacional e executar o arquivo disponibilizado para a instalação neste Link.

Mercurial vs Git

[editar | editar código-fonte]

Quanto as maneiras de se iniciar um projeto no mercurial: não existem diferenças significativas. Será ilustrados os passos utilizados para a iniciação de um projeto no mercurial de duas maneiras diferentes: Iniciando o repositório e o clonando, no exemplo a seguir.

Neste exemplo prático, será ilustrado como proceder para iniciar um repositório na sua própria máquina ou clonar de um servidor. Primeiramente, para iniciar um repositório do zero, pode-se proceder com:

$ hg init (project-directory)
$ cd (project-directory)
$ (add some files)
$ hg add

Após, deve-se registrar o usuário editando o arquivo .hgrc. Abra com seu editor preferido este aquivo no seguinte local:

$ vim ~/.hgrc

Assim, coloque as suas credenciais como abaixo e salve o arquivo:

[ui]
username = Your Name <your.email@example.com>

Após, utilize o comando commit que as alterações serão anexadas ao incremento de software.

$ hg commit -m "Initial Commit"

Para copiar um repositório em um servidor, por exemplo no repositório da Sof2U, deve-se proceder com os seguintes comandos:

$ hg clone ssh://sof2u.com//repo/starting-mercurial/ 
$ cd starting-mercurial
$ (edit files)
$ hg add (new files)
$ hg commit -m 'My changes'
$ hg push

Tabela de comandos Git e Mercurial

[editar | editar código-fonte]

Tanto o Git quanto o Mercurial são sistemas de controle de versão distribuídos. Surgidos quase que paralelamente, eles compartilhou de uma grande similaridade, tanto em conceitos quanto em seus comandos. Abaixo se encontra uma tabela comparativa de comandos do Git e Mercurial[1]. Para informações sobre a função dos comandos no Mercurial, acesse Gerência de Configuração de Software/Mercurial. Também é recomendado ver a explicação dos comandos Git básico e Git Avançado

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

O número de comandos pode influenciar na curva de aprendizagem do sistema de controle de versão, por isso há um comparativo entre os comandos do Mercurial e do Git[2].

O Mercurial possui 55 comandos, sendo 18 considerados comandos básicos e 37 avançados.

O git possui um total de 144 comandos sendo que 21 deles são considerados básicos e o restante como comandos avançados.

Partindo da análise de número de comandos existentes em cada sistema, conclui-se que o Mercurial é mais fácil de aprender. No Git há também o fator de existir o comando canivete-suíço checkout que pode confundir em significado para quem está aprendendo.

Textos de ajuda

[editar | editar código-fonte]
Figura 1 - Comparação de número de linhas no texto de ajuda para os comandos dos Sistemas de Controle de Versão que foram o SVN, o Mercurial e o Git.

Os textos de ajuda podem demonstrar o quanto está bem explicado a documentação, mas também pode significar a complexidade dos comandos quando o texto é mais longo. Partindo dessa lógica de que o texto influencia na complexidade do comando, podemos analisar a complexidade de cada um.

A figura 1 mostra um gráfico comparando a quantidade de linhas de texto de ajuda para alguns comandos dos sistemas de controle de verão. Tendo como parâmetro a lógica adotada, pode-se reafirmar, além da quantidade de comandos, que o Mercurial tem uma curva de aprendizagem melhor[2].

O conceito de branch, tanto no Git quanto no Mercurial, é o mesmo. Branch significa "galho" em inglês e em ambos sistemas esse conceito se aplica aos "galhos" gerados a partir de um determinado commit, tendo-se um desenvolvimento particular sem alteração externa. Geralmente branchs são criadas para que os desenvolvedores se concentrem em seu trabalho particular sem interferências de outros para que se evite conflitos. Depois de terminado o trabalho, as branchs recebem o merge para a master (quando em versão estável) ou merge para qualquer outra branch especificando na linha de comando do sistema de controle de versão.

Branch no Mercurial

[editar | editar código-fonte]

Apesar do conceito entre branchs do Git e Mercurial serem similares, há um ponto importante no Mercurial: As branchs são permanentes. Isso significa que as branchs no Mercurial não podem ser removidas como no Git. Após ser criado merge entre branchs, a que recebeu o merge permanece enquanto a outra recebe apenas o status de desativada.

Branching com Named Branch
[editar | editar código-fonte]

Named Branch é nada mais que nomear uma nova branch, separando-se da atual, assim como ocorre no git quando se utiliza do comando checkout para criar uma nova branch.

Após entrar localmente na pasta do projeto, pode-se criar uma nova branch.

# Criação de uma branch de nome "feature"
$ hg branch feature

O comando acima criará uma nova branch de nome "feature" a partir do estado atual do changeset.

Branching com Bookmarks
[editar | editar código-fonte]

Bookmarks são tags que apontam para uma determinada changeset e todos os commits que forem feitos, esse bookmark irá seguir.

Bookmarks em primeiro momento pode ser confundido com o Named Branchs e a diferença entre eles é explicada em Bookmarks vs Named Branchs.

# Criação de um bookmark
$ hg bookmark feature

Até a versão 1.6 do Mercurial, os Bookmarks eram apenas locais, fazendo com que não funcionassem e fossem reconhecidos em repositório remoto.

Bookmarks vs Named Branchs
[editar | editar código-fonte]

Sem os detalhes técnicos, aparentemente de forma superficial os bookmarks e named branchs parecem ter a mesma função, entretanto, por recomendações da comunidade, há boas práticas de uso para ambas[3]. Enquanto Named Branchs são mais comuns de serem usadas para adicionar features, assim como as boas práticas de criação de branchs no Git pois serão nomes que não serão removidos, os Bookmarks são utilizados para mudanças menores, que tenham um período curto de desenvolvimento como por exemplo a correção de bugs, apesar do próprio Mercurial fazer mais uso de Bookmarks tanto para alterações maiores quanto menores[4][3].

Branch no Git

[editar | editar código-fonte]

Por ser mais popular, os branchs no Git são bastante conhecidos. As branchs no Git, ao contrário do Mercurial, são temporárias e podem ser removidas a qualquer momento, seja localmente ou remotamente. O comando para a criação de uma Branch é o "canivete-suiço" do Git, o checkout.

# Criação de uma branch no Git com o nome feature. A flag -b indica que é para 
#   criar uma branch e ir pra ela automaticamente

$ git checkout -b feature

O comando checkout também tem a função de alterar de uma branch a outra (além de outras funções)

# Alteração para outra branch chamada feature 2.

$ git checkout feature-2

No uso de ambos sistemas, não foram detectados diferenças significantes entre o Mercurial e o Git. Entretanto, algumas fontes[1] afirmam que o Git é mais rápido em operações que necessitam de internet como push e pull, porém a diferença nessa questão também não é significante.

Migração de repositório e interoperatividade

[editar | editar código-fonte]

Git para Mercurial

[editar | editar código-fonte]

Para converter um repositório Git para um repositório Mercurial, basta configurar o arquivo .hgrc.

  1. Abra o arquivo .hgrc
$ touch ~/.hgrc
  1. Dentro do arquivo, adicione o seguinte conteúdo:
[extensions]
hgext.convert=
  1. Após salvar o arquivo de .hgrc, converta o repositório.
$ hg convert git-repo
  1. Provavelmente pode aparecer como um repositório vazio, então dê um checkout.
$ cd git-repo
$ hg checkout

Mercurial para Git

[editar | editar código-fonte]

Por meio da ferramenta "hg-fast-export" disponível no Github, é possível converter um repositório Git em Mercurial de forma muito simples seguindo os seguintes passos:

  1. Clone o repositório do "hg-fast-export".
$ git clone http://repo.or.cz/w/fast-export.git
  1. Clone o repositório Mercurial no qual pretende converter, caso não esteja local.
$ hg clone repo
  1. Crie um novo repositório localmente e execute o "hg-fast-export".
# A execução direta desses comandos parte do princípio de que o terminal se
#   encontra no diretório correto.
$ git init
$ hg-fast-export.sh -r <repo>

Apesar da similaridade de conceitos, uma história paralela surgida no mesmo ano, o Git é o SCV mais popular, porém o Mercurial tem uma comunidade avançada e com projetos famosos que o utilizam[5].

Existem repositórios remotos mais utilizados tanto para Git quanto para o Mercurial. Para o Git, o mais utilizado atualmente é o Github, enquanto que o Bitbucket é extensamente utilizado para Mercurial, porém também tem um grande número de usuários que o utilizam para repositório remoto de Git. O Kiln também é bastante utilizado para repositórios Mercurial. Há uma lista para consultar os repositórios remotos que suportam o Mercurial e também para o Git.

https://www.mercurial-scm.org/wiki/Download

https://git-scm.com/downloads

http://sof2u.com/

https://www.selenic.com/mercurial/hg.1.html

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/

https://blog.pronus.io/posts/comparacao-de-complexidade-entre-subversion-mercurial-e-git-baseada-em-quantidade-de-texto-de-ajuda/

Pro Git Second Edition

  1. 1,0 1,1 https://www.wikivs.com/wiki/Git_vs_Mercurial
  2. 2,0 2,1 http://pronus.eng.br/blog/http:/pronus.eng.br/blog/comparacao-entre-subversion-mercurial-e-git-parte-2
  3. 3,0 3,1 http://stackoverflow.com/questions/1780778/mercurial-branching-and-bookmarks
  4. http://mercurial.aragost.com/kick-start/en/bookmarks/
  5. Gerência de Configuração de Software/Mercurial#Quem utiliza.3F