Git: How can I configure KDiff3 as a merge tool and diff tool?
Solution 1
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.
Solution 2
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
Solution 3
For Mac users
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
Solution 4
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.
Solution 5
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
.
Related videos on Youtube
![Jose Rodriguez](https://i.stack.imgur.com/wyWe7.png?s=256&g=1)
Jose Rodriguez
Passionate about technologies, good code, difficult problems and good solutions. Blog: Runtime Corner
Updated on March 06, 2022Comments
-
Jose Rodriguez over 2 years
Recently I was using GitExtension 2.46, but the Git version that has the same is 1.9.4.msysgit.2. Willing to use only Git commands, I uninstalled GitExtension and install the latest version available of Git and KDiff3.
When I make a merge and have conflicts, I run the following command:
git mergetool
Then I receive the message:
The merge tool kdiff3 is not available as 'kdiff3'.
I guess it must be by the KDiff3 path.
Environment
- OS: Windows 10
- Git 2.6.1.windows.1
- KDiff3 0.9.98 (64 bit)
Questions:
-
What do I have to configure in the .gitconfig file for the command
git mergetool
to open the KDiff3 GUI with the versions LOCAL, REMOTE, BASE and MERGED of conflicted file? -
How can I configure it to use it as a diff tool?
-
RBT about 6 yearsRelated post - How to configure a diff tool in Git in general.
-
VonC almost 3 yearsWith Git 2.33+ (Q3 2021),
git config --global merge.tool kdiff3
will be enough. See my updated answer below
-
David Torres over 7 yearsStill, why would I want git-difftool not to exit if kdiff3 fails?
-
Guillaume Raymond about 7 yearsFor me to have the diff tool recognized by Visual Studio 2015, I had to change this line
git config --global --add diff.guitool kdiff3
to this :git config --global --add diff.tool kdiff3
-
Igor Kustov about 7 years@Alex78191, my answer reflects the Joseph's answer and there you can find more details about this setting.
-
Matthew Flaschen almost 7 years@DavidTorres Probably because badly behaved Windows tools (that exit with non-zero codes on success) ruin it for everyone.
-
matt wilkie over 6 yearsAccording to the referenced docs setting trustExitCode to false is unnecessary, since the default is to ignore it anyway.
-
matt wilkie over 6 yearsIt took me a long time to get this right. 2 things led me astray: (1) The
.gitconfig
file I was editing was not the one being used. See stackoverflow.com/questions/2114111/… for identifying the one(s) being loaded. (2) Don't mix and matchcmd =
andpath =
in gitconfig, TL;DR: delete cmd and just use path -
Vivek over 6 yearsNow on git bash use .... git difftool <filename> or simple git difftool to run the diff gui kdiff3 you just set.
-
Thomas Weller over 6 yearsAFAIK,
--add
will add a second or third entry when invoked multiple times. That's hard to fix later, because it can't simply be removed with--remove
. Just setting a value without--add
should be ok. -
Thomas Weller about 5 yearsDon't use
--add
since that may result in 2 config entries if you run the command twice. It's a mess cleaning this up, because you can't delete a single entry any more. See git-scm.com/docs/git-config: "Multiple lines can be added to an option" -
Jose Rodriguez over 4 yearsGood point @ThomasWeller, the answer was updated to reflect your suggestion
-
trustory about 4 yearsIs there a way to default to KDiff3 when typing 'git diff'?
-
jjstcool about 3 yearsLol, I gave up on this one, but you made it work withing seconds. Big Thank You
-
Volodymyr Kotylo almost 3 yearsfor visual studio also add this:
[diff] tool = kdiff3