Git no Windows: como é que configura um mergetool?

Tentei msysGit e Git em Cygwin. Ambos funcionam muito bem em si mesmos e tanto gitk e git-gui perfeitamente.

Agora, como é que configuro um mergetool? (Vimdiff trabalha na Cygwin, mas de preferência eu gostaria de algo um pouco mais amigável para alguns de nossos colegas amantes de janelas.)

Author: danwellman, 2009-01-09

18 answers

Para dar seguimento à resposta de Charles Bailey, aqui está a minha configuração git que está a usar p4merge (ferramenta livre de junção de plataforma 3way); testada no msys Git (Windows) install:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

Ou, a partir de um cmd windows.exe shell, a segunda linha passa a ser:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
As mudanças (em relação a Charles Bailey):
  • adicionado à configuração global do git, ou seja, válido para todos os projectos git e não apenas para o actual
  • o valor de configuração personalizado da ferramenta reside em "mergetool.[ferramenta].cmd", não "merge".[ferramenta].cmd " (tolo eu, passou uma hora solucionando por que o git continuava reclamando de ferramenta não existente)
  • adicionou aspas duplas para todos os nomes dos ficheiros de modo a que os ficheiros com espaços possam ainda ser encontrados pela ferramenta de junção (eu testei isto no msys Git do Powershell)
  • note que, por omissão, o Perforce irá adicionar a sua pasta de instalação à PATH, pelo que não é necessário indicar a localização completa do p4merge no comando

Telecarregamento: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (Fev 2014)

Como apontado por @Gregory Pakosz, mais recente msys git agora "nativamente" suporta p4merge (testado em 1.8.5.2.msysgit.0).

Poderá mostrar uma lista de ferramentas suportadas se executar:

git mergetool --tool-help

Deve ver p4merge na lista disponível ou válida. Se não, por favor, actualize o seu git.

Se o p4merge foi listado como disponível, está no seu locale só tem de definir a junção.ferramenta:

git config --global merge.tool p4merge

Se foi listado como válido, tem de definir mergetool.p4merge.localização para além da junção de .ferramenta:

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • o caminho acima é um exemplo quando p4merge foi instalado para o usuário atual, não em todo o sistema (não precisa de direitos de administração ou UAC elevação)
  • embora ~ deva expandir-se para o directório do utilizador actual (por isso, em teoria, o caminho deve ser ~/AppData/Local/Perforce/p4merge.exe), isto não funcionou para mim
  • ainda melhor teria sido tirar partido de uma variável de ambiente (por exemplo $LOCALAPPDATA/Perforce/p4merge.exe), o git não parece estar a expandir variáveis de ambiente para caminhos (se souber como pôr isto a funcionar, por favor avise-me ou actualize esta resposta)
 282
Author: Milan Gardian, 2017-05-23 11:54:47

A definir o mergetool.p4merge.cmd não funciona mais desde o Git começou a tentar apoiar p4merge, consulte libexec/git-core/git-mergetool--lib.por isso só temos de especificar o mergetool caminho para o git,por exemplo, o p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Então vai funcionar.
 85
Author: daizuozhuo, 2012-05-03 14:00:48
Estou a usar Git portátil no WinXP.), e precisava resolver um conflito que surgiu em ramificação. De todas as gui que verifiquei, o KDiff3 provou ser o mais transparente a usar.

Mas eu encontrei as instruções que eu precisava para fazê-lo funcionar no Windows em este post, instruções que diferem ligeiramente das outras abordagens listadas aqui. Basicamente, foi adicionado estas linhas ao meu ficheiro .gitconfig:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false
A trabalhar bem agora!
 55
Author: Dɑvïd, 2011-04-03 12:28:32

Sob Cygwin, a única coisa que funcionou para mim é a seguinte:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
Além disso, gosto de desligar a mensagem imediata para o difftool:
git config --global difftool.prompt false
 19
Author: splicer, 2010-11-10 23:38:32

git mergetool é totalmente configurável para que você possa escolher a sua ferramenta favorita.

A documentação completa está aqui: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

Em resumo, poderá definir uma ferramenta de junção por omissão, definindo a variável de configuração do Utilizador merge.tool.

