Embora muitas das informações nesta pergunta e resposta estejam disponíveis no StackOverflow , elas estão espalhadas por várias páginas e entre outras respostas erradas ou enganosas. Demorei um pouco para juntar tudo o que eu queria saber.
Existem muitos programas diferentes que podem ser usados como o seu git difftool e mergetool, e certamente não há consenso sobre qual é o melhor (opiniões, requisitos e sistemas operacionais serão claramente diferentes).
O Meld é uma opção popular gratuita, de código aberto e de plataforma cruzada (UNIX / Linux, OSX, Windows), como mostra a pergunta StackOverflow : Qual é a melhor ferramenta de mesclagem visual para o Git? , em que a resposta que propõe Meld tem mais de 3 vezes os votos que qualquer outra ferramenta.
As 2 perguntas a seguir serão respondidas na minha resposta abaixo:
- Como faço para configurar e usar o Meld como meu diffitol git?
- Como configuro e uso o Meld como meu git mergetool?
Nota: Não é necessário usar o mesmo programa que o difftool e o mergetool; programas diferentes podem ser definidos para ambos.
Respostas:
Como faço para configurar e usar o Meld como meu diffitol git?
O git difftool exibe o diff usando um programa diff da GUI (por exemplo, Meld) em vez de exibir a saída do diff no seu terminal.
Embora você possa definir o programa GUI na linha de comando
-t <tool> / --tool=<tool>
, faz mais sentido configurá-lo em seu.gitconfig
arquivo. [Nota: Veja as seções sobre como escapar aspas e caminhos do Windows na parte inferior.][Nota: essas configurações não alterarão o comportamento das
git diff
quais continuarão funcionando normalmente.]Você usa
git difftool
exatamente da mesma maneira que você usagit diff
. por exemploSe configurada corretamente, uma janela Meld será aberta, exibindo o diff usando uma interface GUI.
A ordem dos painéis da janela da GUI do Meld pode ser controlada pela ordem de
$LOCAL
e$REMOTE
paracmd
, ou seja, qual arquivo é mostrado no painel esquerdo e qual no painel direito. Se você quiser o contrário, troque-o assim:Finalmente, a
prompt = false
linha simplesmente impede que o git indique se você deseja iniciar o Meld ou não, por padrão, o git emitirá um prompt.Como configuro e uso o Meld como meu git mergetool?
O git mergetool permite que você use um programa de mesclagem da GUI (por exemplo, Meld) para resolver os conflitos de mesclagem que ocorreram durante uma mesclagem.
Como o difftool, você pode definir o programa GUI na linha de comando usando
-t <tool> / --tool=<tool>
, mas, como antes, faz mais sentido configurá-lo em seu.gitconfig
arquivo. [Nota: Veja as seções sobre como escapar aspas e caminhos do Windows na parte inferior.]Você NÃO usa
git mergetool
para executar uma mesclagem real. Antes de usar,git mergetool
você faz uma mesclagem da maneira usual com o git. por exemploSe houver um conflito de mesclagem, o git exibirá algo como isto:
Neste ponto
file_name
, o arquivo será parcialmente mesclado com as informações de conflito de mesclagem (esse é o arquivo com todas as entradas>>>>>>>
e<<<<<<<
).Agora, o Mergetool pode ser usado para resolver os conflitos de mesclagem. Você o inicia muito facilmente com:
Se configurada corretamente, uma janela Meld será aberta, exibindo 3 arquivos. Cada arquivo estará contido em um painel separado de sua interface GUI.
Na
.gitconfig
entrada de exemplo acima, 2 linhas são sugeridas como a[mergetool "meld"]
cmd
linha. De fato, existem todos os tipos de maneiras para os usuários avançados configurarem acmd
linha, mas isso está além do escopo desta resposta.Essa resposta tem duas
cmd
linhas alternativas que, entre elas, atenderão à maioria dos usuários e serão um bom ponto de partida para usuários avançados que desejam levar a ferramenta ao próximo nível de complexidade.Primeiro, aqui está o que os parâmetros significam:
$LOCAL
é o arquivo na ramificação atual (por exemplo, mestre).$REMOTE
é o arquivo no ramo que está sendo mesclado (por exemplo, branch_name).$MERGED
é o arquivo parcialmente mesclado com as informações de conflito de mesclagem.$BASE
é o ancestral de consolidação compartilhado de$LOCAL
e$REMOTE
, ou seja, o arquivo como era quando o ramo que continha$REMOTE
foi criado originalmente.Eu sugiro que você use:
ou:
A escolha é usar
$MERGED
ou$BASE
entre$LOCAL
e$REMOTE
.De qualquer maneira Meld irá exibir 3 painéis com
$LOCAL
e$REMOTE
nos painéis esquerdo e direito e, ou$MERGED
ou$BASE
no painel central.Nos dois casos, o painel do meio é o arquivo que você deve editar para resolver os conflitos de mesclagem. A diferença é exatamente em qual posição de edição inicial você prefere;
$MERGED
para o arquivo que contém o arquivo parcialmente mesclado com as informações de conflito de mesclagem ou$BASE
para o ancestral de confirmação compartilhado de$LOCAL
e$REMOTE
. [Como as duascmd
linhas podem ser úteis, mantenho as duas no meu.gitconfig
arquivo. Na maioria das vezes, uso a$MERGED
linha e a$BASE
linha é comentada, mas o comentário pode ser trocado se eu quiser usar a$BASE
linha.]Nota No Arquivo de saída: não se preocupe que
--output "$MERGED"
é usado nacmd
independentemente de se$MERGED
ou$BASE
foi utilizado no início dacmd
linha. A--output
opção simplesmente informa ao Meld em que nome do arquivo git deseja que o arquivo de resolução de conflitos seja salvo. O Meld salvará as edições de conflito nesse arquivo, independentemente de você usar$MERGED
ou$BASE
como seu ponto de edição inicial.Após editar o painel do meio para resolver os conflitos de mesclagem, salve o arquivo e feche a janela Meld. O Git fará a atualização automaticamente e o arquivo na ramificação atual (por exemplo, mestre) agora conterá o que você acabou no painel do meio.
O git fará um backup do arquivo parcialmente mesclado com as informações de conflito de mesclagem anexando
.orig
ao nome do arquivo original. por exemplofile_name.orig
. Depois de verificar se você está satisfeito com a mesclagem e executar os testes que desejar, o.orig
arquivo pode ser excluído.Neste ponto, agora você pode fazer uma confirmação para confirmar as alterações.
Se, enquanto estiver editando os conflitos de mesclagem no Meld, você deseja abandonar o uso do Meld, saia do Meld sem salvar o arquivo de resolução da mesclagem no painel do meio. O git responderá com a mensagem
file_name seems unchanged
e perguntaráWas the merge successful? [y/n]
, se você respondern
, a resolução do conflito de mesclagem será abortada e o arquivo permanecerá inalterado. Observe que se você salvou o arquivo no Meld a qualquer momento, não receberá o aviso nem o prompt do git. [É claro que você pode simplesmente excluir o arquivo e substituí-lo pelo.orig
arquivo de backup que o git criou para você.]Se você tiver mais de um arquivo com conflitos de mesclagem, o git abrirá uma nova janela Meld para cada um, um após o outro até que tudo esteja pronto. Eles não serão todos abertos ao mesmo tempo, mas quando você terminar de editar os conflitos em um e fechar o Meld, o git abrirá o próximo e assim sucessivamente, até que todos os conflitos de mesclagem sejam resolvidos.
Seria sensato criar um projeto fictício para testar o uso
git mergetool
antes de usá-lo em um projeto ao vivo . Certifique-se de usar um nome de arquivo que contenha um espaço em seu teste, caso seu sistema operacional exija que você escape das aspas nacmd
linha, veja abaixo.Escapando caracteres de aspas
Alguns sistemas operacionais podem precisar ter as aspas em
cmd
escape. Usuários menos experientes devem lembrar que as linhas de comando de configuração devem ser testadas com nomes de arquivos que incluem espaços e, se ascmd
linhas não funcionarem com os nomes de arquivos que incluem espaços, tente escapar das aspas. por exemploEm alguns casos, pode ser necessário um escape de cotação mais complexo. O primeiro dos links de caminho do Windows abaixo contém um exemplo de escape triplo de cada citação. É um tédio, mas às vezes necessário. por exemplo
Caminhos do Windows
Os usuários do Windows provavelmente precisarão de uma configuração extra adicionada às
cmd
linhas Meld . Eles podem precisar usar o caminho completo parameldc
, projetado para ser chamado no Windows a partir da linha de comando, ou podem precisar ou querer usar um wrapper. Eles devem ler as páginas StackOverflow vinculadas abaixo, sobre como definir acmd
linha Meld correta para Windows. Como sou usuário de Linux, não consigo testar as váriascmd
linhas do Windows e não tenho mais informações sobre o assunto além de recomendar usar meus exemplos com a adição de um caminho completo para o Meld oumeldc
, ou adicionar a pasta do programa Meld ao seupath
.Ignorando o espaço em branco à direita com Meld
O Meld possui várias preferências que podem ser configuradas na GUI.
Na
Text Filters
guia preferências, existem vários filtros úteis para ignorar coisas como comentários ao executar uma comparação. Embora existam filtros para ignorarAll whitespace
eLeading whitespace
, não hajaTrailing whitespace
filtro para ignorar (isso foi sugerido como uma adição na lista de discussão Meld, mas não está disponível na minha versão).Ignorar o espaço em branco à direita geralmente é muito útil, especialmente ao colaborar, e pode ser adicionado manualmente facilmente com uma simples expressão regular na
Text Filters
guia Preferências do Meld .Eu espero que isso ajude a todos.
fonte
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
em~/.gitconfig
, em seguida, basta resolver os conflitos destacadas em vermelho na panela média e salvar! Deve ser a configuração padrão.$LOCAL $MERGED $REMOTE
é a configuração que uso na maioria das vezes, quando há apenas alguns conflitos para resolver, é excelente e também é o meu padrão.$LOCAL $BASE $REMOTE
realmente se destaca quando há muito o que fazer e você sabe exatamente quais seções de código vêm de qual arquivo; o ancestral de commit compartilhado pode ser um excelente ponto de partida, às vezes o destaque do conflito realmente atrapalha e uma base mais limpa é uma bênção.=
seguinte:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Enquanto a outra resposta estiver correta, aqui está a maneira mais rápida de seguir em frente e configurar o Meld como sua ferramenta visual diff. Basta copiar / colar este:
Agora execute
git difftool
em um diretório e o Meld será iniciado para cada arquivo diferente.Nota lateral: O Meld é surpreendentemente lento na comparação de arquivos CSV, e nenhuma ferramenta de comparação do Linux que encontrei é mais rápida que essa ferramenta do Windows chamada Compare It! (última atualização em 2010).
fonte
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
fila lá também. Este é o "padrão", mas assim que você configurar ummergetool
,difftool
começará a usar a configuração do mergetool como padrão se a configuração do diff não for encontrada. Como a mesclagem geralmente é configurada para passar três arquivos para uma mesclagem de três vias, isso significa que sua janela demeld
diferenças subitamente terá três painéis, o que não faz sentido.Para Windows . Execute estes comandos no Git Bash:
(Atualize o caminho do arquivo Meld.exe se o seu for diferente.)
Para Linux . Execute estes comandos no Git Bash:
Você pode verificar o caminho de Meld usando este comando:
fonte
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
:?Eu prefiro configurar o meld como um comando separado, assim:
Isso o torna semelhante ao script git-meld.pl aqui: https://github.com/wmanley/git-meld
Você pode então apenas correr
fonte
--dir-diff
porção da preferência pessoal.)Para o Windows 10, tive que colocar isso no meu .gitconfig:
Tudo o mais que você precisa saber está escrito nesta super resposta por mattst acima.
PS: Por alguma razão, isso funcionou apenas com o Meld 3.18.x, o Meld 3.20.x me deu um erro.
fonte
Esta é uma resposta que visa principalmente desenvolvedores que usam o Windows, pois a sintaxe do caminho da ferramenta diff difere de outras plataformas.
Eu uso o Kdiff3 como o git mergetool, mas para configurar o git difftool como Meld, instalei a versão mais recente do Meld no Meldmerge.org e adicionei o seguinte ao meu .gitconfig global usando:
Observe que, se você preferir o Sublime Text 3 em vez do Vim padrão como core ditor, poderá adicioná-lo ao arquivo .gitconfig:
Então você adiciona inn Meld como difftool
Observe a barra no cmd acima; no Windows, é necessário.
Também é possível configurar um alias para mostrar o diff atual do git com um opção --dir-diff . Isso listará os arquivos alterados dentro do Meld, o que é útil quando você alterou vários arquivos (um cenário muito comum).
O alias se parece com isso dentro do arquivo .gitconfig, abaixo da seção [alias] :
Para mostrar as alterações que fiz no código, basta digitar o seguinte comando:
A imagem a seguir mostra como esta opção --dir-diff pode mostrar uma lista de arquivos alterados (exemplo):
Então é possível clicar em cada arquivo e mostrar as alterações dentro do Meld.
fonte
Pode ser complicado calcular um diff em sua cabeça a partir das diferentes seções em $ MERGED e aplicá-lo. Na minha configuração, o meld ajuda mostrando essas diferenças visualmente, usando:
Parece estranho, mas oferece um fluxo de trabalho muito conveniente, usando três guias:
na guia 1, você vê (da esquerda para a direita) a alteração que deve fazer na guia 2 para resolver o conflito de mesclagem.
no lado direito da guia 2, você aplica a "alteração que deve fazer" e copia todo o conteúdo do arquivo na área de transferência (usando ctrl-a e ctrl-c).
na guia 3, substitua o lado direito pelo conteúdo da área de transferência. Se tudo estiver correto, você verá agora - da esquerda para a direita - a mesma alteração mostrada na guia 1 (mas com contextos diferentes). Salve as alterações feitas nesta guia.
Notas:
fonte
$BASE
em vez de$MERGED
começar a operação de mesclagem