Git no Windows: como você configura uma ferramenta de fusão?

346

Eu tentei msysGit e Git no Cygwin. Ambos funcionam muito bem por si mesmos e executam perfeitamente o gitk e o git-gui.

Agora, como diabos eu configuro uma ferramenta de fusão? (Vimdiff funciona com Cygwin, mas de preferência eu gostaria de algo um pouco mais amigável para alguns de nossos colegas de trabalho que adoram Windows.)

Jake
fonte
4
O Git Extensions possui uma interface do usuário do git que possui uma ferramenta de fusão bastante boa e amigável ao Windows.
precisa saber é o seguinte
Parece que você precisa do TortoiseGit?
Sergei

Respostas:

304

Para acompanhar a resposta de Charles Bailey, aqui está a minha configuração do git que usa o p4merge ( ferramenta gratuita de mesclagem de 3 vias entre plataformas); testado na instalação do msys Git (Windows):

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

ou, a partir de um shell do Windows cmd.exe, a segunda linha se torna:

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

As mudanças (relativas a Charles Bailey):

  • adicionado à configuração global do git, ou seja, válida para todos os projetos git, não apenas o atual
  • o valor de configuração da ferramenta personalizada reside em "mergetool. [tool] .cmd", não em "mesclar. [tool] .cmd" (bobo, passei uma hora solucionando problemas por que o git continuava reclamando da ferramenta inexistente)
  • adicionamos aspas duplas a todos os nomes de arquivos para que arquivos com espaços ainda possam ser encontrados pela ferramenta de mesclagem (testei isso no msys Git do Powershell)
  • observe que, por padrão, o Perforce adiciona seu diretório de instalação ao PATH, portanto, não é necessário especificar o caminho completo para o p4merge no comando

Faça o download: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDIT (fevereiro de 2014)

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

Você pode exibir a lista de ferramentas suportadas executando:

git mergetool --tool-help

Você deve ver o p4merge na lista disponível ou válida . Caso contrário, atualize seu git.

Se o p4merge foi listado como disponível , ele está no seu PATH e você só precisa definir o merge.tool :

git config --global merge.tool p4merge

Se ele foi listado como válido , é necessário definir mergetool.p4merge.path além de merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • O exemplo acima é um caminho de exemplo quando o p4merge foi instalado para o usuário atual, não em todo o sistema (não precisa de direitos de administrador ou elevação do UAC)
  • Embora ~deva expandir para o diretório inicial do usuário atual (portanto, em teoria, o caminho deve ser ~/AppData/Local/Perforce/p4merge.exe), isso não funcionou para mim
  • Melhor ainda seria tirar proveito de uma variável de ambiente (por exemplo $LOCALAPPDATA/Perforce/p4merge.exe), o git não parece estar expandindo variáveis ​​de ambiente para caminhos (se você souber como fazer isso funcionar, informe-me ou atualize esta resposta)
Milan Gardian
fonte
Hmm - tentando fazer isso - a primeira configuração funciona bem, a próxima apenas exibe o texto de ajuda da configuração do git. Não sei por que.
Danny Staple
11
Entendi - essas aspas simples me parecem suspeitas. Apenas dobre isso e eles funcionam.
Danny Staple
13
A configuração mergetool.p4merge.cmdnão funcionará mais desde que o Git começou a tentar dar suporte ao p4merge, consulte libexec/git-core/git-mergetool--lib. em vez disso, ele usa diretamentemergetool.p4merge.path
Gregory Pakosz
5
Tinha que colocar o caminho completo e escapar aspas duplas:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty 13/03/12
21
Isso fez isso por mim: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'na máquina com Windows 7
Dan P.
88

A configuração do mergetool.p4merge.cmd não funcionará mais desde que o Git começou a tentar dar suporte ao p4merge, consulte libexec / git-core / git-mergetool--lib.so, apenas precisamos especificar o caminho do mergetool 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.

daizuozhuo
fonte
11
Funciona com o Beyond Compare 3 também. Basta usar o caminho para o BComp.exe. Obrigado!
Richard Anthony Hein
4
Sei que esse é um tópico antigo, mas não consigo fazer esse caminho funcionar. Estou um pouco confuso sobre como o caminho deve ser escapado, dada a interação de cmd / msys ... EDIT Mudar para aspas duplas corrigiu isso!
Rustavore
Obrigado Gitninja! Nota que você pode digitar isso em Git Bash, mas se você usar o comando prompt você deve alterar a única citação ao aspas
Haiphong
61

