Configurando a ferramenta diff com .gitconfig

159

Como eu configuro o Git para usar uma ferramenta diferente para diferenciar o arquivo .gitconfig?

Eu tenho isso no meu .gitconfig:

[diff]
    tool = git-chdiff #also tried /bin/git-chdiff

Não funciona; apenas abre o diff da linha de comando regular. Quando eu faço

export GIT_EXTERNAL_DIFF=git-chdiff

então git diffabrirá a ferramenta diffing externa (então eu sei que o script da ferramenta diff externa funciona bem). Tenho algo errado com a minha configuração .gitconfig para a ferramenta diff?

ryanzec
fonte

Respostas:

140

O Git oferece uma variedade de difftools pré-configurados "prontos para uso" (kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, difuse, opendiff, p4merge e araxis) e também permite que você para especificar o seu. Para usar um dos difftools pré-configurados (por exemplo, "vimdiff"), adicione as seguintes linhas ao seu ~/.gitconfig:

[diff]
    tool = vimdiff

Agora, você poderá executar o "git difftool" e usar sua ferramenta preferida.

Por outro lado, especificar seu próprio difftool exige um pouco mais de trabalho, consulte Como visualizo a saída 'git diff' com minha ferramenta / visualizador preferido de diff?

Fredrik Pihl
fonte
O primeiro link está quebrado. Parece que o domínio mudou de .compara .org. Eu sou capaz de navegar jeetworks.org/software
RBT
1
O que você quer dizer com um difftool pré-configurado "pronto para uso"? Para configurar uma ferramenta de comparação externa "winMerge", que não está na sua lista, tive que fazer a mesma configuração que você mencionou na sua postagem e tudo começou a funcionar sem nenhuma configuração adicional. Isso significa que o git também suporta o "winMerge" imediatamente, porque, pelo que pude entender pela sua postagem, ele exige algum trabalho / configuração / configuração extra para configurar uma ferramenta diff que não é suportada de imediato caixa por git.
RBT 23/03
169

Uma maneira adicional de fazer isso (na linha de comando):

git config --global diff.tool tkdiff
git config --global merge.tool tkdiff
git config --global --add difftool.prompt false

As duas primeiras linhas definirão o difftool e o mergetool para tkdiff- altere isso de acordo com suas preferências. A terceira linha desativa o prompt irritante, portanto, sempre que você o pressiona git difftool, inicia automaticamente o difftool.

Omer Dagan
fonte
11
Eu fiz, git config --global diff.tool diffmergemas quando eu fiz git diff myfile.txtisso ainda me deu o diff padrão do unix
anfíbio
Talvez você tenha uma configuração local que defina outra ferramenta diff?
Omer Dagan
1
talvez você precise passar parâmetros corretos para DiffMerge: este link explica como fazê-lo para a fusão: link: nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
rptr
5
@ anfphient: tente a ferramenta git diff myfile.txt para usar a ferramenta.
JBWilkinson #
72

Outros responderam 99% disso, mas resta apenas um passo. (Minha resposta virá do OS X, portanto, você precisará alterar os caminhos do arquivo de acordo.)

Você faz essas alterações no seu ~/.gitconfig:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = /Applications/Diffmerge.app/Contents/MacOS/diffmerge $LOCAL $REMOTE

Isso irá corrigir a ferramenta diff. Você também pode corrigir isso sem editar ~/.gitconfigdiretamente inserindo estes comandos no terminal:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd "/Applications/DiffMerge.appContents/MacOS/diffmerge \$LOCAL \$REMOTE"

O 1% que todo mundo deixou de mencionar é que ao usar isso, você não pode simplesmente executar git diff myfile.txt; você precisa correr git difftool myfile.txt.

tgoza
fonte
23
Votado nos últimos 1%. Não há nada tão satisfatório como um prego martelado totalmente;)
Titou
1
Existe alguma maneira de torná-lo a ferramenta padrão?
math0ne
6
Ótimo, você está perdendo o passo git config --global --add difftool.prompt false, no entanto. ;)
Suma
36

Aqui está a parte do meu ~ / .gitconfig onde eu configuro as ferramentas diff e merge. Eu gosto de diferenciar pelo SourceGear. (Gosto muito, de fato).

[merge]
        tool = diffmerge
[mergetool "diffmerge"]
        cmd = "diffmerge --merge --result=\"$MERGED\" \"$LOCAL\" \"$(if test -f \"$BASE\"; then echo \"$BASE\"; else echo \"$LOCAL\"; fi)\" \"$REMOTE\""
        trustExitCode = false
