Add the kdiff3 installation directory to the Windows Path. Add TMP to the WSLENV Windows environment variable (WSLENV=TMP/up). The TMP dir will be used by git for temporary files, like previous revisions of files, so the path must be on the windows filesystem for this to work. Set TMPDIR to TMP in .
These sites were very helpful, almost, mergetool and difftool. I used the global configuration, but can be used by repository without problems. You just need to execute the following commands:
git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false
git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false
Note that the latest version kdiff3 moved the executable from the root of the application folder C:/Program Files/KDiff3 into the bin/ folder inside the application folder. If you're using an older version, remove "bin/" from the paths above.
The use of the trustExitCode
option depends on what you want to do when diff tool returns. From documentation:
git-difftool invokes a diff tool individually on each file. Errors reported by the diff tool are ignored by default. Use --trust-exit-code to make git-difftool exit when an invoked diff tool returns a non-zero exit code.
Just to extend the @Joseph's answer:
After applying these commands your global .gitconfig
file will have the following lines (to speed up the process you can just copy them in the file):
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/Program Files/KDiff3/kdiff3.exe
trustExitCode = false
[diff]
guitool = kdiff3
[difftool "kdiff3"]
path = C:/Program Files/KDiff3/kdiff3.exe
trustExitCode = false
Here is @Joseph's accepted answer, but with the default Mac install path location of kdiff3
(Note that you can copy and paste this and run it in one go)
git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add mergetool.kdiff3.trustExitCode false
git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
Well, the problem is that Git can't find KDiff3 in the %PATH%.
In a typical Unix installation all executables reside in several well-known locations (/bin/
, /usr/bin/
, /usr/local/bin/
, etc.), and one can invoke a program by simply typing its name in a shell processor (e.g. cmd.exe
:) ).
In Microsoft Windows, programs are usually installed in dedicated paths so you can't simply type kdiff3
in a cmd
session and get KDiff3 running.
The hard solution: you should tell Git where to find KDiff3 by specifying the full path to kdiff3.exe
. Unfortunately, Git doesn't like spaces in the path specification in its config, so the last time I needed this, I ended up with those ancient "C:\Progra~1...\kdiff3.exe" as if it was late 1990s :)
The simple solution: Edit your computer settings and include the directory with kdiff3.exe in %PATH%. Then test if you can invoke it from cmd.exe by its name and then run Git.
I needed to add the command line parameters or KDiff3 would only open without files and prompt me for base, local and remote. I used the version supplied with TortoiseHg.
Additionally, I needed to resort to the good old DOS 8.3 file names.
[merge]
tool = kdiff3
[mergetool "kdiff3"]
cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED
However, it works correctly now.
Update 2021:
With Git 2.33 (Q3 2021), on Windows, mergetool
has been taught to find kdiff3.exe
just like it finds winmerge.exe
.
git config --global merge.tool kdiff3
is enough.
See commit 47eb4c6 (07 Jun 2021) by Michael Schindler (michaelcompressconsult
).
(Merged by Junio C Hamano -- gitster
-- in commit b7bd70d, 08 Jul 2021)
mergetools/kdiff3
: make kdiff3 work on Windows tooSigned-off-by: Michael Schindler [email protected]
The native
kdiff3
mergetool
is not found bygit mergetool
(man) on Windows.
The message "The merge tool kdiff3 is not available as 'kdiff3'
" is displayed.Just like we translate the name of the binary and look for it on the search path for WinMerge, do the same for kdiff3 to find it.
2018:
To amend kris' answer, starting with Git 2.20 (Q4 2018), the proper command for git mergetool
will be
git config --global merge.guitool kdiff3
That is because "git mergetool
" learned to take the "--[no-]gui
" option, just like
"git difftool
" does.
See commit c217b93, commit 57ba181, commit 063f2bd (24 Oct 2018) by Denton Liu (Denton-L
).
(Merged by Junio C Hamano -- gitster
-- in commit 87c15d1, 30 Oct 2018)
mergetool
: accept-g/--[no-]gui
as argumentsIn line with how
difftool
accepts a-g/--[no-]gui
option, makemergetool
accept the same option in order to use themerge.guitool
variable to find the default mergetool instead ofmerge.tool
.
(When trying to find out how to use kdiff3 from WSL git I ended up here and got the final pieces, so I'll post my solution for anyone else also stumbling in here while trying to find that answer)
With Windows update 1903 it is a lot easier; just use wslpath and there is no need to share TMP from Windows to WSL since the Windows side now has access to the WSL filesystem via \wsl$:
[merge]
renormalize = true
guitool = kdiff3
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
# Unix style paths must be converted to windows path style
cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
trustExitCode = false
[mergetool]
keepBackup = false
prompt = false
[mergetool "kdiff3"]
path = kdiff3.exe
trustExitCode = false
Steps for using kdiff3 installed on Windows 10 as diff/merge tool for git in WSL:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
[merge]
renormalize = true
guitool = kdiff3
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
#path = kdiff3.exe
# Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
trustExitCode = false
[mergetool]
keepBackup = false
prompt = false
[mergetool "kdiff3"]
path = kdiff3.exe
trustExitCode = false
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With