Se a ferramenta de junção for uma das que é suportada nativamente por ela, só terá de definir mergetool.<tool>.path a localização completa da ferramenta (substituir <tool> pelo que configurou merge.tool para ser.

Caso contrário, poderá definir mergetool.<tool>.cmd para um pouco de linha de comandos a ser nivelado no tempo de execução com as variáveis de linha de comandos $BASE, $LOCAL, $REMOTE, $MERGED definidas para os ficheiros apropriados. Tem de ter um pouco de cuidado com a fuga, quer edite directamente um ficheiro de configuração ou defina a variável com o comando git config.

[[11]algo assim deve dar o sabor do que você pode fazer ('mymerge' é uma ferramenta fictícia).
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
Depois de configurar a sua ferramenta de junção favorita, é apenas uma questão de correr. sempre que tiver conflitos para resolver.

A ferramenta p4merge do Perforce é uma boa ferramenta de junção autônoma.

 16
Author: CB Bailey, 2009-01-08 21:37:02

Parece que as versões mais recentes do git suportam o p4merge directamente, por isso

git config --global merge.tool p4merge

Deve ser tudo o que precisa, se p4merge.a exe está no teu caminho. Não é necessário configurar o cmd ou o caminho.

 6
Author: friederbluemle, 2013-06-11 06:02:07

Para além da comparação no Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
 6
Author: developer747, 2014-03-25 17:56:42

Como já foi respondido aqui (e aqui e aqui ), o mergetool é o comando para configurar isto. Para uma interface gráfica, recomendo o kdiff3 (GPL).

 5
Author: hlovdal, 2017-05-23 12:26:07

Tive de deixar cair a citação extra usando o msysGit no windows 7, não sei porquê.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
 4
Author: Mike Glenn, 2009-08-02 02:04:20

Se está a fazer isto através de cygwin, pode precisar de usar cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
 3
Author: idbrii, 2010-03-30 17:39:15

Bah, isto Finalmente funcionou para mim (Windows 7 + Cygwin + TortoiseMerge):

Entra .git/config:
cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
Graças aos cartazes anteriores para a dica usar cygpath!
 3
Author: Nathan McDaniel, 2011-01-13 15:08:50

Uso uma aplicação chamada WinMerge ( http://winmerge.org/ informação do manual deles ( http://manual.winmerge.org/CommandLine.html )

Este é o script bash que eu uso da Directiva mergetool via .gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

Basicamente a bash contabiliza quando o resultado da diferença num ficheiro vazio e cria um novo ficheiro temporário na localização correcta.

 3
Author: xero, 2012-12-20 22:40:31

Encontrei duas formas de configurar " SourceGear DiffMerge " como difftool e mergetool nas janelas do github.

Os seguintes comandos numa janela da linha de comandos irão actualizar o seu .gitconfig para configurar git use DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[OU]

Adicione as seguintes linhas ao seu .gitconfig. Este ficheiro deverá estar na sua pasta pessoal em C:\Users\UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
 2
Author: vineel, 2017-02-17 10:52:38

Também pode querer adicionar estas opções:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
Além disso, não sei porquê, mas a citação e o corte da resposta do Milan Gardian estragaram tudo para mim.
 1
Author: Roberto, 2014-05-04 21:42:06

Se alguém quiser usar o gvim como sua ferramenta de diferenças no TortoiseGit, então é isto que você precisa para introduzir na entrada de texto para a localização da ferramenta de diferenças externas:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
 1
Author: Attila Szeremi, 2014-06-24 12:57:13

Para o IntelliJ IDEA (edição comunitária) configuração do git em rede 3-way no ambiente Windows(~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Msys

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

O ~/winpath.sh é converter caminhos para janelas no msys e é retirado de questão de conversão de caminhos do msys no stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 
 1
Author: Usman Saleem, 2017-05-23 12:34:29

Para configurar o p4merge, instalado usando o chocolatey nas janelas, tanto para a junção como para o diff, dê uma vista de olhos aqui: https://gist.github.com/CamW/88e95ea8d9f0786d746a

 0
Author: CamW, 2015-01-20 06:15:30

Se tiver problemas em abrir o p4merge a partir do SourceTree, procure o seu ficheiro de configuração local chamado config sob o MyRepo.git e remove qualquer configuração de junção. No meu caso, estava a tentar abrir a fusão que acabei de desinstalar.

 0
Author: Kautsky Lozano, 2016-08-17 16:21:58