[diff]
        tool = diffmerge
[difftool "diffmerge"]
        cmd = diffmerge \"$LOCAL\" \"$REMOTE\"

Então, veja bem, você está definindo uma ferramenta chamada "diffmerge" na [difftool "diffmerge"]linha. Então, eu estou configurando a ferramenta "diffmerge" como o padrão na [diff] tool =seção.

Obviamente, tenho o comando "diffmerge" no meu caminho, aqui. Caso contrário, eu precisaria fornecer um caminho completo para o executável.

Dan Ray
fonte
Sem todas as barras invertidas que escapam:diffmerge --merge --result="$MERGED" "$LOCAL" "$(if test -f "$BASE"; then echo "$BASE"; else echo "$LOCAL"; fi)" "$REMOTE"
Tim Lovell-Smith
1
Eu vou com o mais simplesdiffmerge --merge --result="$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Tim Lovell-Smith
E possui um script 'sgdm_cygwin.sh' útil para tornar a versão do Windows fácil de usar no Cygwin.
thoni56
Então você pode fazer ln-s <pathtodiffmerge>/sgdm_cygwin.sh /usr/local/bin/diffmergee está pronto para usar a configuração acima. Bem como diffmergediretamente da linha de comando do cygwin com os caminhos do cygwin.
27616 thiago56
Seria sgdm.exehoje em dia
kzu 26/08/19
22

Reproduzindo minha resposta a partir deste tópico, que era mais específico para definir além da comparação como ferramenta diff para o Git. Todos os detalhes que compartilhei são igualmente úteis para qualquer ferramenta diff em geral, portanto, compartilhe-a aqui:

O primeiro comando que executamos é o seguinte:

git config --global diff.tool bc3

O comando acima cria a entrada abaixo .gitconfigencontrada no %userprofile%diretório:

[diff]
    tool = bc3

Em seguida, execute o comando abaixo (a execução deste comando é redundante nesse caso específico e é necessária apenas em alguns casos especializados. Você o conhecerá em breve ):

git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"

O comando acima cria a entrada abaixo no .gitconfigarquivo:

[difftool "bc3"]
    path = c:/program files/Beyond Compare 3/bcomp.exe

O importante a saber aqui é a chave bc3. Essa é uma chave bem conhecida do git, correspondente a uma versão específica das ferramentas de comparação conhecidas disponíveis no mercado ( bc3corresponde à terceira versão da ferramenta Beyond Compare). Se você quiser ver todas as chaves predefinidas, execute o git difftool --tool-helpcomando git bash. Ele retorna abaixo da lista:

vimdiff
vimdiff2
vimdiff3
araxis
bc
bc3
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
gvimdiff
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
opendiff
p4merge
tkdiff
winmerge
xxdiff

Você pode usar qualquer uma das chaves acima ou definir uma chave personalizada. Se você deseja configurar uma nova ferramenta completamente (ou uma versão recém-lançada da ferramenta conhecida) que não mapeia nenhuma das chaves listadas acima, você pode mapeá-la para qualquer uma das chaves listadas acima ou para uma nova chave personalizada de sua preferência.

E se você tiver que configurar uma ferramenta de comparação que seja

  • Absolutamente novo no mercado

OU

  • Foi lançada uma nova versão de uma ferramenta bem conhecida existente, que não é mapeada para nenhuma chave predefinida no git ?

