Mercurial vs Git
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.
Git
editarInstalação
editarO 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
editarDe 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
Mercurial
editarInstalação
editarA 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
editarPara 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
editarCaso 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
editarQuick Start
editarQuanto 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
editarTanto 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 |
Complexidade
editarComandos
editarO 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
editarOs 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].
Branchs
editarO 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
editarApesar 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
editarNamed 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
editarBookmarks 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
editarSem 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
editarPor 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
Performance
editarNo 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
editarGit para Mercurial
editarPara converter um repositório Git para um repositório Mercurial, basta configurar o arquivo .hgrc.
- Abra o arquivo .hgrc
$ touch ~/.hgrc
- Dentro do arquivo, adicione o seguinte conteúdo:
[extensions]
hgext.convert=
- Após salvar o arquivo de .hgrc, converta o repositório.
$ hg convert git-repo
- Provavelmente pode aparecer como um repositório vazio, então dê um checkout.
$ cd git-repo
$ hg checkout
Mercurial para Git
editarPor 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:
- Clone o repositório do "hg-fast-export".
$ git clone http://repo.or.cz/w/fast-export.git
- Clone o repositório Mercurial no qual pretende converter, caso não esteja local.
$ hg clone repo
- 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>
Popularidade
editarApesar 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].
Web Hostings
editarExistem 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.
Bibliografia
editarhttps://www.mercurial-scm.org/wiki/Download
https://www.selenic.com/mercurial/hg.1.html
http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/
Pro Git Second Edition
Referências
editar- ↑ 1,0 1,1 https://www.wikivs.com/wiki/Git_vs_Mercurial
- ↑ 2,0 2,1 http://pronus.eng.br/blog/http:/pronus.eng.br/blog/comparacao-entre-subversion-mercurial-e-git-parte-2
- ↑ 3,0 3,1 http://stackoverflow.com/questions/1780778/mercurial-branching-and-bookmarks
- ↑ http://mercurial.aragost.com/kick-start/en/bookmarks/
- ↑ Gerência de Configuração de Software/Mercurial#Quem utiliza.3F