Estou usando o Portable Git no WinXP (funciona um prazer!) E precisava resolver um conflito que surgiu na ramificação. De todas as GUI que verifiquei, o KDiff3 provou ser o mais transparente de usar.

Mas encontrei as instruções necessárias para fazê-lo funcionar no Windows nesta postagem do blog , instruções que diferem um pouco das outras abordagens listadas aqui. Basicamente, foi somando essas linhas ao meu .gitconfigarquivo:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Trabalhando bem agora!

Dɑvïd
fonte
13
no meu PC Win7, eu tive que usar path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(observe as barras duplas)
Someone Somewhere
Eu recebi um erro como este "O meld da ferramenta diff não está disponível como 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork 9/17/17
Você sabe se há uma diferença na ordem em que cada seção é adicionada. Quero dizer, se [mesclar] seria depois de [fusão]
Samuel
20

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, eu gosto de desativar a mensagem de prompt do difftool:

git config --global difftool.prompt false
splicer
fonte
16

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

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

Em resumo, você pode definir uma ferramenta de fusão padrão configurando a variável de configuração do usuário merge.tool.

Se a ferramenta de mesclagem é uma das suportadas nativamente por ela, basta definir mergetool.<tool>.patho caminho completo da ferramenta (substitua <tool>pelo que você configurou merge.toolpara ser.

Caso contrário, você pode definir mergetool.<tool>.cmdum pouco de shell para ser avaliado em tempo de execução com as variáveis ​​de shell $BASE, $LOCAL, $REMOTE, $MERGEDdefinidas nos arquivos apropriados. Você precisa ter um pouco de cuidado com o escape, se editar diretamente um arquivo de configuração ou definir a variável com o git configcomando

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 sua ferramenta de mesclagem favorita, basta executar git mergetoolsempre que houver conflitos a serem resolvidos.

A ferramenta p4merge da Perforce é uma ferramenta de mesclagem independente bastante boa.

CB Bailey
fonte
8

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"
developer747
fonte
2
Eu usei esses comandos, mas estou usando o WinMerge em vez do Beyond Compare.
Brent Keller #
6

Parece que as versões mais recentes do git suportam diretamente o p4merge, então

git config --global merge.tool p4merge

deve ser tudo o que você precisa, se o p4merge.exe estiver no seu caminho. Não é necessário configurar o cmd ou o caminho.

friederbluemle
fonte
Isso é fundamental. Depois de instalar o p4merge e definir o mergetool.p4merge.path para o local exato, ele ainda não funcionou. A adição da pasta de instalação ao caminho funcionou.
RichardM
5

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

hlovdal
fonte
4

Eu tive que largar a citação extra usando o msysGit no Windows 7, não sei por quê.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Mike Glenn
fonte
3

Se você está fazendo isso através do cygwin, pode ser necessário usar o 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`'
idbrii
fonte
3

Bah, isso finalmente funcionou para mim (Windows 7 + Cygwin + TortoiseMerge):

Em .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

Obrigado aos pôsteres anteriores pela dica de usar o cygpath!

Nathan McDaniel
fonte
3

eu uso um aplicativo chamado WinMerge ( http://winmerge.org/ ) informações do manual ( http://manual.winmerge.org/CommandLine.html )

este é o script bash que eu uso da mergetooldiretiva 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, o bash é responsável pelo resultado do diff em um arquivo vazio e cria um novo arquivo temporário no local correto.

xero
fonte
3

Encontrei duas maneiras de configurar o " SourceGear DiffMerge " como difftool e o mergetool no github Windows.

Os seguintes comandos em uma janela do prompt de comando atualizarão o seu .gitconfig para configurar o GIT usando o 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 arquivo deve estar no diretório inicial 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\"
vinha
fonte
1

Você também pode adicionar essas 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 por que, mas a citação e a barra da resposta de Milan Gardian estragaram tudo para mim.

Roberto
fonte
1

Se alguém quiser usar o gvim como sua ferramenta diff no TortoiseGit, é isso que você precisa inserir na entrada de texto do caminho para a ferramenta diff externa:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Attila Szeremi
fonte
1

Para a configuração do git de 3 vias do IntelliJ IDEA (Community Edition), em 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 o Windows no msys e é retirado da pergunta de conversão de caminho 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 "$@" 
Usman Saleem
fonte
0

Se você está tendo problemas para abrir o p4merge no SourceTree, procure pelo arquivo de configuração local denominado config em MyRepo.git e exclua qualquer configuração de mesclagem. No meu caso, ele estava tentando abrir o Meld, que eu acabei de desinstalar

Kautsky Lozano
fonte