Como no meu caso, eu instalei além do compare 4. beyond compare é uma ferramenta bem conhecida do git, mas sua versão 4 não é mapeada para nenhuma das chaves existentes por padrão. Portanto, você pode seguir qualquer uma das abordagens abaixo:

  1. Posso mapear além da ferramenta comparar 4 com a chave já existente, bc3que corresponde à versão além da comparação 3. Eu não tinha além da versão 3 no meu computador, então não me importei. Se eu quisesse, poderia tê-lo mapeado para qualquer uma das teclas predefinidas na lista acima também, por exemplo examdiff.

    Se você mapear a versão conhecida das ferramentas para a chave já existente / conhecida apropriada, não será necessário executar o segundo comando, pois o caminho de instalação já é conhecido pelo git .

    Por exemplo, se eu tivesse instalado além da versão 3 na minha caixa, a configuração abaixo no meu .gitconfigarquivo seria suficiente para continuar:

    [diff]
    tool = bc3
    

    Mas se você deseja alterar a ferramenta associada padrão, acaba mencionando o pathatributo separadamente, para que o git conheça o caminho de onde o exe da nova ferramenta deve ser iniciado. Aqui está a entrada que raposas git lançam além da comparação 4. Observe o caminho do exe:

    [difftool "bc3"]
    path = c:/program files/Beyond Compare 4/bcomp.exe
    
  2. A abordagem mais limpa é definir completamente uma nova chave para a nova ferramenta de comparação ou uma nova versão de uma ferramenta conhecida. Como no meu caso, defini uma nova chave bc4para que seja fácil de lembrar. Nesse caso, você precisa executar dois comandos no total, mas o seu segundo comando não definirá o caminho do executável da sua nova ferramenta. Em vez disso, você deve definir o cmdatributo para sua nova ferramenta, como mostrado abaixo:

    git config --global diff.tool bc4
    
    git config --global difftool.bc4.cmd "\"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"\$LOCAL\" -d \"\$REMOTE\""
    

    A execução dos comandos acima cria entradas abaixo no seu .gitconfigarquivo:

    [diff]
    tool = bc4
    [difftool "bc4"]
    cmd = \"C:\\Program Files\\Beyond Compare 4\\bcomp.exe\" -s \"$LOCAL\" -d \"$REMOTE\"
    

Eu recomendo fortemente que você siga a abordagem nº 2 para evitar qualquer confusão no futuro.

RBT
fonte
16

Adicionar um dos blocos abaixo funciona para eu usar o KDiff3 nos meus ambientes de desenvolvimento Windows e Linux. É uma ferramenta consistente e agradável de comparação e mesclagem entre plataformas.

Linux

[difftool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = /usr/bin/kdiff3
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3

janelas

[difftool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[difftool]
    prompt = false
[diff]
    tool = kdiff3
[mergetool "kdiff3"]
    path = C:/Progra~1/KDiff3/kdiff3.exe
    trustExitCode = false
[mergetool]
    keepBackup = false
[merge]
    tool = kdiff3
humor
fonte
Você encontrou uma maneira de criar um único arquivo .gitconfig de plataforma cruzada que especifica os caminhos corretos condicionalmente para linux e windows?
Jerry Asher
1
Honestamente, eu mudei para combinar em todos os lugares, e isso parece funcionar.
Moodboom 01/10/19
Existe um motivo para definir trustExitCode = false? Pelo meu entendimento, se false for definido, o git ignorará o código de saída diferente de zero da sua ferramenta. Portanto, se sua ferramenta de esmagamento git pensar erroneamente que a fusão é bem-sucedida. Mas pode haver uma razão para defini-la como falsa, por favor, explique.
Apollo
Acredito que trustExitCode = falsefará com que o git pergunte se a fusão foi bem-sucedida, em vez de confiar se a ferramenta saiu com um status verdadeiro ou falso.
Moodboom 22/01/19
4

Se você quiser ter uma opção para usar várias ferramentas diff, adicione um alias ao .gitconfig

[alias]
    kdiff = difftool --tool kdiff3
Alexander Katz
fonte
para mencionar a --toolopção. Graças
itMaxence
0

Consulte Microsoft vscode-tips-and-truques . Basta executar estes comandos no seu terminal:

git config --global merge.tool code

Mas, primeiro, você precisa adicionar um codecomando ao seu PATH. insira a descrição da imagem aqui

sudoz
fonte
0

No Windows, precisamos executar o $git difftool --tool-helpcomando para ver as várias opções, como:

    'git difftool --tool=<tool>' may be set to one of the following:
                    vimdiff
                    vimdiff2
                    vimdiff3

    The following tools are valid, but not currently available:
                    araxis
                    bc
                    bc3
                    codecompare
                    deltawalker
                    diffmerge
                    diffuse
                    ecmerge
                    emerge
                    examdiff
                    gvimdiff
                    gvimdiff2
                    gvimdiff3
                    kdiff3
                    kompare
                    meld
                    opendiff
                    p4merge
                    tkdiff
                    winmerge
                    xxdiff
Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

e podemos adicionar qualquer um deles (por exemplo, winmerge) como

$  git difftool --tool=winmerge

Para configurar o notepad ++ para ver os arquivos antes de confirmar:

 git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

e usar $ git commitabrirá as informações de confirmação no bloco de notas ++

Goyal Vicky
fonte