O Git é uma solução fantástica de controle de versão distribuído para código fonte, não há como negar. A sua velocidade, flexibilidade e segurança nos permite trabalhar de forma muito dinâmica com centenas de pessoas simultaneamente em um mesmo projeto. Mas como nada na vida é perfeito, o Git também não é. Apesar da grande inteligência da ferramenta, um dos maiores problemas ainda é fazer o merge entre arquivos. Quando as alterações em um mesmo arquivo são muito grandes, o processo de inserir as suas modificações em cima dele fica extremamente árduo, já que é necessário avaliar cuidadosamente quais linhas foram alteradas, onde inserir as novas e quais devem ser deletadas.
Para ajudar nesta tarefa, gostaria de apresentar uma ferramenta bem bacana: o Meld. Esta ferramenta de código aberto, atualmente na versão 3.16.4, nos permite fazer a diferença entre arquivos visualmente, apontando com cores, setas e outras indicações, exatamente quais os pontos de divergência entre eles. Ele nos provê uma visualização de duas ou três vias de comparação entre arquivos e diretórios, nos deixando interagir diretamente para formar o arquivo da forma que quisermos. É bem bacana.
É possível utilizar o Meld de forma isolada, abrindo o programa e selecionando os arquivos que deseja comparar. Entretanto, neste artigo vou ensinar como integrá-lo a ferramenta Git, para que sempre que houver um problema de merge, o Meld seja invocado imediatamente para nos auxiliar a resolver. O primeiro passo, após instalar o software em sua máquina (aqui vou demonstrar como utilizar no Ubuntu, mas o processo é semelhante para os demais), é criar o arquivo diff.py (ou qualquer outro nome, fica a seu critério) com o seguinte código:
#!/usr/bin/python import sys import os os.system('meld "%s" "%s"' % (sys.argv[2], sys.argv[5]))
Grave-o onde você preferir. Eu costumo deixar na /home do meu usuário. Precisamos criá-lo para corrigir um problema com o número de parâmetros usados ao rodar a ferramenta.
Feito isso, é necessário dar a permissão de execução para o arquivo. Para isso, basta executar no terminal:
chmod +x diff.py
O segundo passo é indicar para o Git que você sempre deseja utilizar o Meld para efetuar os diffs e merges. Para isso, digite o seguinte comando no terminal:
git config --global diff.external <caminho_para_seu_arquivo_diff.py>
Note que onde está escrito <caminho_para_seu_arquivo_diff.py> é necessário colocar o caminho absoluto de onde você deixou o arquivo diff.py. Isso fará com que o Git chame o nosso script Python sempre que for executar um diff.
Da mesma maneira, precisamos indicar para o Git que queremos utilizar o Meld também para resolver os merges. Para isso, execute:
git config --global merge.tool meld
Agora toda vez que você digitar git diff ou git mergetool e os respectivos arquivos no seu terminal, a ferramenta abrirá automaticamente com os arquivos em questão. Quando for apenas um diff, a janela aparecerá com duas divisórias. Algo parecido com isto:
Repare que no segundo arquivo, eu adicionei o comando “print(“modificação proposital”)” para diferenciá-lo. O que foi adicionado é sempre representado com a cor verde. Quando o que temos for uma remoção, ela é representada com a cor vermelha.
As alterações no meio das linhas também são representadas através da cor vermelha.
As setinhas que ficam do lado das linhas nos permite copiar os trechos de um lado para o outro. Apertando a tecla ctrl, as setinhas nos oferecem a opção de incluir o código acima ou abaixo do trecho correspondente do outro lado. Isso facilita bastante o trabalho de fazer o merge do conteúdo dos arquivos. Como no caso de uso mais comum, onde queremos fazer um merge do nosso código com o repositório master.
Quando o Git encontrar uma diferença que ele não sabe resolver, você poderá digitar git mergetool e ele abrirá o arquivo em questão em três divisórias: a origem (a esquerda), o resultado que você deseja manter (no meio) e que você alterou no seu commit (a direita).
Feitas as alterações, basta salvar o arquivo do meio e pronto! Bem legal, não é mesmo?
O Meld está disponível para a maior parte das distribuições Linux/Unix (Ubuntu, Fedora, Suse) através do gerenciador de pacotes; para o Windows através do Meld installer e para OS X de forma não oficial através de builds específicos. Para o último caso, recomendo uma ferramenta semelhante, mas paga, a Beyond Compare.