Git en Windows: ¿Cómo se configura una herramienta de combinación?

346

He intentado msysGit y Git en Cygwin. Ambos funcionan bien por sí mismos y ambos ejecutan gitk y git-gui perfectamente.

Ahora, ¿cómo diablos configuro una herramienta de combinación? (Vimdiff funciona en Cygwin, pero preferiblemente me gustaría algo un poco más fácil de usar para algunos de nuestros compañeros de trabajo amantes de Windows).

Jake
fuente
44
Git Extensions tiene una interfaz de usuario git que tiene una herramienta de fusión bastante buena y fácil de usar de Windows.
KallDrexx
Parece que necesitas TortoiseGit?
Sergei

Respuestas:

304

Para seguir la respuesta de Charles Bailey, aquí está mi configuración de git que usa p4merge (herramienta de combinación de 3 vías multiplataforma gratuita); probado en la instalación de msys Git (Windows):

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

o, desde un shell de Windows cmd.exe, la segunda línea se convierte en:

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

Los cambios (en relación con Charles Bailey):

  • agregado a la configuración global de git, es decir, válido para todos los proyectos de git, no solo el actual
  • el valor de configuración de la herramienta personalizada reside en "mergetool. [tool] .cmd", no en "merge. [tool] .cmd" (tonto, pasé una hora solucionando problemas por los que git seguía quejándose de la herramienta no existente)
  • se agregaron comillas dobles para todos los nombres de archivos para que la herramienta de combinación pueda encontrar archivos con espacios (probé esto en msys Git de Powershell)
  • tenga en cuenta que, de forma predeterminada, Perforce agregará su directorio de instalación a PATH, por lo que no es necesario especificar la ruta completa a p4merge en el comando

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


EDITAR (Feb 2014)

Como señaló @Gregory Pakosz , el último msys git ahora "nativamente" es compatible con p4merge (probado en 1.8.5.2.msysgit.0 ).

Puede mostrar la lista de herramientas compatibles ejecutando:

git mergetool --tool-help

Debería ver p4merge en la lista disponible o válida . Si no, actualiza tu git.

Si p4merge figuraba como disponible , está en su RUTA y solo tiene que configurar merge.tool :

git config --global merge.tool p4merge

Si figuraba como válido , debe definir mergetool.p4merge.path además de merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Lo anterior es una ruta de ejemplo cuando se instaló p4merge para el usuario actual, no en todo el sistema (no necesita derechos de administrador ni elevación de UAC)
  • Aunque ~debería expandirse al directorio de inicio del usuario actual (por lo que, en teoría, la ruta debería ser ~/AppData/Local/Perforce/p4merge.exe), esto no funcionó para mí
  • Aún mejor hubiera sido aprovechar una variable de entorno (p $LOCALAPPDATA/Perforce/p4merge.exe. Ej. ), Git no parece estar expandiendo las variables de entorno para rutas (si sabe cómo hacer que esto funcione, hágamelo saber o actualice esta respuesta)
Milan Gardian
fuente
Hmm, probando esto, la primera configuración funciona bien, la siguiente solo muestra el texto de ayuda para git config. No estoy seguro de por qué.
Danny Staple, el
1
Lo tengo, esas citas simples me parecen sospechosas. Simplemente duplique esto y funcionan.
Danny Staple, el
13
la configuración mergetool.p4merge.cmdya no funcionará ya que Git ha comenzado a tratar de admitir p4merge, mira libexec/git-core/git-mergetool--lib. en su lugar usa directamentemergetool.p4merge.path
Gregory Pakosz
55
Tuve que poner el camino completo y escapar de las comillas dobles:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty
21
Esto lo hizo por mí: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'en la máquina con Windows 7
Dan P.
88

configurar mergetool.p4merge.cmd ya no funcionará ya que Git ha comenzado a tratar de admitir p4merge, consulte libexec / git-core / git-mergetool--lib.así que solo necesitamos especificar la ruta de mergetool para git, por ejemplo, p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Entonces funcionará.

daizuozhuo
fuente
1
Funciona con Beyond Compare 3 también. Simplemente use la ruta a BComp.exe en su lugar. ¡Gracias!
Richard Anthony Hein
44
Me doy cuenta de que este es un hilo viejo, pero no puedo hacer que ese camino funcione. Estoy un poco confundido acerca de cómo se supone que se debe escapar la ruta dada la interacción de cmd / msys ... EDIT ¡ Cambiar a comillas dobles lo arregló!
Rustavore
Gracias Gitninja! Tenga en cuenta que puede escribir esto en Git Bash, pero si usa el símbolo del sistema debe cambiar la comilla simple a la comilla doble
Hải Phong
61

Estoy usando Portable Git en WinXP (¡funciona de maravilla!), Y necesitaba resolver un conflicto que surgió en la ramificación. De todas las gui que verifiqué, KDiff3 demostró ser la más transparente de usar.

