Git en Windows: ¿cómo configurar una herramienta de mezcla?

He probado msysGit y Git en Cygwin. Ambos funcionan bien por sí mismos y ambos ejecutan gitk y git-gui a la perfección.

¿Cómo diablos configuro una herramienta de combinación? (Vimdiff trabaja 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.)

Para dar seguimiento a la respuesta de Charles Bailey, aquí está mi configuration de git que usa p4merge ( herramienta gratuita de combinación de 3 vías multiplataforma); probado en la installation 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 (relativos a Charles Bailey):

  • agregado a la configuration global de git, es decir, válido para todos los proyectos de git, no solo el actual
  • el valor de configuration de la herramienta personalizada reside en "mergetool. [herramienta] .cmd", no "fusionar. [herramienta] .cmd" (me parece tonto, pasé una hora solucionando problemas por qué git se quejaba continuamente de una herramienta no existente)
  • se agregaron comillas dobles para todos los nombres de files para que los files con espacios aún se puedan encontrar mediante la herramienta de fusión (lo probé en msys Git de Powershell)
  • tenga en count que, de forma pnetworkingeterminada, Perforce agregará su directory de installation a PATH, por lo que no es necesario especificar la ruta completa a p4merge en el command

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


EDITAR (feb 2014)

Como señaló @Gregory Pakosz , la última versión de msys git ahora es "nativamente" compatible con p4merge (probado en 1.8.5.2.msysgit.0 ).

Puede mostrar la list de herramientas compatibles ejecutando:

 git mergetool --tool-help 

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

Si p4merge fue listdo como disponible , está en tu PATH y solo tienes que configurar merge.tool :

 git config --global merge.tool p4merge 

Si se mostró 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 para todo el sistema (no necesita derechos de administrador o elevación de UAC)
  • Aunque ~ debería expandirse al directory 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í
  • Incluso mejor habría sido aprovechar una variable de entorno (por ejemplo, $LOCALAPPDATA/Perforce/p4merge.exe ), git no parece estar expandiendo variables de entorno para las routes (si sabe cómo hacerlo funcionar, hágamelo saber o actualizar esta respuesta)

La configuration de mergetool.p4merge.cmd ya no funcionará porque Git ha comenzado a tratar de admitir p4merge, consulte libexec / git-core / git-mergetool–lib.so 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á.

Estoy usando Portable Git en WinXP (¡es una delicia!), Y necesitaba resolver un conflicto que surgió en la bifurcación. De todas las GUI que revisé, KDiff3 demostró ser la más transparente de usar.

Pero encontré las instrucciones que necesitaba para hacerlo funcionar 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 file .gitconfig :

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

¡Trabajando bien ahora!

Con 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 post de request para difftool:

 git config --global difftool.prompt false 

git mergetool es totalmente configurable, por lo que puedes elegir tu herramienta favorita.

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

En resumen, puede establecer un mergetool pnetworkingeterminado configurando la variable de configuration de usuario merge.tool .

Si la herramienta de fusión es una de las admitidas de forma nativa, solo tiene que establecer mergetool.<tool>.path en la ruta completa a la herramienta (reemplace <tool> por lo que ha configurado merge.tool to be.

De lo contrario, puede configurar mergetool.<tool>.cmd en un poco de shell para ser evaluado en time de ejecución con las variables de shell $BASE, $LOCAL, $REMOTE, $MERGED configuradas en los files apropiados. Tienes que ser un poco cuidadoso con el escape, ya sea que edites directamente un file de configuration o establezcas la variable con el command git config .

Algo así debería dar el sabor de lo que puedes 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 combinación favorita, es simplemente una cuestión de ejecutar git mergetool cada vez que tenga conflictos para resolver.

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

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 path. No es necesario configurar cmd o ruta.

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" 

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

Tuve que soltar el presupuesto extra 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' 

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`' 

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!

utilizo 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 directiva .gitconfig 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 las counts bash cuando el resultado de la diferencia en un file vacío y crea un nuevo file temporal en la location correcta.

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 los comentarios de Milan Gardian me fastidiaron las cosas.

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

 path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J" 

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

El ~ / winpath.sh es para convertir routes a Windows en msys y se toma de la pregunta de conversión de ruta de 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 "$@" 

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

Los siguientes commands en una window del símbolo del sistema actualizarán su .gitconfig para configurar el uso de GIT 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 file debe estar en su directory 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\" 

Para configurar p4merge, instalado utilizando choqueuetey en windows para fusionar y diff, mira aquí: https://gist.github.com/CamW/88e95ea8d9f0786d746a

Si tiene problemas para abrir p4merge desde SourceTree, busque su file de configuration local llamado config bajo MyRepo.git y elimine cualquier configuration de fusión. En mi caso, estaba intentando abrir Meld, que acabo de desinstalar