Desenvolvimento

17 fev, 2017

Git diffs e merges mais práticos com o Meld

Publicidade

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:

Figura 1 – Git diff: Inclusão de novas linhas

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.

Figura 2 – Git diff: Exclusão de linhas

As alterações no meio das linhas também são representadas através da cor vermelha.

Figura 3 – Git diff: Alteração na linha

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.