Pero encontré las instrucciones que necesitaba para que funcionara en Windows en esta publicación de blog , instrucciones que difieren ligeramente de los otros enfoques enumerados aquí. Básicamente equivalía a agregar estas líneas a mi .gitconfigarchivo:

[merge]
    tool = kdiff3

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

¡Funciona muy bien ahora!

Dɑvïd
fuente
13
en mi PC Win7, tuve que usar path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(observe las barras diagonales dobles)
Someone Somewhere
Recibí un error como este "La combinación de herramientas de diferencias no está disponible como 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork
¿Sabes si hay una diferencia con el orden en que se agrega cada sección? Quiero decir, ¿si [fusionar] sería después de [mergetool]?
Samuel
20

Bajo Cygwin, lo único que funcionó para mí es lo siguiente:

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)"'

Además, me gusta desactivar el mensaje de solicitud de difftool:

git config --global difftool.prompt false
máquina de montaje
fuente
16

git mergetool es totalmente configurable para que pueda elegir su herramienta favorita.

La documentación completa está aquí: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

En resumen, puede establecer una herramienta de combinación predeterminada configurando la variable de configuración del usuario merge.tool.

Si la herramienta de combinación es una de las admitidas de forma nativa, solo tiene que establecer mergetool.<tool>.pathla ruta completa de la herramienta (reemplace <tool>por lo que ha configurado merge.toolpara ser.

De lo contrario, puede establecer mergetool.<tool>.cmdun bit de shell para evaluar en tiempo de ejecución con las variables de shell $BASE, $LOCAL, $REMOTE, $MERGEDestablecidas en los archivos apropiados. Debe tener un poco de cuidado con el escape si edita directamente un archivo de configuración o establece la variable con el git configcomando.

Algo como esto debería darle el sabor de lo que puede hacer ('mymerge' es una herramienta ficticia).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Una vez que haya configurado su herramienta de fusión favorita, es simplemente una cuestión de ejecución git mergetoolcada vez que tenga conflictos que resolver.

La herramienta p4merge de Perforce es una herramienta de fusión independiente bastante buena.

CB Bailey
fuente
8

Para más allá de comparar en Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
desarrollador747
fuente
2
Usé estos comandos pero estoy usando WinMerge en lugar de Beyond Compare.
Brent Keller
6

Parece que las versiones más nuevas de git admiten p4merge directamente, por lo que

git config --global merge.tool p4merge

debería ser todo lo que necesita, si p4merge.exe está en su camino. No es necesario configurar cmd o ruta.

Friederbluemle
fuente
Esta es la clave. Después de instalar p4merge y configurar mergetool.p4merge.path en la ubicación exacta, aún no funcionó. Agregar la carpeta de instalación a la ruta funcionó.
RichardM
5

Como ya se respondió aquí (y aquí y aquí ), mergetool es el comando para configurar esto. Para una interfaz gráfica agradable, recomiendo kdiff3 (GPL).

hlovdal
fuente
4

Tuve que eliminar las citas adicionales usando msysGit en Windows 7, no estoy seguro de por qué.

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

Si está haciendo esto a través de cygwin, es posible que necesite 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`'
idbrii
fuente
3

Bah, esto finalmente funcionó para mí (Windows 7 + Cygwin + TortoiseMerge):

En .git / config:

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

¡Gracias a los carteles anteriores por el consejo de usar Cygpath!

Nathan McDaniel
fuente
3

Yo uso una aplicación llamada WinMerge ( http://winmerge.org/ ) información de su manual ( http://manual.winmerge.org/CommandLine.html )

Este es el script bash que uso de la mergetooldirectiva a través de.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"

Básicamente, el bash representa cuando el resultado de la diferencia en un archivo vacío y crea un nuevo archivo temporal en la ubicación correcta.

xero
fuente
3

Encontré dos formas de configurar " SourceGear DiffMerge " como difftool y mergetool en github Windows.

Los siguientes comandos en una ventana del símbolo del sistema actualizarán su .gitconfig para configurar GIT usando 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\"'

[ O ]

Agregue las siguientes líneas a su .gitconfig. Este archivo debe estar en su directorio de inicio en 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\"
viñedo
fuente
1

Es posible que desee agregar estas opciones también:

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

Además, no sé por qué, pero las citas y el corte de la respuesta de Milan Gardian me arruinaron las cosas.

Roberto
fuente
1

Si alguien quiere usar gvim como su herramienta diff en TortoiseGit, entonces esto es lo que necesita ingresar en el ingreso de texto para la ruta a la herramienta diff externa:

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

Para IntelliJ IDEA (Community Edition) Configuración de mergetool de 3 vías git mergetool en entorno 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

~ / Winpath.sh es para convertir rutas a Windows en msys y se toma de la pregunta de conversión de ruta msys en 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
fuente
0

Si tiene problemas para abrir p4merge desde SourceTree, busque su archivo de configuración local llamado config en MyRepo.git y elimine cualquier configuración de combinación. En mi caso, estaba tratando de abrir Meld, que acabo de desinstalar

Kautsky Lozano
fuente